成人免费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設(shè)計問題。

比如,我如果需要改變 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)對于不了解的同學(xué)來講,可能會很費勁,能否將這些細(xì)節(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; /* 疊加(默認(rèn)) */
mask-composite: subtract; /* 減去,排除掉上層的區(qū)域 */
mask-composite: intersect; /* 相交,只顯示重合的地方 */
mask-composite: exclude; /* 排除,只顯示不重合的地方 */

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

圖片

這個屬性的值(標(biāo)準(zhǔn)和非標(biāo)準(zhǔn))非常多,-webkit-mask-composite[5] 與標(biāo)準(zhǔn)下的值有所不同,屬性值非常多,如下(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; /*只顯示不重合的地方*/

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

CSS mask 實現(xiàn)鼠標(biāo)跟隨鏤空效果[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?中對應(yīng)的就是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?導(dǎo)致的,三個圖形,最后只顯示了三者重疊的區(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

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

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

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

圖片

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

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

圖片

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

圖片

五、總結(jié)和說明

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

  1. 整個實現(xiàn)其實用到了錐形漸變和徑向漸變。
  2. 正常思路是背景繪制出透明錐形漸變,然后通過 mask 遮罩裁剪出環(huán)形。
  3. 不過這種思路改顏色稍微麻煩一點,可以通過 CSS 變量傳遞,簡化代碼。
  4. 顏色在背景中不夠直觀,可以考慮將實現(xiàn)細(xì)節(jié)放到 mask 中。
  5. mask遮罩合成可以實現(xiàn)圖形的合成與裁剪,可以更靈活的布爾運算。
  6. 推薦一下我的組件庫 xy-ui,可以學(xué)到更多有趣的 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)鼠標(biāo)跟隨鏤空效果: https://juejin.cn/post/7033188994641100831#heading-7。

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

責(zé)任編輯:姜華 來源: 前端偵探
相關(guān)推薦

2022-01-13 07:04:54

CSS 技巧Loading 動畫

2023-06-27 09:33:15

Loading 動畫CSS

2022-01-28 09:01:49

架構(gòu)

2020-12-24 08:37:41

Css前端加載動畫

2022-06-29 21:22:49

CSS動感倒計時

2021-08-05 23:09:53

前端程序員CSS

2021-07-16 05:59:27

CSS 技巧帶圓角的三角形

2020-04-08 17:53:40

TypeScriptJavaScript代碼

2024-09-18 09:18:11

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動畫前端

2011-07-08 15:08:16

iPhone 圖片

2016-03-29 10:18:48

Android圖片代碼

2024-03-13 08:21:53

冒泡排序動畫

2023-04-23 09:01:43

CSS動畫合成

2023-04-24 09:23:31

CSS動畫合成

2022-09-15 10:30:06

CSS

2023-07-24 09:11:43

CSS滾動驅(qū)動動畫
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久不卡区| 天天影视综合 | 国产精品日韩欧美一区二区三区 | 日日操夜夜操天天操 | 96av麻豆蜜桃一区二区 | 国产精品美女久久久久 | 久久蜜桃资源一区二区老牛 | 精品乱人伦一区二区三区 | 91精产国品一二三区 | 成人午夜免费福利视频 | 日韩亚洲视频 | 欧美日韩高清免费 | 亚洲欧洲国产视频 | 成人免费视频网址 | 亚洲免费网站 | 亚洲视频区 | 四虎最新视频 | 亚洲另类春色偷拍在线观看 | 一区二区三区视频 | 久久一区二区三区四区 | 暖暖日本在线视频 | www.国产精| 久久新| 成人欧美一区二区三区黑人孕妇 | 欧美福利久久 | 国产区高清 | 欧美激情精品久久久久久变态 | 在线精品一区二区 | 欧美 日韩 国产 成人 | 国产成人一区二区三区久久久 | 日一区二区 | 国产精品一区二区三区在线 | 欧美videosex性极品hd | 日韩免费av| 成人精品一区二区三区中文字幕 | 久久综合成人精品亚洲另类欧美 | 一级片网站视频 | 精品国产一区二区在线 | 欧美一级黄视频 | 91精品国产高清一区二区三区 | 欧美中文字幕一区 |