第9章 CSS3中的變形與動畫(下)

BothEyes1993發表於2018-12-07

Keyframes介紹

Keyframes被稱為關鍵幀,其類似於Flash中的關鍵幀。在CSS3中其主要以“@keyframes”開頭,後面緊跟著是動畫名稱加上一對花括號“{…}”,括號中就是一些不同時間段樣式規則。

@keyframes changecolor{
  0%{
   background: red;
  }
  100%{
    background: green;
  }
}
複製程式碼

在一個“@keyframes”中的樣式規則可以由多個百分比構成的,如在“0%”到“100%”之間建立更多個百分比,分別給每個百分比中給需要有動畫效果的元素加上不同的樣式,從而達到一種在不斷變化的效果。

經驗與技巧:在@keyframes中定義動畫名稱時,其中0%和100%還可以使用關鍵詞from和to來代表,其中0%對應的是from,100%對應的是to。

瀏覽器的支援情況:

在這裡插入圖片描述

Chrome 和 Safari 需要字首 -webkit-;Foxfire 需要字首 -moz-。 案例演示 通過“@keyframes”宣告一個名叫“wobble”的動畫,從“0%”開始到“100%”結束,同時還經歷了一個“40%”和“60%”兩個過程。“wobble”動畫在“0%”時元素定位到left為100px,背景色為green,然後在“40%”時元素過渡到left為150px,背景色為orange,接著在“60%”時元素過渡到left為75px,背景色為blue,最後“100%”時結束動畫,元素又回到起點left為100px處,背景色變為red。 HTML:

<div>滑鼠放到我身上</div>

CSS:
@keyframes wobble {
  0% {
    margin-left: 100px;
    background:green;
  }
  40% {
    margin-left:150px;
    background:orange;
  }
  60% {
    margin-left: 75px;
    background: blue;
  }
  100% {
    margin-left: 100px;
    background: red;
  }
}
div {
  width: 100px;
  height: 100px;
  background:red;
  color: #fff;
}
div:hover{
  animation: wobble 5s ease .1s;
}
複製程式碼

呼叫動畫

animation-name屬性主要是用來呼叫 @keyframes 定義好的動畫。需要特別注意: animation-name 呼叫的動畫名需要和“@keyframes”定義的動畫名稱完全一致(區分大小寫),如果不一致將不具有任何動畫效果。 語法:

animation-name: none | IDENT[,none|DENT]*;
複製程式碼

1、IDENT是由 @keyframes 建立的動畫名,上面已經講過了(animation-name 呼叫的動畫名需要和“@keyframes”定義的動畫名稱完全一致); 2、none為預設值,當值為 none 時,將沒有任何動畫效果,這可以用於覆蓋任何動畫。 注意:需要在 Chrome 和 Safari 上面的基礎上加上-webkit-字首,Firefox加上-moz-。

@keyframes around{
  0% {
    transform: translateX(0);
  }
  25%{
    transform: translateX(180px);
  }
  50%{
     transform: translate(180px, 180px); 
  }
  75%{
    transform:translate(0,180px);
  }
  100%{
    transform: translateY(0);
  }
}
div {
  width: 200px;
  height: 200px;
  border: 1px solid red;
  margin: 20px auto;
}
div span {
  display: inline-block;
  width: 20px;
  height: 20px;
  background: orange;
  border-radius: 100%;
  animation-name:around;
  animation-duration: 10s;
  animation-timing-function: ease;
  animation-delay: 1s;
  animation-iteration-count:infinite;
}
複製程式碼

設定動畫播放時間

animation-duration主要用來設定CSS3動畫播放時間,其使用方法和transition-duration類似,是用來指定元素播放動畫所持續的時間長,也就是完成從0%到100%一次動畫所需時間。單位:S秒 語法規則

animation-duration: <time>[,<time>]*
複製程式碼

取值

設定動畫播放方式

animation-timing-function屬性主要用來設定動畫播放方式。主要讓元素根據時間的推進來改變屬性值的變換速率,簡單點說就是動畫的播放方式。 語法規則: animation-timing-function:ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(, , , ) [, ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(, , , )]* 它和transition中的transition-timing-function一樣,具有以下幾種變換方式:ease,ease-in,ease-in-out,ease-out,linear和cubic-bezier。對應功如下:

