強大的CSS: 使用“變數種子計數器”擴充套件動畫更多可能性
一、不是所有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和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的專案實戰的學習資料都有整理,送給每一位前端小夥伴,每天分享技術
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901074/viewspace-2645127/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 擴充套件叢集blk數套件
- 數論分塊擴充套件套件
- 如何讓CSS計數器支援小數的動態變化?CSS
- 使用 CSS 計數器CSS
- es6-數值擴充套件套件
- Spring之藉助Redis設計訪問計數器之擴充套件篇SpringRedis套件
- ?用Chrome擴充套件管理器, 管理你的擴充套件Chrome套件
- js隨機數生成器的擴充套件JS隨機套件
- 一個超級簡單的PHP超全域性變數管理擴充套件PHP變數套件
- JMeter 擴充套件開發:擴充套件 TCP 取樣器JMeter套件TCP
- 強大的CSS動畫:Transition與AnimationCSS動畫
- jquery計數器動畫特效jQuery動畫特效
- 使用Kotlin擴充套件函式擴充套件Spring Data案例Kotlin套件函式Spring
- 使用擴充套件SRAM設計的存內計算套件
- 豐富Safari 擴充套件,釋放Safari 瀏覽器更多潛力套件瀏覽器
- [外掛擴充套件]canvas小動畫 - 青蛙掛件套件Canvas動畫
- Swift 核心動畫 面向協議 擴充套件封裝Swift動畫協議套件封裝
- CSS 計數器的妙用:數字遞增動效CSS
- 3 種擴充套件 Kubernetes 能力的方式套件
- ES6入門之數值的擴充套件套件
- 漫畫:Kotlin 的擴充套件細節探究Kotlin套件
- 可擴充套件的使用者表設計套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 如何擴充套件一個網站以支援數百萬使用者?套件網站
- 使用CSS計數器美化數字有序列表CSS
- Solon詳解(六)- Solon的校驗擴充套件框架使用與擴充套件套件框架
- 大資料——Scala擴充套件大資料套件
- unocss如何使用css變數CSS變數
- Thinkphp實戰利用鉤子使用行為擴充套件 (Hook)PHP套件Hook
- 強大的CSS:文字下波浪線動畫效果CSS動畫
- spring4.1.8擴充套件實戰之一:自定義環境變數驗證Spring套件變數
- 芯飛躍 看至強可擴充套件處理器的至強效應套件
- 強大的CSS:var變數的區域性作用域(繼承)特性CSS變數繼承
- 數值的擴充套件方法以及新增資料型別BigInt套件資料型別
- Source insight擴充套件宏使用套件
- 使用ctypes來擴充套件Python套件Python
- 使用cython擴充套件python庫套件Python
- 使用CSS計數器美化有序列表CSS