使用canvas、SVG貌虾、css+js實(shí)現(xiàn)環(huán)形進(jìn)度條

1吞加、css+js
思路:
1、將環(huán)形的圓看成兩個(gè)半圓尽狠;
2衔憨、0-50的時(shí)候,視覺(jué)上是右半圓開始展示進(jìn)度條袄膏,但是在實(shí)現(xiàn)上是左半圓開始以右順時(shí)針旋轉(zhuǎn)践图;
3、50-100的時(shí)候沉馆,視覺(jué)上是左半圓開始展示進(jìn)度條码党,但是實(shí)現(xiàn)上是右半圓開始向左旋轉(zhuǎn)
4德崭、開始時(shí),右半圓肯定是不顯示的揖盘,只有在50-100時(shí)才顯示出來(lái)
5眉厨、開始時(shí),左半圓肯定要展示的兽狭,不然旋轉(zhuǎn)也看不出效果憾股,但是這樣左邊的旋轉(zhuǎn)就能看出來(lái),所以要一個(gè)遮罩將左邊遮擋住
代碼如下:

<!DOCTYPE html>
<html>
 <head>
     <meta charset="UTF-8">
     <title></title>
     <style>
         #start{
             height: 200px;
             width: 200px;
             margin: auto auto;
             background-color: antiquewhite;
             -webkit-touch-callout:none;
             -webkit-user-select:none;
             -khtml-user-select:none;
             -moz-user-select:none;
             -ms-user-select:none;
             user-select:none;
         }
         .circle{
             height: 200px;
             width: 200px;
             position: relative;
         }
         .circle .left ,
         .circle .right,
         .circle .mask{
             position: absolute;
             left: 0;
             top: 0;
             height: 100%;
             width: 100%;
             box-sizing: border-box;
             /*將整個(gè)矩形切成半矩形*/
             clip: rect(0,100px,200px,0);
             background-color: #fff;
         }
         .circle .left ,
         .circle .right{
             border:10px solid RED;
             border-radius: 50%;
         }
         .circle .right{
             /*將應(yīng)該在右側(cè)的半圓旋轉(zhuǎn)到右邊箕慧,并且將其隱藏*/
             opacity: 0;
             transform: rotate(180deg);
         }
         .trans-rotate{
             -webkit-transition: transform .1s ease-in-out;
             -moz-transition: transform .1s ease-in-out;
             -ms-transition: transform .1s ease-in-out;
             -o-transition: transform .1s ease-in-out;
             transition: transform .1s ease-in-out;
         }
     </style>
 </head>
 <body>
     <button id="start"></button>
     <div class="circle">
         <!--左半圓-->
         <div id="left" class="left trans-rotate"></div>
         <!--右半圓-->
         <div id="right" class="right trans-rotate"></div>
         <!--在前面半部分時(shí)服球,左半圓會(huì)開始向右邊旋轉(zhuǎn),需要用這個(gè)遮擋住左邊效果-->
         <div id="mask" class="mask"></div>
     </div>
     <script type="text/javascript" src="js/jquery-1.7.1.js"></script>
     <script type="text/javascript">
         var left = document.getElementById("left");
         var right = document.getElementById("right");
         var mask = document.getElementById("mask");
         var circleInter;
         var rangeValue=0;
         $(function(){
             $("#start").click(function(){
                 circleInter=setInterval(function(){
                     rangeValue=rangeValue+5;//數(shù)字越大進(jìn)度進(jìn)展的越快
                     if(rangeValue<=50){
                         //左半圓開始向右旋轉(zhuǎn)销钝,有進(jìn)度條開始的視覺(jué)效果
                         left.style.webkitTransform="rotate("+3.6*rangeValue+"deg)";
                         //遮罩展示有咨,將左邊遮擋住,不讓用戶看到左邊旋轉(zhuǎn)的效果
                         mask.style.opacity="1";
                     }else if(rangeValue<=100){
                         right.style.opacity="1";
                         //左右半圓開始向左旋轉(zhuǎn)蒸健,進(jìn)度條后半部分
                         right.style.webkitTransform="rotate("+3.6*rangeValue+"deg)";
                         //將遮罩去掉座享,不去掉圓旋轉(zhuǎn)到右邊也被遮擋了,會(huì)看不到效果似忧;
                         mask.style.opacity="0";
                     }else{
                         clearInterval(circleInter);
                     }
                 },100);
             })
         });
     </script>
 </body>
</html>

效果展示:(gif出來(lái)的有點(diǎn)停頓渣叛,真實(shí)的還是挺流暢的,哈哈)


IMG_0751.GIF
  1. svg
    使用svg來(lái)繪制這種二維圖形真的很方便盯捌;
    思路很簡(jiǎn)單:使用svg的circle淳衙,然后動(dòng)態(tài)修改circle的stroke-dashoffset;進(jìn)度條就看成circle的stroke饺著;
    代碼如下:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            #start{
                height: 200px;
                width: 200px;
                margin: auto auto;
                background-color: antiquewhite;
                -webkit-touch-callout:none;
                -webkit-user-select:none;
                -khtml-user-select:none;
                -moz-user-select:none;
                -ms-user-select:none;
                user-select:none;
            }
            #circleSvg{
                width: 200px;
                height: 200px;
                stroke-dasharray: 255%;
                stroke-dashoffset: 255%;
                stroke: red;
                fill: none;
                -webkit-transform: rotate(-90deg);
                -moz-transform: rotate(-90deg);
                -ms-transform: rotate(-90deg);
                -o-transform: rotate(-90deg);
                transform: rotate(-90deg);
            }
        </style>
    </head>
    <body>
        <button id="start">svg</button>
        <svg id="circleSvg">
            <!--cx=圓心橫坐標(biāo)   cy=圓心縱坐標(biāo)  r=半徑   stroke-width=邊框的寬度-->
            <circle id="circle" cx="50%" cy="50%" r="40%" stroke-width="10%"></circle>
        </svg>
        <script type="text/javascript" src="js/jquery-1.7.1.js"></script>
        <script type="text/javascript">
            var circle = document.getElementById("circle");
            var circleInter;
            var rangeValue=0; 
            $(function(){
                $("#start").click(function(){
                    circleInter=setInterval(function(){
                        rangeValue=rangeValue+5;//數(shù)字越大進(jìn)度進(jìn)展的越快
                        if(rangeValue<=255){
                            circle.setAttribute("stroke-dashoffset",255-rangeValue+"%");
                        }else{
                            clearInterval(circleInter);
                        }
                    },100);
                })
            });
        </script>
    </body>
