《Radial progress indicator using CSS》,該文核心是用純CSS來作一個環形的進度條。純css的意思就是連百分比這種數字,都是css生成的。文章做者採起的方式是生成100個span標籤,而後爲這100個標籤生成100段css代碼(用less生成,代碼量倒不大,只是生成的代碼量會很大),不知道有沒有更NB更省資源的css方案。
而個人需求很簡單,只須要學習怎麼畫環進進度條便可,進度掌控固然得由js來通知(好比下載進度,或者音樂播放進度)
對E文沒有恐懼感的話,建議直接看原做者的文,我這不是全文翻譯,而是本身的練習。css
注:爲了方便,我只對chrome寫了樣式,因此若是要運行我在jsfiddle裏面寫的例子,最好選webkit系的瀏覽器html
原做者講解得很詳細,咱們直接跳過吧,本身學習css3關於動畫的部分,總之,先成功一個例子再說:css3
<div class="radial-progress"> <div class="circle"> <div class="mask"> <div class="fill"></div> </div> </div> </div>
一個容器,一個一環形元素,再加一個mask,和fill,後面介紹web
爲了直接在jsfiddle上使用,我也用less吧,畢竟只要一句js聲明便可客戶端解析(插一句,工程項目建議用sass,由於有compass這個庫,大大減輕工做量)chrome
@size:120px; @bgcolor:#ddd; @bgcolor1:#cc7; @duration:1s; *{margin:0;padding:0;} .radial-progress{ margin:30px 50px; position: relative; .comm(){ width:@size; height:@size; position: absolute; top:0; left:0; border-radius: 50%; } .circle{ .comm; background: @bgcolor; .mask{ clip:rect(0,@size,@size,@size/2); .comm; } .fill{ background: @bgcolor1; clip:rect(0,@size/2,@size,0); transition:-webkit-transform @duration;.comm;} } }
$('head style[type="text/css"]').attr('type', 'text/less'); less.refreshStyles(); $(function(){ var m=$(".fill"),el=$("#deg").val(60),cur=$("#cur"); $("#start").click(function(){ var deg=el.val()||60; m.css("transform","rotate("+deg+"deg)"); cur.text(deg); el.val(Math.ceil(Math.random()*180)); }); $("#start").click(); });
上面的例子作完後,你應該發現這種轉法,最多隻能轉180度啊!好吧,因而咱們如法泡製,畫一個左邊的容j器和右邊的色塊:瀏覽器
<div class="radial-progress"> <div class="circle"> <div class="mask left"> <div class="fill"></div> </div> <div class="mask right"> <div class="fill"></div> </div> </div> </div>
@size:120px; @bgcolor:#ddd; @bgcolor1:#cc7; @duration:1s; *{margin:0;padding:0;} .radial-progress{margin:30px 50px; position: relative; .comm(){ width:@size;height:@size;position: absolute;top:0;left:0;border-radius: 50%; } .circle{ background: @bgcolor;.comm; .mask,.fill{.comm;} .fill{ background: @bgcolor1; transition:-webkit-transform @duration; } .left{ clip:rect(0,@size/2,@size,0); .fill{clip:rect(0,@size,@size,@size/2);} } .right{ clip:rect(0,@size,@size,@size/2); .fill{clip:rect(0,@size/2,@size,0);} } } }
js不變,直接運行http://jsfiddle.net/walker/smMzz/1/
顯然不是咱們要的效果sass
這時做者作了大膽的改動,別的進度條方案我還沒來得及研究,總之他這種是很是「彆扭」的,管它呢,先實現,後面的就都不貼代碼了,每一節後面都有我貼的jsfiddle的地址,能夠直接去看源碼。less
.full
這個層整個蒙板也旋轉一樣的角度!【注意】,此時兩個蒙板其實已經不重合了。這樣,原本兩個重疊的色塊,由於某一個容器繼續旋轉了一樣的角度,好比30度,視覺上就出現了60度範圍的色塊!至此已經大功告成,咱們中間再添加一個跟底色同樣的div把它變圓不就能夠了嗎?
對的,順便還加了點內陰影外陰影,這樣就有3D甜甜圈的效果了:http://jsfiddle.net/walker/smMzz/4/
若是要看代碼,就注意一下,這一步只是添加了一個.inset
和一個.shadow
,對應的css看源碼。dom
咱們這裏就不要3D了,簡化一下,把3D啊,陰影啊,都去掉:http://jsfiddle.net/walker/smMzz/5/函數
至此,我參考的老外原文已經和我下面的東西不沾邊了,感興趣他怎麼用純css來實現動態進度條的可繼續在原文觀看,我這裏基本上是js部分了,目的是讓進度條響應當前進度。
.inset
裏面,以百分號表示run
和process
方法,其中process
其實就是把前面onclick的內容給提取了出來,只須要傳入一個100之內的數字上面的例子是模擬下載或者上傳進度條。什麼意思?不論是上傳,仍是下載,進度只是一個「狀態」,你不能手動更改這個狀態,而播放器則不一樣,你更改這進度條的百分比,應該能影響歌曲或影片從哪一個時間點開始播放,所以,咱們須要響應點擊事件,同時還要會計算點擊位置的角度:
.circle
做爲點擊事件的響應對象,由於不受.mask
和.fill
元素是否可見的影響。並把其鼠標狀態改成手形.circle
上面,因此咱們又要把.mask
和.fill
這兩個層設爲鼠標穿透(用pointer-events:none
實現),以避免點擊不到.circle
元素