亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > CSS > 正文

詳解CSS動畫屬性關鍵幀keyframes全解析

2024-07-11 08:59:46
字體:
來源:轉載
供稿:網友

大概有多久沒有更新專欄文章了。半年?下半年忙到起飛,或者毫不夸張的說是發射?僅有的一點個人時間,上半年貢獻給了Python,現在差不多已忘掉了七七八八(一首《涼涼》送給自己),下半年貢獻給了JavaScript,終于鼓起勇氣系統的開始學習JS了(換臺,梁靜茹《勇氣》走起)。本來想一直等等等,等到webapi學完后放個大招,svg+CSS動畫搭乘上JavaScript簡直如虎添翼長驅直入。但是,看掘金作者群里討論的風生水起,突然感覺自己全然是陌生人(此處應放蔡健雅?),所以,更一篇文章刷一下存在感。

這篇文章本來是寫的《SVG+CSS動畫》小冊中的一個小節選,小冊因為各種莫名的原因,擱淺了,擱淺……起航時間遙遙無期,但keyframes關鍵幀作為控制動畫在不同時間的狀態的重要元素,決定了七十二變的終極形態,所以這次更新專欄拿它下手。至于小冊嘛,如果能發的話,里面再換成其他的案例就好,此為后話。

關鍵幀keyframes的基礎概念此處可省略,下面才是滿滿的干貨。

案例:一路向前永不停歇的圓

因為只是來解釋關鍵幀,所以只搞了一個簡易的僅水平位移的動效。因此,這篇文章得以脫離SVG單獨存在僅和CSS3動畫屬性相關。

這是一個努力從起點滾向終點的圓圈,整個路程為800px,但我在它的必經之路的三處設置了三個驛站?,F在就要通過關鍵幀的定義讓圓圈在行進的路上進入驛站并稍作停頓。

1.先來一個最基礎的

CSS部分定義一個最基礎的位移動畫,4s完成,線性速度case-關鍵幀演示1-基礎 。

@keyframes  move{0%{transform:translateX(0)}100%{transform:translateX(800px)}}.c_move{animation:move 4s linear both} /*both:運動結束后停留在終點*/

這個發揮作用主要是在定義了無限循環動畫時。

基礎的設置自然帶來毫無特色平淡無奇的基礎動效。

2.延遲開始

下面,我想讓圓圈在起點停留2s后再開始移動,第一反應是用動畫屬性中的延遲 animation-delay ,把時間定義成2s,行不行?行,但這里用個更高級的方法。我們在定義關鍵幀時用了大量的百分比,這里百分比值代表的是 時間節點 ,也就是說 關鍵幀定義的是不同時間節點的狀態屬性。 下面再來看一張圖,這張圖一定不要和上面的路徑演示弄混了,這是一張動畫的時間軸的圖。

讓圓圈在起點停留2s那是表象說法,轉化成我們的動畫定義語言,就是在4s動畫周期內前2s是沒有動畫效果的。所以,動畫規則我來這樣定義:

@keyframes  move{0%{transform:translateX(0)}50%{transform:translateX(0px)}100%{transform:translateX(800px)}}

對照上面時間軸的分割來看,更容易理解一些,這樣就得到了在起點處停留2s后,在后面的2s完成整個動畫的動效。這里亦或用一種更簡單的寫法為 0%, 50%{transform:translateX(0)} ,屬性相同的可以合并在一起,用逗號分隔。 case-關鍵幀演示-延遲開始

 

3.提前結束

有了延遲開始的基礎,提前結束是不是已經可以類推出來了。為了區分一下,我讓動畫提前3s結束。照例先畫出時間軸的解析。

對應關鍵幀的定義如下:

@keyframes  move{0%{transform:translateX(0)}25%,100%{transform:translateX(800px)}}

最終結果圓圈一定是4倍速度全力以赴加速完成旅程(畢竟要把原來4s的時間壓縮到1s完成),然后怡然自得的在終點等待整個動畫時間結束。 case-關鍵幀演示-提前結束

 

4.中途停留

那些已準備妥當的驛站,現在可以發揮作用了,我希望圓圈這樣運動:整個旅程中僅在第一個驛站(移動200px后)停留1s,稍作整頓。映射到時間軸上是什么樣子的呢?

