中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

強大的CSS: 使用“變量種子計數器”擴展動畫更多可能性

發布時間:2020-08-11 15:04:07 來源:ITPUB博客 閱讀:129 作者:智云編程 欄目:web開發

一、不是所有CSS屬性都能動畫

經常和CSS打交道的人肯定都知道,不是所有的CSS屬性都能使用 animation 屬性實現動畫效果,最典型的例子就是 background-image 漸變。

一個典型的線性漸變是由角度,顏色和位置組成,例如:

.gradient {
    background-image: linear-gradient(45deg, red 50%, blue 50%);
}

其中無論是角度( 45deg ),顏色( red blue )還是位置( 50% )單獨作為屬性者都是可以動畫過渡的,但是合在一起作為漸變背景的時候是無法產生過渡效果的,因為 background-image 的語義是圖片。

那有沒有什么辦法可以讓背景圖片也能實現動畫過渡呢,至少CSS漸變可以實現?[圖片上傳失敗...(image-e6ee4e-1558437352811)]

經過我的研究和探索,找到了一種解決方案,雖稱不上百分百完美,但足夠應用于項目中,能讓以前很多不支持CSS動畫的屬性,也支持原生的動畫效果。

二、變量種子計數器

Chrome等瀏覽器(不包括Safari)有個特性,就是當我們使用 @keyframes 定義關鍵幀的時候,關鍵幀里面設置的屬性也是會運行的(幾年前改變的,原先不是),典型的案例就是 content 屬性與內容變化。

例如實現一個“正在加載中…”打點效果可以下面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>

實時效果如下:

正在加載中


根據我的測試發現,不僅普通的CSS屬性可以在CSS動畫關鍵幀中運行,CSS自定義屬性(CSS變量)也可以在CSS動畫關鍵幀中運行。例如:

@keyframes var {
    33% { --someVar: 33%; }
    66% { --someVar: 66%; }
}

這種特性就非常有啟發,如果我們某一個CSS屬性值是基于這個 --someVar 變量構成的,那豈不是就算這個屬性值不支持CSS動畫,我只要讓每一個百分比值的間隙足夠的小,不也能夠實現一個平滑的動畫效果?

具體做法就是,把CSS動畫關鍵幀從 0%-100% 分成101份,然后每一份從0開始依次計數,就像是個計數器一樣,然后把這個計數器分配給一個特定的CSS變量。最終我們可以得到一個如下所示的CSS動畫“變量種子計數器”。

@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{} 相關CSS代碼就是一個可以無限使用的“動畫種子”,無論是那些原本支持CSS動畫的屬性,還是不支持CSS動畫的屬性,只要它的屬性值是與數值相關的,都能夠借助這個“動畫種子”實現動畫效果。

舉個漸變旋轉的例子

例如一開始那個線性漸變的例子,我們可以讓漸變旋轉角度和我們“動畫種子”中的 --seed 變量相關聯,配合 animation 屬性就能實現漸變旋轉的效果了:

.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>

三、更進一步的動畫效果

配合“變量種子計數器”,我們最實現過去很難實現的密集型背景圖形動畫效果,例如下面這張平鋪的圈圈放大效果:

強大的CSS: 使用“變量種子計數器”擴展動畫更多可能性

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% 計算而不是使用 1% 是為了紅色鋪滿之后有一定的延時,否則效果體驗的時候眼睛會閃瞎。

四、兼容性及結語

“變量種子計數器”實現動畫技術的兼容性如下:

  • Chrome瀏覽器和Android設備上完全無障礙使用的;
  • Firefox瀏覽器也是支持動畫幀里面設置CSS變量的,但是需要應用動畫的屬性也寫在其中,也就是每一幀中都要把 background-image 也寫上,但這樣就完全沒有重用性,成本較高,所以價值有限;
  • IE瀏覽器和Safari瀏覽器則完全不支持;

由于Safari不支持,導致iOS手機上是沒有效果的,大大制約了實用價值。

但是放在特殊場合,也不是不能使用,我們可以使用增強實現某些特殊的效果,例如這篇文章介紹的新穎的交互動效

自己是一個五年的前端工程師,希望本文對你有幫助!

這里推薦一下我的前端學習交流扣qun:731771211 ,里面都是學習前端的,如果你想制作酷炫的網頁,想學習編程。自己整理了一份2019最全面前端學習資料,從最基礎的HTML+CSS+JS【炫酷特效,游戲,插件封裝,設計模式】到移動端HTML5的項目實戰的學習資料都有整理,送給每一位前端小伙伴,每天分享技術


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

商河县| 庆阳市| 林西县| 陆丰市| 贡山| 云林县| 乌拉特前旗| 象州县| 佛山市| 东平县| 霍林郭勒市| 达拉特旗| 渭源县| 济南市| 高尔夫| 金川县| 常宁市| 轮台县| 朝阳县| 军事| 新密市| 原平市| 苍溪县| 宝鸡市| 岢岚县| 长岭县| 靖边县| 崇礼县| 黔东| 伊通| 梨树县| 岫岩| 五指山市| 彰化县| 惠来县| 奉新县| 杭锦后旗| 曲阳县| 陕西省| 诏安县| 涞水县|