成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

別用圖片了,CSS 遮罩合成實現(xiàn)帶圓角的環(huán)形 loading 動畫

開發(fā) 前端
今天來用 CSS 實現(xiàn)一個帶圓角的環(huán)形 loading 動畫,希望對你有所幫助。

今天來用 CSS 實現(xiàn)一個帶圓角的環(huán)形 loading 動畫,效果是這樣的

圖片

先不考慮動畫,其實就是這樣一個圖形

圖片

那么,如何來繪制呢?下面花兩分鐘一起看看吧。

一、CSS實現(xiàn)思路

首先,看到這環(huán)形逐漸消失的效果,也就是透明度漸變的效果,肯定要聯(lián)想到錐形漸變。

conic-gradient() - CSS:層疊樣式表 | MDN (mozilla.org)[1]

通過錐形漸變,可以很輕松的實現(xiàn)這樣一個效果,透明到純色的漸變。

loading{
background: conic-gradient(transparent 10%, royalblue 90%)
}

效果如下:

圖片

然后,整體是一個環(huán)形,可以通過徑向漸變配合mask遮罩實現(xiàn)。

radial-gradient() - CSS:層疊樣式表 | MDN (mozilla.org)[2]

mask - CSS: Cascading Style Sheets | MDN (mozilla.org)[3]

loading{
/*...*/
-webkit-mask: radial-gradient( closest-side circle, transparent 50%, red 51% 99%, transparent 100%);
}

原理是這樣的。

圖片

還有一個圓角,可以直接用徑向漸變實現(xiàn)。

loading{
background: radial-gradient( closest-side circle, royalblue 99%, transparent 100%) center top/25% 25% no-repeat,
conic-gradient(transparent 10%, royalblue 90%);;
}

其實就是兩個相同顏色的漸變疊加到一起形成的,如下:

圖片

所以完整代碼就是。

loading{
width: 200px;
height: 200px;
background:
radial-gradient( closest-side circle, royalblue 99%, transparent 100%) center top/25% 25% no-repeat,
conic-gradient(transparent 10%, royalblue 90%);
-webkit-mask: radial-gradient( closest-side circle, transparent 50%, red 51% 99%, transparent 100%);
}

二、更好地自定義顏色

上面的實現(xiàn)雖然很好的滿足了需求,但是,還是有些CSS設計問題。

比如,我如果需要改變 loading 的顏色,需要改變兩個地方。

圖片

