摘要:一實現原理首先,我們來一個圓黑色。我們希望的是,繼續旋轉被黑色遮住。。。二來,萬一項目中不需要使用呢,以后還得實現。
在寫這篇文章之前,筆者查看了多篇博客,無奈前輩大多只是貼了代碼,沒有清晰明了的注釋,所以容易讓新人看得云里霧里。這里,筆者在弄明白原理后,對代碼進行了優化,決定寫(總結)一篇清晰、明了的圓形進度條的實現,以便后人能快速搞懂。
一、實現原理首先,我們來一個圓(黑色)。
接著,再來兩個半圓,將黑色的圓遮住。(為了演示,左右兩側顏色不一樣)
這時候,我們順時針旋轉右側藍色的半圓,下面的黑色圓就會暴露出來,比如我們旋轉45度(12.5%),效果出來了。
如果我們將藍色的右半圓同樣設置成灰色,看效果,一個12.5%的餅圖就出來了!
OK,我們再旋轉更大的度數試試,比如40%(144度),50%(180度),60%(216度)如下圖。
我們發現,旋轉180度之后右半圓與左半圓重合了,如果再旋轉,就會在右上角冒出來,顯然不是我們想要的。
我們希望的是,繼續旋轉被黑色遮住。。。嗯。。。怎么做呢?
我們將右側的圓回歸原位,把它刷成黑色(和底色一樣),然后旋轉左邊的半圓(它在右側半圓的更底層),這樣,它就會被右側半圓遮住了。好的,廢話不多說,我們將左側的半圓順時針旋轉45度,效果出來了。可以想象,繼續旋轉,180度的時候,就完全被右側半圓遮住,而左側底色全部暴露,這樣100%顯示出來了。
最后,加上一個白色的小圓,放在正中間就行了。
好的,到這里,我們已經明白如何實現的了。
二、代碼實現html部分
css部分
/*支持IE9及以上*/ .circle-bar { font-size:200px; width: 1em; height: 1em; position: relative; background-color: #333; } .circle-bar-left,.circle-bar-right { width: 1em; height: 1em; background-color: #eee; } /* 這里采用clip剪切了圓,實現左右兩個半圓,右半圓在后面,因此在更上一層, clip的用法參考:http://www.w3school.com.cn/cssref/pr_pos_clip.asp */ .circle-bar-right { clip:rect(0,auto,auto,.5em); } .circle-bar-left { clip:rect(0,.5em,auto,0); } .mask { width: 0.8em; height: 0.8em; background-color: #fff;text-align: center;line-height: 0.2em; color:rgba(0,0,0,0.5); } .mask :first-child { font-size: 0.3em; height: 0.8em; line-height: 0.8em; display: block; } /*所有的后代都水平垂直居中,這樣就是同心圓了*/ .circle-bar * { position: absolute; top:0; right:0; bottom:0; left:0; margin:auto; } /*自身以及子元素都是圓*/ .circle-bar, .circle-bar > * { border-radius: 50%; }
JavaScript實現
//反正CSS3中的border-radius屬性IE8是不支持了,所以這里就用新方法吧getElementsByClassName()走起 window.onload = function(){ var circleBar = document.getElementsByClassName("circle-bar")[0]; var percent = parseInt(circleBar.getElementsByClassName("percent")[0].firstChild.nodeValue); var color = circleBar.css("background-color"); var left_circle = circleBar.getElementsByClassName("circle-bar-left")[0]; var right_circle = circleBar.getElementsByClassName("circle-bar-right")[0]; if( percent <= 50 ) { var rotate = "rotate("+(percent*3.6)+"deg)"; right_circle.css3("transform",rotate); }else { var rotate = "rotate("+((percent-50)*3.6)+"deg)"; right_circle.css ("background-color",color);//背景色設置為進度條的顏色 right_circle.css3("transform","rotate(0deg)");//右側不旋轉 left_circle.css3 ("transform",rotate);//左側旋轉 } } //封裝了css3函數,主要是懶得重復書寫代碼,既然寫了css3函數,順便寫個css吧,統一樣式,好看一些 Element.prototype.css = function(property,value){ if ( value ) { //CSS中像background-color這樣的屬性,‘-’在JavaScript中不兼容,需要設置成駝峰格式 var index = property.indexOf("-"); if( index != -1 ) { var char = property.charAt(index+1).toUpperCase(); property.replace(/(-*){1}/,char); } this.style[property] = value; }else{ //getPropertyValue()方法參數類似background-color寫法,所以不要轉駝峰格式 return window.getComputedStyle(this).getPropertyValue(property); } } //封裝一個css3函數,用來快速設置css3屬性 Element.prototype.css3 = function(property,value){ if( value ){ property = capitalize(property.toLowerCase()); this.style["webkit"+property] = value; this.style["Moz"+property] = value; this.style["ms"+property] = value; this.style["O"+property] = value; this.style[property.toLowerCase()] = value; }else{ return window.getComputedStyle(this).getPropertyValue( ("webkit"+property)||("Moz"+property)||("ms"+property)||("O"+property)||property); //老實說,我不知道為什么要把不帶瀏覽器標記的放在最后,既然都這么用,我也這么做吧。不過這樣對現代瀏覽器來說可能并不好,判斷次數變多了 } //首字母大寫 function capitalize(word){ return word.charAt(0).toUpperCase() + word.slice(1); } }
jQuery實現
$(function(){ var percent = parseInt($(".mask :first-child").text()); var baseColor = $(".circle-bar").css("background-color"); if( percent<=50 ){ $(".circle-bar-right").css("transform","rotate("+(percent*3.6)+"deg)"); }else { $(".circle-bar-right").css({ "transform":"rotate(0deg)", "background-color":baseColor }); $(".circle-bar-left").css("transform","rotate("+((percent-50)*3.6)+"deg)"); } })
jQuery這么簡單好用,為什么還要寫JavaScript?
一來,學習JavaScript的使用,畢竟有些方法可能是不太熟悉的,多查查文檔,混個眼熟。
二來,萬一項目中不需要使用jQuery呢,以后還得實現。
在規定圓的大小的時候,使用了font-size屬性,而長度大小則基于font-size,也就是em為單位,這樣有一個好處,只要修改font-size的值,就可以改變圓的大小了,非常方便。
另外,寫css的時候,盡可能將相同功能的代碼提取出來,將某個功能寫在一個{}中,起一個好名字,以后方便復用,bootstrap就是這么玩的,簡潔、易讀,通過classname基本就能知道標簽有哪些特性了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/112950.html
摘要:一實現原理首先,我們來一個圓黑色。我們希望的是,繼續旋轉被黑色遮住。。。二來,萬一項目中不需要使用呢,以后還得實現。 在寫這篇文章之前,筆者查看了多篇博客,無奈前輩大多只是貼了代碼,沒有清晰明了的注釋,所以容易讓新人看得云里霧里。這里,筆者在弄明白原理后,對代碼進行了優化,決定寫(總結)一篇清晰、明了的圓形進度條的實現,以便后人能快速搞懂。 一、實現原理 首先,我們來一個圓(黑色)。接...
摘要:在開發微信小程序的時候,遇到圓形進度條的需求。但使用和實現進度條就很容易的避免了這方面的問題。如下圖最下面的圓形是進度條的背景,在上面有和兩個長方形,用來覆蓋不要顯示的進度條。在兩個長方形的里面分別有一個半圓形用來顯示進度。 在開發微信小程序的時候,遇到圓形進度條的需求。使用canvas繪圖比較麻煩: 1、為了實現在不同屏幕上面的適配,必須動態的計算進度條的大小; 2、在小程序...
摘要:在開發微信小程序的時候,遇到圓形進度條的需求。但使用和實現進度條就很容易的避免了這方面的問題。如下圖最下面的圓形是進度條的背景,在上面有和兩個長方形,用來覆蓋不要顯示的進度條。在兩個長方形的里面分別有一個半圓形用來顯示進度。 在開發微信小程序的時候,遇到圓形進度條的需求。使用canvas繪圖比較麻煩: 1、為了實現在不同屏幕上面的適配,必須動態的計算進度條的大小; 2、在小程序...
摘要:項目簡介本組件是下的圓形進度條動畫組件自由可定制,幾乎全部參數均可設置源碼簡單清晰面向人群急于使用圓形進度條動畫組件的同學。由于動畫關鍵幀的定義需要根據外部傳入的參數決定,不能預先寫死。所以通過生成節點的方式插入關鍵幀。 項目簡介 本組件是vue下的圓形進度條動畫組件 自由可定制,幾乎全部參數均可設置 源碼簡單清晰showImg(https://segmentfault.com/im...
摘要:整體思路是通過裁切產生兩個半圓展示出靜態的進度條,而后通過旋轉角度的變化產生動態效果。而藍色部分元素的顏色,是我們還未到達的進度。演示勤快的我去里寫了一下這個是的實現這個是的實現環形進度條。參考文章利用和實現環形進度條 整體思路是:通過裁切(clip)產生兩個半圓展示出靜態的進度條,而后通過旋轉(rotate)角度的變化產生動態效果。 先來回顧兩個基礎知識點 (1)css的一個不常見的...
閱讀 3289·2023-04-26 02:40
閱讀 4638·2021-09-22 15:22
閱讀 1573·2021-09-22 10:02
閱讀 3474·2021-08-11 10:23
閱讀 1388·2019-08-30 15:55
閱讀 2487·2019-08-30 12:48
閱讀 584·2019-08-30 11:04
閱讀 697·2019-08-29 16:29