工地被强伦系列小说最新章节_丰满少妇被猛烈进入高清在线观看_九九精品99久久久香蕉_久色精品视频_男女互被舔69式免费视频_99精品久久免费看蜜臀剧情介绍_911精产国品一二三区在线观看 _边做饭边被躁高h小_国产gay男性玩奴sm_死神来了9在线观看完整版国语

3種純CSS實(shí)現(xiàn)中間鏤空的12色彩虹漸變圓環(huán)方法

2020-05-14

一、從SVG實(shí)現(xiàn)多彩圓環(huán)倒計(jì)時(shí)效果說(shuō)起
上周我做了個(gè)demo,使用SVG和stroke-dasharray和stroke-dashoffset特性實(shí)現(xiàn)了一個(gè)彩條圓環(huán)倒計(jì)時(shí)效果,大概長(zhǎng)下面這樣子:

2017-11-02_221910.png


彩條圓環(huán)

原理是使用兩個(gè)漸變半圓無(wú)縫疊加在一起。

使用SVG實(shí)現(xiàn)的優(yōu)點(diǎn)是兼容性非常好,IE9瀏覽器也是支持的。

不足在于學(xué)習(xí)成本比較高,相關(guān)的SVG代碼要想完整的手寫出來(lái),還是需要不少積累的。

于是我就琢磨有沒有更簡(jiǎn)單的方法實(shí)現(xiàn)類似的多彩圓環(huán)漸變效果,最好純CSS就能搞定。

絞盡腦汁想出了下面三種實(shí)現(xiàn)方法,為了盡可能驗(yàn)證方法的可行性,我把圓環(huán)的漸變顏色從3色變成了12色。

下面依次介紹這三種方法。

二、借助CSS3 conic-gradient錐形漸變實(shí)現(xiàn)12色漸變圓環(huán)
環(huán)形帶上的漸變效果,本質(zhì)上就是一種錐形漸變,因此,我們直接使用,CSS3 conic-gradient錐形漸變實(shí)現(xiàn)應(yīng)該是最簡(jiǎn)單最直接的方法。

如下HTML和CSS:

<div class="circle"></div>
.circle {
    width: 300px; height: 300px;
    background: conic-gradient(#9ED110, #50B517, #179067, #476EAF, #9f49ac, #CC42A2, #FF3BA7, #FF5800, #FF8100, #FEAC00, #FFCC00, #EDE604);
    border-radius: 50%;
}
此時(shí)的效果如下圖所示:

2017-11-08_221600.jpg


12色錐形漸變效果截圖

但是我們需要的效果不是圓餅,而是一個(gè)圓環(huán),也就是中間區(qū)域需要鏤空。

有一種比較巧妙的做法,就是搞一個(gè)跟背景色一樣半徑小一點(diǎn)的圓形餅覆蓋在中間,這樣視覺看上去就是一個(gè)圓環(huán),這也是不一個(gè)不錯(cuò)的方法。但是如果我們的背景是一個(gè)復(fù)雜的圖案,此時(shí),這種方法恐怕就不能適用。

你怎么需要找到一種中間區(qū)域是真實(shí)鏤空的方法,怎么處理呢?

我們可以借助CSS3遮罩mask屬性來(lái)實(shí)現(xiàn),CSS3 mask遮罩除了支持PNG圖片,SVG圖形,其還支持CSS3漸變背景圖。于是,我們只需要使用CSS3徑向漸變r(jià)adial-gradient語(yǔ)法生成一個(gè)中間透明,邊緣實(shí)色的圓環(huán)即可。

于是有(這里省略了mask屬性的webkit私有前綴):

.circle {
    width: 300px; height: 300px;
    background: conic-gradient(#9ED110, #50B517, #179067, #476EAF, #9f49ac, #CC42A2, #FF3BA7, #FF5800, #FF8100, #FEAC00, #FFCC00, #EDE604);
    border-radius: 50%;
    mask: radial-gradient(transparent 110px, #000 110px);
}
于是我們的12色圓環(huán)漸變效果就實(shí)現(xiàn)了:

2017-11-08_222606.png


錐形漸變下的12色彩虹圓環(huán)效果

再配合JS設(shè)置clip-path剪裁我們的圖形,就可以實(shí)現(xiàn)12色的彩虹圓環(huán)倒計(jì)時(shí)效果了。

眼見為實(shí),您可以狠狠地點(diǎn)擊這里:借助CSS3 mask遮罩和conic-gradient實(shí)現(xiàn)的多彩圓環(huán)demo

優(yōu)點(diǎn)和不足
這個(gè)方法看上去很簡(jiǎn)單,很完美,但是卻有個(gè)致命的缺陷,那就是兼容性問(wèn)題!

CSS3錐形漸變conic-gradient目前僅Chrome瀏覽器才支持,并且Chrome瀏覽器還是需要開啟實(shí)驗(yàn)功能選項(xiàng)才能支持!

錐形漸變?cè)愀獾募嫒菪詥?wèn)題

因此當(dāng)下此方法基本上沒有在實(shí)際項(xiàng)目中應(yīng)用的可能性,需要看看有沒有什么其他解決方案?

三、借助CSS3 linear-gradient線性漸變近似實(shí)現(xiàn)12色漸變圓環(huán)
雖然錐形漸變?yōu)g覽器的兼容性不怎么樣,但是線性漸變它兼容性很好啊,是不是可以李代桃僵呢?