在這裡插入圖片描述
在呼叫move動畫播放中,讓元素樣式從初始狀態到終止狀態時,先加速再減速,也就是漸顯漸隱效果。

設定動畫開始播放的時間

animation-delay屬性用來定義動畫開始播放的時間,用來觸發動畫播放的時間點。和transition-delay屬性一樣,用於定義在瀏覽器開始執行動畫之前等待的時間。

設定動畫播放次數

animation-iteration-count屬性主要用來定義動畫的播放次數。 語法規則: animation-iteration-count: infinite | [, infinite | ]* 1、其值通常為整數,但也可以使用帶有小數的數字,其預設值為1,這意味著動畫將從開始到結束只播放一次。 2、如果取值為infinite,動畫將會無限次的播放。 舉例: 通過animation-iteration-count屬性讓動畫move只播放5次,程式碼設定為: animation-iteration-count:5; 注意:Chrome或Safari瀏覽器,需要加入-webkit-字首!

設定動畫播放方向

animation-direction屬性主要用來設定動畫播放方向,其語法規則如下: animation-direction:normal | alternate [, normal | alternate]* 其主要有兩個值:normal、alternate 1、normal是預設值,如果設定為normal時,動畫的每次迴圈都是向前播放; 2、另一個值是alternate,他的作用是,動畫播放在第偶數次向前播放,第奇數次向反方向播放。

設定動畫的播放狀態

animation-play-state屬性主要用來控制元素動畫的播放狀態。 引數: 其主要有兩個值:running和paused。 其中running是其預設值,主要作用就是類似於音樂播放器一樣,可以通過paused將正在播放的動畫停下來,也可以通過running將暫停的動畫重新播放,這裡的重新播放不一定是從元素動畫的開始播放,而是從暫停的那個位置開始播放。另外如果暫停了動畫的播放,元素的樣式將回到最原始設定狀態。

@keyframes move {
  0%{
    transform: translateY(90px);
  }
  15%{
    transform: translate(90px,90px);
  }
  30%{
    transform: translate(180px,90px);
  }
  45%{
    transform: translate(90px,90px);
  }
  60%{
    transform: translate(90px,0);
  }
  75%{
    transform: translate(90px,90px);
  }
  90%{
    transform: translate(90px,180px);
  }
  100%{
    transform: translate(90px,90px);
  }
}

div {
  width: 200px;
  height: 200px;
  border: 1px solid red;
  margin: 20px auto;
}
span {
  display: inline-block;
  width: 20px;
  height: 20px;
  background: orange;
  transform: translateY(90px);
  animation-name: move;
  animation-duration: 10s;
  animation-timing-function: ease-in;
  animation-delay: .2s;
  animation-iteration-count:infinite;
  animation-direction:alternate;
  animation-play-state:paused;
}
div:hover span {
  animation-play-state:running;
}
複製程式碼
設定動畫時間外屬性

animation-fill-mode屬性定義在動畫開始之前和結束之後發生的操作。主要具有四個屬性值:none、forwards、backwords和both。其四個屬性值對應效果如下:

屬性值 效果
none 預設值,表示動畫將按預期進行和結束,在動畫完成其最後一幀時,動畫會反轉到初始幀處
forwards 表示動畫在結束後繼續應用最後的關鍵幀的位置
backwards 會在向元素應用動畫樣式時迅速應用動畫的初始幀
both 元素動畫同時具有forwards和backwards效果

在預設情況之下,動畫不會影響它的關鍵幀之外的屬性,使用animation-fill-mode屬性可以修改動畫的預設行為。簡單的說就是告訴動畫在第一關鍵幀上等待動畫開始,或者在動畫結束時停在最後一個關鍵幀上而不回到動畫的第一幀上。或者同時具有這兩個效果。 例如:讓動畫停在最一幀處。程式碼如下: animation-fill-mode:forwards;

好吧,CSS3 3D transform變換,不過如此,更多細節參考連結: www.zhangxinxu.com/wordpress/2…

相關文章