交錯動畫

有時候,我們需要給多個元素添加同一個動畫,播放后,不難發現它們會一起運動,一起結束,這樣就會顯得很平淡無奇。
那么如何將動畫變得稍微有趣一點呢?很簡單,既然它們都是同一時刻開始運動的,那么讓它們不在同一時刻運動不就可以了嗎。如何讓它們不在同一時刻運動呢?注意到CSS動畫有延遲(delay
)這一屬性。舉個栗子,比如有十個元素播放十個動畫,將第二個元素的動畫播放時間設定為比第一個元素晚0.5秒(也就是將延遲設為0.5秒),其他元素以此類推,這樣它們就會錯開來,形成一種獨特的視覺效果。

這就是所謂的交錯動畫:通過設置不同的延遲時間,達到動畫交錯播放的效果。
本demo地址:Staggered Wave Loading
用JS分割文本
還有一種經常用到的玩法:用JS將句子或單詞分割成字母,並給每個字母加上不同延時的動畫,同樣也很華麗

本demo地址:Staggered LandIn Text
一般我們都是從第一個元素開始交錯的。但如果要從中間元素開始交錯的話,就要給當前元素的延時各加上一個值,這個值就是中間元素的下標到當前元素的下標的距離(也就是下標之差的絕對值)與步長的乘積,即:delay + Math.abs(i - middle) * step
,其中中間元素的下標middle = letters.filter(e => e !== "").length / 2

本demo地址:Reveal Text
所有有交錯特性的動畫都在這兒
隨機粒子動畫
說到隨機性,我們可以實現一種更瘋狂的效果:給幾百個粒子添加交錯動畫,並且交錯時間隨機,位置大小也都是隨機。如此一來我們就能用純CSS模擬出下雪的效果。
又到了白色相簿的季節呢~為什么你寫CSS這么熟練啊?

本demo地址:Snow (Pure CSS)
偽類和偽元素
偽類

HTML元素的狀態是可以動態變化的。舉個栗子,當你的鼠標懸浮到一個按鈕上時,按鈕就會變成“懸浮”狀態,這時我們就可以利用偽類:hover
來選中這一狀態的按鈕,並對其樣式進行改變。
:hover
是筆者最最常用的一個偽類。還有一個很常用的偽類是:nth-child
,用於選中元素的某一個子元素。其他的類似:focus
、:focus-within
等也有一定的使用。
本demo地址:Button Hover Border Stroke With Float Text
所有:hover
的動畫都在這兒
絕對定位實現多重邊框
誰規定按鈕只能有一套邊框的?利用絕對定位和padding
,我們可以給按鈕做出3套大小不一的邊框來,這樣效果更炫了有木有!

本demo地址:Button Hover Multiple Border Stroke
偽元素

簡而言之,偽元素就是在原先的元素基礎上插入一個額外的元素,而且這個元素不充當HTML的標簽,這樣就能保持HTML結構的整潔。
什么情況下用偽元素呢?比如實現一根條子划過文本的動畫,在這個動畫中每個文本都有屬於自己的一根條子,那么我們就可以用偽元素為每個文本生成一個條子,而無需特地在HTML標簽中加入條子的div(當然,如果條子數量超過了2個,還是用div吧)
本demo地址:Header With Slide Bar
overflow障眼法
之前有做過閃光按鈕的效果:鼠標懸浮按鈕上時一道光從左到右划過去。
筆者就用漸變來模擬那道光,通過transform: translateX()
將其平移至右邊

但這樣明顯不對啊,這光為啥能被看見呢?不應該把它給“擋”起來嗎?
於是乎,給按鈕加上overflow: hidden
,光在按鈕外的位置時就被隱藏起來了

這就是障眼法的力量:)
本demo地址:Button Hover Shining
更多障眼法可以看看這個作品,一次性看個夠XD
兄弟選擇符定制表單元素
提示:這里最好將input
作為label
的子元素,這樣用戶點擊label
時就能傳到input
上
默認的input
太丑怎么辦?那就把它先抹掉,用appearance: none
或opacity: 0
都可以
然后,利用兄弟選擇符~
來定制和input
相鄰的所有元素(+
號也行,只不過只能選中最近的元素),例如可以用偽元素生成一個新的方框代替原先的input
,利用偽類:checked
和動畫來表示它被勾選后的狀態,本質上還是障眼法哦~