和一開始SVG圓環(huán)原理類似:
把我們的圓環(huán)分成左半部分和右半部分,左半部分是一套線性漸變,右半部分是另外一套線性漸變,然后最底部的線性漸變顏色是一樣的,理論上在視覺上看起來(lái)就能夠形成一個(gè)完美的環(huán)。

如下HTML和CSS代碼:

<div class="circle">
    <div class="circle-left"></div>
    <div class="circle-right"></div>
</div>
.circle {
    width: 300px; height: 300px;
    border-radius: 50%;
    mask: radial-gradient(transparent 110px, #000 110px);
    overflow: hidden;
}
.circle-left {
    width: 50%; height: 100%;
    background: linear-gradient(to bottom, #EDE604, #FFCC00, #FEAC00, #FF8100, #FF5800, #FF3BA7, #CC42A2);
    float: left;
}
.circle-right {
    width: 50%; height: 100%;
    float: right;
    background: linear-gradient(to bottom, #9ED110, #50B517, #179067, #476EAF, #9f49ac, #CC42A2);
}
然而最后的效果卻是下面這樣:

2017-11-08_230302.png


兩個(gè)漸變無(wú)縫連接失敗示意

咦,奇怪,同樣的實(shí)現(xiàn)原理,為什么一開始的SVG實(shí)現(xiàn)沒有這樣的現(xiàn)象呢?

實(shí)際上,SVG的實(shí)現(xiàn)底部的連接也是不完美的,但是由于我們上面的這個(gè)圓環(huán)漸變顏色比較少,同時(shí)顏色比較接近,因此不仔細(xì)看,根本看不出來(lái),連接有問(wèn)題的。

但是這里的12色漸變就不一樣了,漸變顏色跨度明顯區(qū)分大,因此很明顯看出來(lái)接縫有問(wèn)題,那有沒有什么辦法可以解決這個(gè)問(wèn)題呢?

有!我想的辦法是,就是在下面接縫不完美的地方打一個(gè)小補(bǔ)丁,就像是我國(guó)橋梁建造接縫處重新澆筑一樣,于是HTML變成下面這樣,增加一個(gè).circle-bottom:

<div class="circle">
    <div class="circle-left"></div>
    <div class="circle-right"></div>
    <div class="circle-bottom"></div>
</div>
對(duì)應(yīng)的CSS如下:

.circle-bottom {
    position: absolute;
    height: 40px; width: 30px;
    bottom: 3px; left: 0; right: 0;
    margin: auto;
    /* 下面兩個(gè)聲明是補(bǔ)丁關(guān)鍵 */
    background: linear-gradient(to right, #DB3FA3, #C443A3);
    filter: blur(5px);
}
也就是接縫處搞一個(gè)小小的水平漸變,同時(shí)適當(dāng)高斯模糊,淡化邊界。然后肉眼所見的效果就變成下面這樣,幾乎看不出任何異常:

2017-11-08_231109.png


接縫處打完補(bǔ)丁之后的圓環(huán)效果

接下來(lái)就簡(jiǎn)單了,同樣地,JS設(shè)置圓環(huán)clip-path動(dòng)態(tài)剪裁,實(shí)現(xiàn)我們想要的倒計(jì)時(shí)效果。

眼見為實(shí),您可以狠狠的點(diǎn)擊這里:linear-gradient線性漸變實(shí)現(xiàn)的多彩圓環(huán)demo

優(yōu)點(diǎn)和不足
此方法的優(yōu)點(diǎn)在于兼容性足夠(僅IE不支持),在移動(dòng)端可以無(wú)障礙使用。

不足在于這個(gè)圓環(huán)的漸變并不是徑向發(fā)散的,而是自上而下的,和真正意義上的圓環(huán)漸變還是有些差異的。

那有沒有什么方法,既保證兼容性,同時(shí)漸變又是真正意義上的環(huán)形漸變呢?

四、借助CSS clip剪裁、transform旋轉(zhuǎn)和模糊濾鏡實(shí)現(xiàn)12色漸變圓環(huán)
此方法需要一定的理解成本,請(qǐng)容我慢慢道來(lái)。

1. 如何實(shí)現(xiàn)一個(gè)30°的扇形?
假設(shè)有如下HTML:

<div class="sector"></div>
則下面的CSS可生成一個(gè)30°的扇形:

.sector {
    width: 300px; height: 300px;
    position: absolute;
    clip: rect(0 300px 300px 150px);
    overflow: hidden;
}
.sector::after {
    content: '';
    width: 100%; height: 100%;
    background: currentColor;
    position: absolute;
    clip: rect(0 150px 300px 0);
    transform: rotate(30deg);
    border-radius: 50%;
}
實(shí)時(shí)效果如下:

QQ圖片20200514182333.png

原理如下:

外面容器原本是個(gè)正方形,但通過(guò)clip剪裁只顯示右半部分;
子元素同樣尺寸,但通過(guò)clip剪裁只顯示左半部分。然后通過(guò)適當(dāng)旋轉(zhuǎn)露出我們想要的扇形區(qū)域;
原理示意圖如下:

why-sector.png

30度扇形生成原理示意圖

2. 如何使用12個(gè)30°扇形鋪成一個(gè)圓
很簡(jiǎn)單,我們只要?jiǎng)?chuàng)新12個(gè)類似下面的HTML:

<div class="sector"></div>
然后每個(gè)扇形元素比前面一個(gè)多選轉(zhuǎn)30度就可以了,然后每一個(gè)扇形設(shè)置一個(gè)漸變顏色,CSS類似下面:

.sector:nth-of-type(1) {
    transform: rotate(0);
    color: #9ED110;   
}
/* 2-11 略 */
.sector:nth-of-type(12) {
    transform: rotate(330deg);
    color: #EDE604;   
}
我們就可以得到類似下圖的效果:

2017-11-08_235547.png

12色的漸變圓環(huán)效果

3. 如何模糊扇形色塊的邊界?
這個(gè)我們可以借助CSS3的filter濾鏡中的高斯模糊實(shí)現(xiàn),假設(shè)12個(gè)扇形元素全部都在一個(gè)類名為.sector-group的元素中,則:

.sector-group {
    filter: blur(15px);
}
效果如下圖:

2017-11-08_235939.jpg


高斯模糊后的效果

然而高斯模糊的邊緣似乎有些問(wèn)題,不是很清晰,怎么辦?

4. 模糊的圓環(huán)邊緣如何處理?
其實(shí)很簡(jiǎn)單,外部容器尺寸限制,里面模糊元素適當(dāng)transform比例放大就可以了,例如:

.circle {
    width: 300px; height: 300px;
    border-radius: 50%;
    position: relative;
    overflow: hidden;
}
.sector-group {
    filter: blur(15px);
    transform: scale(1.2);
}
此時(shí)效果為:

2017-11-09_000333.jpg

邊緣輪廓清晰的圓環(huán)圖

5. 使用mask遮罩是顯示邊緣圓環(huán)
CSS代碼示意如下(實(shí)際開發(fā)webkit前綴不可省略)

.circle {
    width: 300px; height: 300px;
    border-radius: 50%;
    position: relative;
    overflow: hidden;
    mask: radial-gradient(transparent 110px, #000 110px);
}
.sector-group {
    filter: blur(15px);
    transform: scale(1.2);
}
最終,我們的12色彩虹漸變圓環(huán)效果即達(dá)成,如下Firefox瀏覽器下截圖:

2017-11-09_000736.jpg


Firefox瀏覽器下的彩虹圓環(huán)效果截圖

接下來(lái)就簡(jiǎn)單了,同樣地,JS設(shè)置圓環(huán)clip-path動(dòng)態(tài)剪裁,實(shí)現(xiàn)我們想要的倒計(jì)時(shí)效果。

眼見為實(shí),您可以狠狠的點(diǎn)擊這里:借助CSS3 filter模糊和clip實(shí)現(xiàn)的多彩圓環(huán)demo

優(yōu)點(diǎn)和不足
優(yōu)點(diǎn)在于真正意義上的錐形漸變,同時(shí)12種漸變顏色頭首尾如貪吃蛇一樣,完全融為了一體,更有視覺優(yōu)勢(shì)。

不足之處在于HTML和CSS代碼稍微多了點(diǎn)。

四、結(jié)束語(yǔ)
嚴(yán)格來(lái)講,本文一共介紹了四種彩色圓環(huán)漸變效果的實(shí)現(xiàn),可以說(shuō)各有優(yōu)缺點(diǎn),大家可以根據(jù)自己項(xiàng)目情況,選擇合適的方法實(shí)現(xiàn)。

然而一個(gè)人的積累總是有限,而創(chuàng)意總是無(wú)限的,因此一定還有其他更好更妙更簡(jiǎn)單的實(shí)現(xiàn),歡迎分享歡迎指教!

當(dāng)然彩色漸變圓環(huán)效果不一定是用在倒計(jì)時(shí)上,例如下圖這種loading效果(下圖是圖片實(shí)現(xiàn)的)實(shí)際上也可以完全通過(guò)CSS實(shí)現(xiàn)了,比較推薦的做法是使用左右半?yún)^(qū)的線性漸變加遮罩(在retina屏幕下效果真的贊),具體代碼就不展示了,大家可以自己作為課后作業(yè)實(shí)踐實(shí)踐。

loading_blue.png

以上就是本文的全部?jī)?nèi)容,內(nèi)容略多,感謝一直閱讀到此處!

責(zé)任編輯:中山網(wǎng)站建設(shè)
 【網(wǎng)訊網(wǎng)絡(luò)】國(guó)家高新技術(shù)企業(yè)》十一年專注軟件開發(fā),網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),APP開發(fā),小程序,微信公眾號(hào)開發(fā),定制各類企業(yè)管理軟件(OA、CRM、ERP、OMS訂單管理系統(tǒng)、WMS進(jìn)銷存管理軟件等)!服務(wù)熱線:0760-88610046、13924923903,http://m.denorpool.com

您的項(xiàng)目需求咨詢熱線:0760-88610046(國(guó)家高新技術(shù)企業(yè))

*請(qǐng)認(rèn)真填寫需求,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。