天天看點

css3 animation學習心得

先說一下與transition的差別,因為他們真的有點點相似。

  • animation動畫可以通過@keyframes屬性對動畫進行更為精細的控制,設定多個狀态。

    但是transition屬性則隻有兩個狀态,起始狀态與結束狀态。

  • 兩個屬性的觸發時機有很大的不同,animation好比是一個自執行函數,隻要定義好,立馬生效觸發動畫。

    transition則像是一個事件處理函數(事件監聽器),隻有它監聽的屬性值發生改變,動畫效果才會生效。

我認為,選擇使用時機恰恰就是看他們的名字。如果想過渡就transition,如果想動畫就animation

針對每個屬性的解釋

  • animation-name
  • animation-duration: animation中第一個time被解析為duration, 第二個是delay
  • animation-timing-function
  • animation-delay: -1s;定義為負數會直接從動畫開始多少秒後開始
  • animation-iteration-count: 定義為小數,比如1.5會在播放到第二次一半的時候突然結束
  • anitmatation-direction: 四種,normal reverse alternate(交替,看次數,如果隻有一次自然就不會交替了) alternate-reverse
  • animation-fill-mode 設定CSS動畫在執行之前和之後如何将樣式應用于其目标。
    css3 animation學習心得
    css3 animation學習心得

    總的來說就是:forwards是執行到最後的關鍵幀。 準确來說其實是動畫在哪停就永遠保持在哪

    backwards與none的差別在于: animation-delay期間,因為兩者真正開始都時候都是要突變到第一個關鍵幀中定義的值,這個第一個關鍵幀受direction的影響,如果是reverse則是100%的時候

  • animation-play-state

    用法:

const elem = document.getElementById('elem');
setTimeout(() => {elem.style.animationPlayState = 'paused'}, 2000);
setTimeout(() => {elem.style.animationPlayState = 'running'}, 4000);
           

就是可以控制是否暫停和繼續。

接下來詳細說一下animation-timing-function

這個和transition的timing-function差不多。

主要說一下ease-out, ease-in, ease-in-out,ease(default value)

橫軸時間,縱軸進度

css3 animation學習心得

總結就是:

ease out尾緩動

ease in首緩動,

ease-in-out是ease-in和ease-out的結合。首尾緩動。

ease尾緩動,與ease out有點相似,不過ease一開始速度要比ease-out快很多

大部分時候直接用預設的ease就行了。

還有幾種:

linear:字面意思,線性的,全程一個速率

cubic-bezier(0.1, 0.7, 1.0, 0.1);

三次貝塞爾曲線。一共四個參數,代表了第二個橫縱坐标和第三個點的橫縱坐标(一共四個點,第一個在(0,0),最後一個在(1,1) )

前面的ease之類的都是可以通過cubic-bezier設定特定的參數來實作的。

steps(number, position):number就是說平均分成幾段,

css3 animation學習心得

position取值有:

start,end,jump-start,jump-end,jump-none,jump-both。

jump-start就是以前的start,jump-end就是以前的end。這個jump了解為跳過。

直接看橫線的位置就行了,因為單獨一個點,在數學上有意義,而不會反映到螢幕上。比如jump-start,就會跳過開頭,你永遠看不到在0的位置

個人覺得用來做時鐘動畫是很經典的,因為秒針是一秒跳一格,而不是像ease類函數那樣連續地劃過去。

  • jump-start|start代表秒針剛進入動畫,就跳了一格。
  • jump-end|end代表秒針等了一秒才開始跳。
  • jump-none:适用場景為0和1都得持續一段時間的,比如說完全透明和完全不透明。jump-start和jump-end就沒辦法做到。
  • jump-both首尾都是沒有的。目前沒感覺這個both有啥适用場景
css3 animation學習心得

這裡錄了一個gif(虛線框代表進度中to也就是100%的位置,沒有去仔細考慮border占的width,是以可能不能完全重合,知道是100%就行)

對于關鍵幀動畫來說,timing function作用于一個關鍵幀周期而非整個動畫周期,即從關鍵幀開始開始,到關鍵幀結束結束。

若該關鍵幀沒有定義緩動函數,則使用定義于整個動畫的緩動函數,

!!!如果定義了0-50%-100%,會有兩段ease,也就是從快到慢,從快到慢。如果是step。例如本來設定的0-100%秒針一共跳60次,于是你設定了steps(60, jump-start),但是如果是0-50%-100%,他每一段都跳60次,那就成了120次。

@keyframe裡的百分比是支援重寫timing function的

animation的@keyframe定義的是時間的百分比,舉例就是絕對定位的left從0變到100px。持續兩秒

現在@keyframes {

50% {left: 30px;}

}

這個50%就是在1s的時候

至于

CSS animation-timing-function屬性定義CSS動畫在每一動畫周期中執行的節奏。可能值為一或多個<timing-function>

說的是一個timing-function對應一個animation-name,

像這樣

css3 animation學習心得
css3 animation學習心得

隻做了解,個人感覺實際意義不大。

下一篇: GulpGulp