這里,出現了一些看上去很奇怪的數字,需要解釋一下。先來明確一點,我們分析時間軸,最終要獲得是時間節點。針對我們的設計,停留1s,那運動的時間就是3s,而這3s的時間是分成兩部分的,第一部分是前200px,第二部分是后600px,因為是線性勻速,所以當時間軸分成A+B+C三部分后,在A時間段跑完200px,在C時間段跑完600px,計算出A對應的時間0.75s,C對應的時間2.25s,B的時間是停留的時間1s,再換算成對應的百分比,這就是最終中間兩個時間節點的計算方法。時間軸解析完成后,CSS部分的定義手到擒來:

@keyframes  move{0%{transform:translateX(0)}18.75%, 43.75%{transform:translateX(200px)} /*對應停留的1s*/100%{transform:translateX(800px)}}

case-關鍵幀演示-第一個驛站停留1s

 

5.像蟲洞一樣跳躍式前進

增加些難度,在中途任意點作停留已經不是什么問題了,停留在一個點和多個點是相同的思路,現在,我讓圓圈跳躍式前進,進入第一個驛站后,停留1s,跨過第二個驛站,直接進入第三個驛站,停留1s,完成旅程。根據空間折疊原理,200和600處發生了躍遷。分析時間軸:

重點看紅色的部分,那里就是躍遷的時間點,在無時間變化的情況下位移了200px。按照時間軸的分析,CSS部分理論上是這樣的:

@keyframes  move{0%{transform:translateX(0)}25%,50%{transform:translateX(200px)}50%,75%{transform:translateX(600px)}100%{transform:translateX(800px)}}

效果如何呢?

完全和想象的不一樣,問題出在哪里呢?就是時間的50%節點處,瀏覽器可不知道你真實的想法,它只會以為你定義錯了,當有兩個相同的50%的關鍵幀的不同屬性值定義時,會自動忽略第一個,而以最后一個有效值為準,所以上面的定義相當于給瀏覽器傳達的訊息是這樣的:

@keyframes  move{0%{transform:translateX(0)}25%{transform:translateX(200px)}50%,75%{transform:translateX(600px)} /*在位移600px后停留1s*/100%{transform:translateX(800px)}}

這就是為什么看上去是到達第一驛站后加速跑向第三個驛站,然后停留后再完成剩下的路程的原因。現在游戲越來越有意思了,或許我們可以試試 騙過瀏覽器 。既然同樣的時間點只允許定義一個屬性值,那如果我在緊鄰的旁邊增加一個時間點來定義,會發生什么?

@keyframes  move{0%{transform:translateX(0)}25%,50%{transform:translateX(200px)}50.0001%,75%{transform:translateX(600px)} 100%{transform:translateX(800px)}}

看上面出現的**50.0001%**這個時間點,猜猜發生了什么?這就是上面所謂的“騙過瀏覽器”的方法了。在50%→50.0001%這個區間,發生了400px(200→600)的位移變化。所以就得到了下面這種效果:case-關鍵幀演示-躍遷

從原理上來講,這是一種視覺欺騙,在極短的時間內在兩個位置間發生位移,因為時間短到可以忽略,所以會有一種跳躍的假象。

總結