很明顯,這樣的實現(xiàn)不太符合 DRY(Don't Repeat Yourself)原則。

有一個比較簡單思路可以用 CSS 變量來傳遞。

loading{
--color: royalblue;
background:
radial-gradient( closest-side circle, var(--color) 99%, transparent 100%) center top/25% 25% no-repeat,
conic-gradient(transparent 10%, var(--color) 90%);
-webkit-mask: radial-gradient( closest-side circle, transparent 50%, red 51% 99%, transparent 100%);
}

這樣每次都只需要改變一個變量就行了。

loading.red{
--color: red;
}

圖片

除了這種方式以外,其實還有一點需要考慮,為啥背景不能干凈一點、純粹一點呢?換個說法,現(xiàn)在的背景實現(xiàn)對于不了解的同學來講,可能會很費勁,能否將這些細節(jié)隱藏起來,更直觀地去自定義顏色呢?比如像這種方式。

loading.red{
background: red;
}

如果要實現(xiàn)這樣的效果,就需要將繪制部分全部在mask遮罩中完成,背景只是展示而已。

那么,如何通過mask遮罩實現(xiàn)這樣的圖形呢?

三、更直觀地去自定義顏色

mask?遮罩其實也和 CSS 背景差不多,只是多了一些圖形合成操作,其實就是布爾運算,也就是mask-composite。

mask-composite - CSS: Cascading Style Sheets | MDN (mozilla.org)[4]

/* Keyword values */
mask-composite: add; /* 疊加(默認) */
mask-composite: subtract; /* 減去,排除掉上層的區(qū)域 */
mask-composite: intersect; /* 相交,只顯示重合的地方 */
mask-composite: exclude; /* 排除,只顯示不重合的地方 */

相信在很多圖形設計軟件中都見到類似的操作(下面是 photoshop)。

圖片

這個屬性的值(標準和非標準)非常多,-webkit-mask-composite[5] 與標準下的值有所不同,屬性值非常多,如下(chorme 、safari 支持)。

-webkit-mask-composite: clear; /*清除,不顯示任何遮罩*/
-webkit-mask-composite: copy; /*只顯示上方遮罩,不顯示下方遮罩*/
-webkit-mask-composite: source-over; /*疊加,兩者都顯示*/
-webkit-mask-composite: source-in; /*只顯示重合的地方*/
-webkit-mask-composite: source-out; /*只顯示上方遮罩,重合的地方不顯示*/
-webkit-mask-composite: source-atop;
-webkit-mask-composite: destination-over; /*疊加,兩者都顯示*/
-webkit-mask-composite: destination-in; /*只顯示重合的地方*/
-webkit-mask-composite: destination-out;/*只顯示下方遮罩,重合的地方不顯示*/
-webkit-mask-composite: destination-atop;
-webkit-mask-composite: xor; /*只顯示不重合的地方*/

之前在這篇文章中有詳細介紹 mask-composite 的用法,有興趣的可以回顧一下。

CSS mask 實現(xiàn)鼠標跟隨鏤空效果[6]

回到這里,思考一下??,怎么來繪制這樣一個圖形?

圖片

形狀是一樣的,只是和前面的步驟稍微有些差異。

首先還是繪制環(huán)形漸變,可以先繪制錐形漸變和環(huán)形漸變,如下:

loading{
background: royalblue;
-webkit-mask:
radial-gradient( closest-side circle, transparent 49%, red 50% 99%, transparent 100%),
conic-gradient(transparent 10%, royalblue 90%);
}

但是這樣兩個漸變會疊加在一起。

圖片

其實我們需要是只顯示兩者重疊的部分,也就是交叉區(qū)域,這個特性在mask-composite?中對應的就是destination-in?或者source-in。

loading{
...
-webkit-mask-composite: source-in;
}

效果如下:

圖片

然后是那個圓角,和上面繪制一樣。

loading{
...
-webkit-mask:
radial-gradient( closest-side circle, royalblue 99%, transparent 100%) center top/25% 25% no-repeat,
radial-gradient( closest-side circle, transparent 49%, red 50% 99%, transparent 100%),
conic-gradient(transparent 10%, royalblue 90%)
;
-webkit-mask-composite: source-in;
}

如果直接這樣,會變成這樣。

圖片

其實這是因為source-in?導致的,三個圖形,最后只顯示了三者重疊的區(qū)域。但是我們現(xiàn)在需要的是最上面的圓角直接疊加就行了,不需要裁剪,可以用到source-over。

loading{
-webkit-mask-composite: source-over, source-in;
}

效果如下:

圖片

下面是完整代碼。

loading{
width: 200px;
height: 200px;
background: royalblue;
-webkit-mask:
radial-gradient( closest-side circle, royalblue 99%, transparent 100%) center top/25% 25% no-repeat,
radial-gradient( closest-side circle, transparent 49%, red 50% 99%, transparent 100%),
conic-gradient(transparent 10%, royalblue 90%);
-webkit-mask-composite: source-over, source-in;
}

如果要換顏色,直接更換背景就可以了,還可以是漸變。

loading{
background: conic-gradient(red, orange, red)
}

自定義顏色起來是不是更加直觀?

圖片

四、動畫和xy-ui

動畫很簡單,就是一個無限旋轉的線性動畫,這個沒什么好說的。

loading{
animation: rotate 1s linear infinite;
}
@keyframes rotate{
to{
transform: rotate(360deg);
}
}

這樣就實現(xiàn)了文章開頭效果。

圖片

關于線上 demo,這里安利一下我開發(fā)的xy-ui[7]組件庫(目前正在重構中...),里面 loading 組件就用到了這個實現(xiàn)。

https://xy-ui.codelabo.cn。

圖片

很多有趣的 CSS 小技巧都可以在這個組件庫中找到,歡迎 star & fork ????????????。

圖片

五、總結和說明

以上就是本文的全部內(nèi)容了,稍顯啰嗦,不過也是為了提供更多的思路,下面總結一下實現(xiàn)重點。

  1. 整個實現(xiàn)其實用到了錐形漸變和徑向漸變。
  2. 正常思路是背景繪制出透明錐形漸變,然后通過 mask 遮罩裁剪出環(huán)形。
  3. 不過這種思路改顏色稍微麻煩一點,可以通過 CSS 變量傳遞,簡化代碼。
  4. 顏色在背景中不夠直觀,可以考慮將實現(xiàn)細節(jié)放到 mask 中。
  5. mask遮罩合成可以實現(xiàn)圖形的合成與裁剪,可以更靈活的布爾運算。
  6. 推薦一下我的組件庫 xy-ui,可以學到更多有趣的 CSS 小技巧。

參考資料

[1]conic-gradient() - CSS:層疊樣式表 | MDN (mozilla.org): https://developer.mozilla.org/zh-CN/docs/Web/CSS/gradient/conic-gradient。

[2]radial-gradient() - CSS:層疊樣式表 | MDN (mozilla.org): https://developer.mozilla.org/zh-CN/docs/Web/CSS/gradient/radial-gradient。

[3]mask - CSS: Cascading Style Sheets | MDN (mozilla.org): https://developer.mozilla.org/en-US/docs/Web/CSS/mask。

[4]mask-composite - CSS: Cascading Style Sheets | MDN (mozilla.org): https://developer.mozilla.org/en-US/docs/Web/CSS/mask-composite。

[5]-webkit-mask-composite: https://link.juejin.cn?target=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2Fdocs%2FWeb%2FCSS%2F-webkit-mask-composite。

[6]CSS mask 實現(xiàn)鼠標跟隨鏤空效果: https://juejin.cn/post/7033188994641100831#heading-7。

[7]xy-ui: https://xy-ui.codelabo.cn/components/loading。

責任編輯:姜華 來源: 前端偵探
相關推薦

2023-06-27 09:33:15

Loading 動畫CSS

2022-01-13 07:04:54

CSS 技巧Loading 動畫

2022-01-28 09:01:49

架構

2020-12-24 08:37:41

Css前端加載動畫

2022-06-29 21:22:49

CSS動感倒計時

2021-08-05 23:09:53

前端程序員CSS

2024-09-18 09:18:11

2021-07-16 05:59:27

CSS 技巧帶圓角的三角形

2020-04-08 17:53:40

TypeScriptJavaScript代碼

2010-09-14 12:58:41

DIV+CSS圓角

2023-05-22 09:10:53

CSSloading 效

2023-10-08 20:32:59

CSS定義Loading

2017-04-27 14:05:59

CSS動畫前端

2023-04-23 09:01:43

CSS動畫合成

2023-04-24 09:23:31

CSS動畫合成

2024-03-13 08:21:53

冒泡排序動畫

2011-07-08 15:08:16

iPhone 圖片

2016-03-29 10:18:48

Android圖片代碼

2022-09-15 10:30:06

CSS

2023-07-24 09:11:43

CSS滾動驅動動畫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲久久一区 | 国内精品久久久久久 | 日韩精品一区二区三区 | 亚洲综合日韩精品欧美综合区 | 毛片综合| 男人影音 | 久久精品a级毛片 | 国内久久精品 | 日韩欧美一区二区三区四区 | 成人在线视频免费观看 | 亚洲日本中文字幕在线 | 久草视频2 | av影音在线 | 欧洲一区二区三区 | 精品国产1区2区3区 在线国产视频 | 色99视频| 国产精品不卡一区 | 国产精品99一区二区 | 欧美成视频 | a级黄色片视频 | 国产亚洲欧美在线 | 欧美日韩精品专区 | 国产性网| 91久久精品 | 亚洲精品免费视频 | 日韩欧美一区二区三区在线播放 | 成人av播放 | av中文字幕在线观看 | 中文一区二区 | 国产精品视频播放 | 影音先锋欧美资源 | 日韩精品一区二区三区中文在线 | 成人免费黄视频 | 日本人和亚洲人zjzjhd | 亚洲一一在线 | 精品国产一区二区三区久久久久久 | 久久久久久亚洲国产精品 | 中文字幕精品视频 | 亚洲女人天堂成人av在线 | 日韩中文在线视频 | 九九热精品视频 |