2020-05-18
一、不是所有CSS屬性都能動(dòng)畫
經(jīng)常和CSS打交道的人肯定都知道,不是所有的CSS屬性都能使用animation屬性實(shí)現(xiàn)動(dòng)畫效果,最典型的例子就是background-image漸變。
一個(gè)典型的線性漸變是由角度,顏色和位置組成,例如:
.gradient {
background-image: linear-gradient(45deg, red 50%, blue 50%);
}
其中無論是角度(45deg),顏色(red, blue)還是位置(50%)單獨(dú)作為屬性者都是可以動(dòng)畫過渡的,但是合在一起作為漸變背景的時(shí)候是無法產(chǎn)生過渡效果的,因?yàn)閎ackground-image的語義是圖片。
那有沒有什么辦法可以讓背景圖片也能實(shí)現(xiàn)動(dòng)畫過渡呢,至少CSS漸變可以實(shí)現(xiàn)?
經(jīng)過我的研究和探索,找到了一種解決方案,雖稱不上百分百完美,但足夠應(yīng)用于項(xiàng)目中,能讓以前很多不支持CSS動(dòng)畫的屬性,也支持原生的動(dòng)畫效果。
二、變量種子計(jì)數(shù)器
Chrome等瀏覽器(不包括Safari)有個(gè)特性,就是當(dāng)我們使用@keyframes定義關(guān)鍵幀的時(shí)候,關(guān)鍵幀里面設(shè)置的屬性也是會(huì)運(yùn)行的(幾年前改變的,原先不是),典型的案例就是content屬性與內(nèi)容變化。
例如實(shí)現(xiàn)一個(gè)“正在加載中…”打點(diǎn)效果可以下面CSS和HTML:
dot::before {
content: '...';
position: absolute;
animation: dot 3s infinite step-start both;
}
dot:after {
content: '...';
color: transparent;
}
@keyframes dot {
33% { content: '.'; }
66% { content: '..'; }
}
<button>正在加載中<dot></dot></button>
實(shí)時(shí)效果如下:
正在加載中
根據(jù)我的測(cè)試發(fā)現(xiàn),不僅普通的CSS屬性可以在CSS動(dòng)畫關(guān)鍵幀中運(yùn)行,CSS自定義屬性(CSS變量)也可以在CSS動(dòng)畫關(guān)鍵幀中運(yùn)行。例如:
@keyframes var {
33% { --someVar: 33%; }
66% { --someVar: 66%; }
}
這種特性就非常有啟發(fā),如果我們某一個(gè)CSS屬性值是基于這個(gè)--someVar變量構(gòu)成的,那豈不是就算這個(gè)屬性值不支持CSS動(dòng)畫,我只要讓每一個(gè)百分比值的間隙足夠的小,不也能夠?qū)崿F(xiàn)一個(gè)平滑的動(dòng)畫效果?
具體做法就是,把CSS動(dòng)畫關(guān)鍵幀從0%-100%分成101份,然后每一份從0開始依次計(jì)數(shù),就像是個(gè)計(jì)數(shù)器一樣,然后把這個(gè)計(jì)數(shù)器分配給一個(gè)特定的CSS變量。最終我們可以得到一個(gè)如下所示的CSS動(dòng)畫“變量種子計(jì)數(shù)器”。
@keyframes seed {
0%{--seed:0}1%{--seed:1}2%{--seed:2}3%{--seed:3}4%{--seed:4}5%{--seed:5}6%{--seed:6}7%{--seed:7}8%{--seed:8}9%{--seed:9}10%{--seed:10}11%{--seed:11}12%{--seed:12}13%{--seed:13}14%{--seed:14}15%{--seed:15}16%{--seed:16}17%{--seed:17}18%{--seed:18}19%{--seed:19}20%{--seed:20}21%{--seed:21}22%{--seed:22}23%{--seed:23}24%{--seed:24}25%{--seed:25}26%{--seed:26}27%{--seed:27}28%{--seed:28}29%{--seed:29}30%{--seed:30}31%{--seed:31}32%{--seed:32}33%{--seed:33}34%{--seed:34}35%{--seed:35}36%{--seed:36}37%{--seed:37}38%{--seed:38}39%{--seed:39}40%{--seed:40}41%{--seed:41}42%{--seed:42}43%{--seed:43}44%{--seed:44}45%{--seed:45}46%{--seed:46}47%{--seed:47}48%{--seed:48}49%{--seed:49}50%{--seed:50}51%{--seed:51}52%{--seed:52}53%{--seed:53}54%{--seed:54}55%{--seed:55}56%{--seed:56}57%{--seed:57}58%{--seed:58}59%{--seed:59}60%{--seed:60}61%{--seed:61}62%{--seed:62}63%{--seed:63}64%{--seed:64}65%{--seed:65}66%{--seed:66}67%{--seed:67}68%{--seed:68}69%{--seed:69}70%{--seed:70}71%{--seed:71}72%{--seed:72}73%{--seed:73}74%{--seed:74}75%{--seed:75}76%{--seed:76}77%{--seed:77}78%{--seed:78}79%{--seed:79}80%{--seed:80}81%{--seed:81}82%{--seed:82}83%{--seed:83}84%{--seed:84}85%{--seed:85}86%{--seed:86}87%{--seed:87}88%{--seed:88}89%{--seed:89}90%{--seed:90}91%{--seed:91}92%{--seed:92}93%{--seed:93}94%{--seed:94}95%{--seed:95}96%{--seed:96}97%{--seed:97}98%{--seed:98}99%{--seed:99}100%{--seed:100}
}
上面這段@keyframes seed{}相關(guān)CSS代碼就是一個(gè)可以無限使用的“動(dòng)畫種子”,無論是那些原本支持CSS動(dòng)畫的屬性,還是不支持CSS動(dòng)畫的屬性,只要它的屬性值是與數(shù)值相關(guān)的,都能夠借助這個(gè)“動(dòng)畫種子”實(shí)現(xiàn)動(dòng)畫效果。
舉個(gè)漸變旋轉(zhuǎn)的例子
例如一開始那個(gè)線性漸變的例子,我們可以讓漸變旋轉(zhuǎn)角度和我們“動(dòng)畫種子”中的--seed變量相關(guān)聯(lián),配合animation屬性就能實(shí)現(xiàn)漸變旋轉(zhuǎn)的效果了:
.gradient {
width: 150px; height: 150px;
background-image: linear-gradient(calc(3.6deg * var(--seed)), red 50%, blue 50%);
animation: seed 1s linear infinite;
}
<div class="gradient"></div>