本demo地址:Todo List
CSS特性
善用某些CSS特性,也可以為你的作品增色不少哦
transform
PS里的自由變換,各種CSS動畫都離不開它。它也可以進行3D變換。
例子就不舉了,因為幾乎我所有的動畫都用到了它
border-radius
為盒子添加圓角,經常用來美化按鈕等組件
如果設定為50%
則是圓形,也很常用
不規則的曲邊形狀
調整多個頂點的border-radius
可以做出不規則的曲邊形狀

本demo地址:Nav Tab
box-shadow
為盒子添加陰影,增加盒子的立體感,如果多層疊加的話會使陰影更加絲滑

本demo地址:Pagination
遮罩
如果給box-shadow
的擴張半徑設定足夠大的值,可以用它來遮住背景,而無需額外的div元素

本demo地址:Burger Menu
內發光
注意到box-shadow
還有個inset
,用於盒子內部發光
利用這個特性我們可以在盒子內部的某個范圍內設定顏色,做出一個新月形

再加點動畫和濾鏡效果,“猩紅之月”閃亮登場!

本demo地址:Crimson Crescent Loading
text-shadow
文本陰影,本質上和box-shadow
相同,只不過是相對於文本而言,常用於文本發光,也可通過多層疊加來制作霓虹文本和偽3D文本等效果
發光文本

本demo地址:Staggered GlowIn Text
霓虹文本

本demo地址:Neon Text
偽3D文本

本demo地址:Staggered Bouncing 3D Loading
background-clip:text
能將背景裁剪成文字的前景色,常用來和color: transparent
配合生成漸變文本

本demo地址:Menu Hover Fill Text
gradient
漸變可以作為背景圖片的一種,具有很強的色彩效果,甚至可以用來模擬光
linear-gradient
線性漸變是筆者最常用的漸變

這個作品用到了HTML的dialog
標簽,漸變背景,動畫以及overflow
障眼法,細心的你看出來了嗎:)
本demo地址:Confirm Modal
radial-gradient
徑向漸變筆者沒怎么用過,上面例子中Snow的背景就是一個徑向漸變
conic-gradient
圓錐漸變可以用於制作扇形,因此配合CSS變量筆者制作了一個度量計,也用到了偽元素障眼法

本demo地址:Gauge (No SVG)
filter
PS里的濾鏡,玩過的都懂,blur
最常用
backdrop-filter
對背景應用濾鏡,產生毛玻璃的效果

本demo地址:Frosted Glass
mix-blend-mode
PS里的混合模式,常用於文本在背景下的特殊效果
以下利用濾色模式(screen
)實現文本視頻蒙版效果

本demo地址:Video Mask Text
clip-path
PS里的裁切,可以制作各種不規則形狀。如果和動畫結合也會相當有意思

本demo地址:Name Card Hover Expand
-webkit-box-reflect
投影效果,不怎么常用,適合立體感強的作品

本demo地址:Card Flip Reflection
web animations
雖然這並不是一個CSS特性,但是它經常用於完成那些CSS所做不到的事情
那么何時用它呢?當CSS動畫中有屬性無法從CSS中獲取時,自然就會使用到它了
跟蹤鼠標的位置
目前CSS還尚未有獲取鼠標位置的API,因此考慮用JS來進行
通過查閱相關的DOM API,發現在監聽鼠標事件的API中,可通過e.clientX
和e.clientY
來獲得鼠標當前的位置
既然能夠獲取鼠標的位置,那么跟蹤鼠標的位置也就不是什么難事了:通過監聽mouseenter
和mouseleave
事件,來獲取鼠標出入一個元素時的位置,並用此坐標來當作鼠標的位移距離,監聽mousemove
事件,來獲取鼠標在元素上移動時的位置,同樣地用此坐標來當作鼠標的位移距離,這樣一個跟蹤鼠標的效果就實現了

本demo地址:Menu Hover Image
彩蛋

將交錯動畫和偽類偽元素結合起來寫出來的慎重勇者風格的菜單
本demo地址:Shinchou Menu
作者:alphardex
鏈接:https://juejin.im/post/5e070cd9f265da33f8653f00
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。