交錯動畫
有時候,我們需要給多個元素添加同一個動畫,播放后,不難發現它們會一起運動,一起結束,這樣就會顯得很平淡無奇。
那么如何將動畫變得稍微有趣一點呢?很簡單,既然它們都是同一時刻開始運動的,那么讓它們不在同一時刻運動不就可以了嗎。如何讓它們不在同一時刻運動呢?注意到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
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