看完上面的幾種代表性實例,是不是對關鍵幀的定義有了一個全新的認識,你可能會覺得對于“延遲開始”和“提前結束”這兩種需求,是完全可以通過定義延遲時間以及動畫周期的時間來達到相同的效果的,但是,對于一個無限循環的動效而言,延遲開始永遠只作用一次,當動畫一旦開始進入周而復始的循環后,不再支持這個屬性設置。因此,如果可以的話,盡量用關鍵幀的定義來完成。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩在线精品av| 国产成人一区二区| 亚洲a成v人在线观看| 午夜欧美不卡精品aaaaa| 日韩av理论片| 77777亚洲午夜久久多人| 亚洲视频网站在线观看| 欧美亚洲国产日本| 亚洲色图18p| 亚洲第一页在线| 中文字幕av一区二区| 亚洲电影免费在线观看| 精品视频中文字幕| 国产一区二区三区视频免费| 欧美在线视频播放| 好吊成人免视频| 欧美日产国产成人免费图片| www.日韩视频| 亚洲午夜久久久影院| 日韩电影大全免费观看2023年上| 欧美日韩中文字幕| 国产成人精品免高潮费视频| 91精品久久久久久久久青青| 国产精品视频久久久久| 久久99亚洲精品| 久久久人成影片一区二区三区观看| 欧美日韩视频在线| 欧美精品一区二区免费| 亚洲成色777777在线观看影院| 国产精品一区二区久久精品| 久久精品中文字幕免费mv| 久久亚洲精品毛片| 国产一区二区日韩| 中文字幕亚洲情99在线| 欧美性色视频在线| 91久久久国产精品| 国产成人久久精品| 久久久久久一区二区三区| 国产91精品不卡视频| 欧美猛交免费看| 午夜精品福利视频| 国产美女精品视频| 亚洲国产精彩中文乱码av在线播放| 国产精品亚洲片夜色在线| 国产精品久久久久久久7电影| 亚洲aⅴ男人的天堂在线观看| 久久综合色影院| 不用播放器成人网| 亚洲欧美中文在线视频| 久久久久成人网| 国产一区二区欧美日韩| 国产日韩欧美综合| 国产精品黄视频| 欧美激情精品久久久久久黑人| 91亚洲永久免费精品| 国内精品中文字幕| 91精品久久久久久久久青青| 91精品国产自产在线观看永久| 久久久噜噜噜久噜久久| 欧美一区二区三区精品电影| 国产精品美女主播在线观看纯欲| 国产mv免费观看入口亚洲| 国产精品网址在线| 欧美性做爰毛片| 国产精品第1页| 日韩久久免费视频| 91精品视频在线看| 国产成人精品视频在线| 国产精品免费电影| 成人美女av在线直播| 这里只有精品视频在线| 国产99久久精品一区二区| 欧美日韩另类视频| 亚洲欧美激情四射在线日| 日韩免费视频在线观看| 中文字幕亚洲二区| 亚洲一区二区三区四区在线播放| 8x拔播拔播x8国产精品| 亚洲人成电影网站色www| 色多多国产成人永久免费网站| 欧美午夜久久久| 成人午夜一级二级三级| 亚洲国产成人精品女人久久久| 一区二区三区视频免费在线观看| 国产精品成av人在线视午夜片| 最好看的2019年中文视频| 97超碰色婷婷| 国色天香2019中文字幕在线观看| 欧美最近摘花xxxx摘花| 美女视频黄免费的亚洲男人天堂| 久久久亚洲欧洲日产国码aⅴ| 成人黄色免费片| 久久亚洲综合国产精品99麻豆精品福利| 国产剧情久久久久久| 国产精品一区av| 国产精品扒开腿做爽爽爽视频| 国产69久久精品成人| 国产999视频| 欧美电影在线观看高清| 亚洲香蕉在线观看| 亚洲一二三在线| 日本一区二区三区四区视频| 国产精品免费视频xxxx| 欧美肥臀大乳一区二区免费视频| 少妇高潮久久77777| 一区二区亚洲精品国产| 国产精品三级美女白浆呻吟| 国产欧美日韩精品专区| 日韩成人黄色av| 亚洲欧洲日产国码av系列天堂| 国产精品一区二区电影| 欧美亚洲第一区| 久久久国产影院| 亚洲成人精品视频在线观看| 日韩视频免费中文字幕| 欧美黄色免费网站| 国产亚洲aⅴaaaaaa毛片| 国产精品一区二区久久精品| 亚洲韩国日本中文字幕| 91亚洲国产成人久久精品网站| 欧美日韩午夜剧场| 亚洲mm色国产网站| 国产成人精品电影| 国产精品一区电影| 久久久久免费视频| 一区二区亚洲欧洲国产日韩| 这里只有精品丝袜| 亚洲国产成人91精品| 成人免费自拍视频| 一区二区欧美久久| 97免费视频在线播放| 国内精品视频久久| 国产成人aa精品一区在线播放| 中文字幕一区二区三区电影| 亚洲人午夜色婷婷| 久久久国产在线视频| 国产91精品高潮白浆喷水| 精品国产一区二区三区在线观看| 91精品久久久久久久久| 日本久久久久久久久久久| 亚洲综合一区二区不卡| 国产成人福利视频| 97久久精品在线| 国产精品海角社区在线观看| 精品视频在线观看日韩| 日韩精品在线视频美女| 亚洲精品456在线播放狼人| 日韩视频一区在线| 日韩免费在线免费观看| 日韩中文字幕免费视频| 91丨九色丨国产在线| www.午夜精品| 国产精品美女www爽爽爽视频| 国产精品丝袜白浆摸在线| 国产精品视频99| 性欧美xxxx| 久久99热精品| 欧美性猛交xxxx久久久| 国产精品国产福利国产秒拍| 久久这里只有精品视频首页| 91系列在线观看| 国产成人亚洲综合91精品| 欧美体内谢she精2性欧美| 久久久影视精品|