實(shí)時(shí)效果如下
原本不支持CSS動(dòng)畫的漸變背景也有了動(dòng)畫變換效果。
三、更進(jìn)一步的動(dòng)畫效果
配合“變量種子計(jì)數(shù)器”,我們最實(shí)現(xiàn)過去很難實(shí)現(xiàn)的密集型背景圖形動(dòng)畫效果,例如下面這張平鋪的圈圈放大效果:
圓圈圈放大效果

CSS和HTML代碼如下:
.radial-gradient {
padding: 50%;
background-image: radial-gradient(#cd0000 calc(2% * var(--seed)), transparent calc(2% * var(--seed)));
background-size: 80px 80px;
animation: seed 1s linear infinite;
}
<div class="radial-gradient"></div>
只要把我們的徑向漸變的邊緣使用var(--seed)種子變量表示就可以了。使用2%計(jì)算而不是使用1%是為了紅色鋪滿之后有一定的延時(shí),否則效果體驗(yàn)的時(shí)候眼睛會(huì)閃瞎。
眼見為實(shí),如果是Chrome瀏覽器或者Android設(shè)備,您可以狠狠地點(diǎn)擊這里:CSS變量與徑向漸變動(dòng)畫demo
您可以在上面提供的demo頁面中修改一些數(shù)值,體驗(yàn)不同的效果。
四、兼容性及結(jié)語
“變量種子計(jì)數(shù)器”實(shí)現(xiàn)動(dòng)畫技術(shù)的兼容性如下:
Chrome瀏覽器和Android設(shè)備上完全無障礙使用的;
Firefox瀏覽器也是支持動(dòng)畫幀里面設(shè)置CSS變量的,但是需要應(yīng)用動(dòng)畫的屬性也寫在其中,也就是每一幀中都要把background-image也寫上,但這樣就完全沒有重用性,成本較高,所以價(jià)值有限;
IE瀏覽器和Safari瀏覽器則完全不支持;
由于Safari不支持,導(dǎo)致iOS手機(jī)上是沒有效果的,大大制約了實(shí)用價(jià)值。
但是放在特殊場(chǎng)合,也不是不能使用,我們可以使用增強(qiáng)實(shí)現(xiàn)某些特殊的效果,例如這篇文章介紹的新穎的交互動(dòng)效:“你用的那些CSS轉(zhuǎn)場(chǎng)動(dòng)畫可以換一換了”。

百葉窗效果截圖
責(zé)任編輯:中山網(wǎng)站建設(shè)
【網(wǎng)訊網(wǎng)絡(luò)】國(guó)家高新技術(shù)企業(yè)》十一年專注軟件開發(fā),網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),APP開發(fā),小程序,微信公眾號(hào)開發(fā),定制各類企業(yè)管理軟件(OA、CRM、ERP、OMS訂單管理系統(tǒng)、WMS進(jìn)銷存管理軟件等)!服務(wù)熱線:0760-88610046、13924923903,http://www.denorpool.com
*請(qǐng)認(rèn)真填寫需求,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。