</html>

展示效果和上面css+js完成的基本一樣箫攀,就不再去弄gif了,偷個(gè)懶

3.canvas
canvas畫圖很方便啦幼衰,直接上代碼

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            #start{
                height: 200px;
                width: 200px;
                margin: auto auto;
                background-color: antiquewhite;
                -webkit-touch-callout:none;
                -webkit-user-select:none;
                -khtml-user-select:none;
                -moz-user-select:none;
                -ms-user-select:none;
                user-select:none;
            }
            
        </style>
    </head>
    <body>
        <button id="start">svg</button>
        <canvas id="canvas" width="200" height="200"></canvas>
        <script type="text/javascript" src="js/jquery-1.7.1.js"></script>
        <script type="text/javascript">
            var canvas = document.getElementById("canvas");
            var rangeValue=0; 
            var w = canvas.width;
            var h = canvas.height;
            var con = canvas.getContext("2d");
            var val = {
                x:w/2,
                y:w/2,
                r:w/2-10,
                beginAngle:-Math.PI/2,
                endAngle:0
            };
            con.lineWidth = 10;
            con.strokeStyle = "red";
            $(function(){
                $("#start").click(function(){
                    circleInter=setInterval(function(){
                        rangeValue = rangeValue+5;
                        if(rangeValue<=360){
                            draw();
                        }else{
                            clearInterval(circleInter);
                        }
                    },100);
                })
            });
            function draw(){
                con.restore();
                con.clearRect(0,0,w,h);
                var rangValue = Number(rangeValue);
                val.endAngle = val.beginAngle+(rangValue/360)*2*Math.PI;
                con.beginPath();
                con.arc(val.x,val.y,val.r,val.beginAngle,val.endAngle,false);
                con.stroke();
                con.save();
            }
        </script>
    </body>
</html>

其實(shí)這個(gè)是很多動(dòng)圖的原型靴跛,比如長(zhǎng)按錄音時(shí)外圍的進(jìn)度條,比如時(shí)鐘等等的基礎(chǔ)都是這個(gè)渡嚣,理解了這個(gè)原理很多東西做起來(lái)都很順手了梢睛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市识椰,隨后出現(xiàn)的幾起案子绝葡,更是在濱河造成了極大的恐慌,老刑警劉巖腹鹉,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藏畅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡种蘸,警方通過(guò)查閱死者的電腦和手機(jī)墓赴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門竞膳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人诫硕,你說(shuō)我怎么就攤上這事坦辟。” “怎么了章办?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵锉走,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我藕届,道長(zhǎng)挪蹭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任休偶,我火速辦了婚禮梁厉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踏兜。我一直安慰自己词顾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布碱妆。 她就那樣靜靜地躺著肉盹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疹尾。 梳的紋絲不亂的頭發(fā)上上忍,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音纳本,去河邊找鬼窍蓝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛繁成,可吹牛的內(nèi)容都是我干的它抱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼朴艰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了混移?” 一聲冷哼從身側(cè)響起祠墅,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎歌径,沒(méi)想到半個(gè)月后毁嗦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡回铛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年狗准,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了克锣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腔长,死狀恐怖袭祟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捞附,我是刑警寧澤巾乳,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站鸟召,受9級(jí)特大地震影響胆绊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜欧募,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一压状、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跟继,春花似錦种冬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至剩盒,卻和暖如春谷婆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辽聊。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工纪挎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跟匆。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓异袄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親玛臂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烤蜕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_x閱讀 15,968評(píng)論 3 119
  • 作者/胄寧 “當(dāng)我意識(shí)到你我再也不會(huì)相見(jiàn)的那一刻迹冤,我的血凝住了讽营。好像如果身體不動(dòng)一下的話,就會(huì)這樣死去泡徙〕髋簦” 這是我...
    胄寧閱讀 1,395評(píng)論 10 7
  • 裂變營(yíng)銷:最低成本的獲客之道 1.社交流量:移動(dòng)互聯(lián)網(wǎng)上最重要的免費(fèi)流量 移動(dòng)互聯(lián)網(wǎng)時(shí)代最貴的是什么?是流量嗎?是...
    飯局局長(zhǎng)閱讀 174評(píng)論 0 0
  • 又是新的星期五莉兰,又要上餐飲課了挑围。這是第三次餐飲課,第一次是制作檸檬水糖荒,第二次是做牙簽肉杉辙,這次要做什么...
    超帥的張軒睿閱讀 220評(píng)論 0 0
  • 世界上最遙遠(yuǎn)的距離莫過(guò)于我們坐在一起奏瞬,你卻在玩手機(jī)。 小時(shí)候泉孩,除夕夜父母?jìng)兛偸蔷墼谝黄鸫蚺婆鸲耍覀冊(cè)谝慌钥创和硪嗷?..
    14初識(shí)閱讀 213評(píng)論 0 2