最近一個小游戲項目用到了CSS3的動畫屬性,例如transition、transform、animation。經過三個星期,終於做完了,利用周末好好梳理總結一下。
- keyframes
這個屬性用來定義一系列關鍵幀。也就是在動畫運行的全過程中的一個個中間點。
Internet Explorer 10、Firefox 以及 Opera 支持 @keyframes 規則和 animation 屬性。
Chrome 和 Safari 需要前綴 -webkit-。
- animation的屬性
- animation 縮寫
animation: name duration timing-function delay iteration-count direction;
- 一些重點難點的理解
animation-delay
這個屬性是規定動畫開始前等待幾秒才開始。本來是很好理解的,但是當時就有個疑問:假如我的動畫是連續執行好多次的情況下的話,是第一次執行前才會延遲還是每次執行前都會延遲呢?答案是:只有第一次會。
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>delay</title> 6 <meta name="viewport" content="width=device-width, initial-scale=1" /> 7 8 <style type="text/css"> 9 @-webkit-keyframes delay{ 10 11 99%{ 12 -webkit-transform:translate(100px,0); 13 } 14 15 } 16 .delay{ 17 18 width:100px;height:100px; 19 background-color: #000; 20 -webkit-animation:delay 1s linear 2s infinite; 21 animation:delay 1s linear 2s infinite; 22 } 23 </style> 24 </head> 25 <body> 26 <div class="delay"></div> 27 </body> 28 </html>
- animation-fill-mode
該屬性有四個值
none:默認值。不設置對象動畫之外的狀態
forwards:設置對象狀態為動畫結束時的狀態
backwards:設置對象狀態為動畫開始時的狀態
both:設置對象狀態為動畫結束或開始的狀態
一開始比較糾結着三個到底有什么區別。網上也找了,發現網上說的有點錯誤。起碼我試了一下forwards和both的效果是一模一樣的。都是動畫運行完了停在哪里就是哪里。至於backwards,就是總停在一開始的狀態。
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>delay</title> 6 <meta name="viewport" content="width=device-width, initial-scale=1" /> 7 8 <style type="text/css"> 9 @-webkit-keyframes delay{ 10 11 100%{ 12 -webkit-transform:translate(100px,0); 13 } 14 15 } 16 .delay{ 17 18 width:100px;height:100px; 19 background-color: #000; 20 -webkit-animation:delay 1s linear 2 forwards alternate; 21 } 22 </style> 23 </head> 24 <body> 25 <div class="delay"></div> 26 </body> 27 </html>
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>delay</title> 6 <meta name="viewport" content="width=device-width, initial-scale=1" /> 7 8 <style type="text/css"> 9 @-webkit-keyframes delay{ 10 11 100%{ 12 -webkit-transform:translate(100px,0); 13 } 14 15 } 16 .delay{ 17 18 width:100px;height:100px; 19 background-color: #000; 20 -webkit-animation:delay 1s linear 2 both alternate; 21 } 22 </style> 23 </head> 24 <body> 25 <div class="delay"></div> 26 </body> 27 </html>
兩段代碼主要說明在forwards和both的情況下動畫在設置了反向運行偶次數時,效果仍然一樣。因為之前看到網上說的是forwards在偶次數反向是會停在關鍵幀的100%處,而不是0%處。
- iteration-count
運行次數。
這個本來沒什么好說的,一目了然,但是無意中發現,有以下的特殊情況:
不能為負數
可以為0 為0的時候,按1來算
可以為小數 小數的時候,不會取整。而是多少就運行多少,比如 .5 就運行到50%的位置。 - 事件
在動畫的世界里,總有這樣的需求,就是某個動畫結束了之后才進行下一個動畫,這個時候就要知道上一個動畫是什么時候結束的了。雖然可以用setTimeout來計時達到差不多的效果,但是總感覺不夠精確。
還好,CSS3的動畫有js事件。
開始:animationstart
迭代:animationiteration
結束:animationend
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>delay</title> 6 <meta name="viewport" content="width=device-width, initial-scale=1" /> 7 8 <style type="text/css"> 9 @-webkit-keyframes delay{ 10 11 100%{ 12 -webkit-transform:translate(100px,0); 13 } 14 15 } 16 .delay{ 17 18 width:100px;height:100px; 19 background-color: #000; 20 -webkit-animation:delay 1s linear 2 both alternate; 21 } 22 </style> 23 </head> 24 <body> 25 <div class="delay"></div> 26 <script type="text/javascript"> 27 window.onload = function(){ 28 var delay = document.getElementsByClassName('delay')[0], 29 time1, 30 time2; 31 delay.addEventListener('webkitAnimationStart',function(){ 32 time1 = new Date().getTime(); 33 time2 = time1; 34 console.log(time2-time1+'ms') 35 36 }) 37 delay.addEventListener('webkitAnimationIteration',function(){ 38 time2 = new Date().getTime(); 39 console.log(time2-time1+'ms') 40 }) 41 delay.addEventListener('webkitAnimationEnd',function(){ 42 time2 = new Date().getTime(); 43 console.log(time2-time1+'ms') 44 }) 45 } 46 </script> 47 </body> 48 </html>
從代碼可以看出,iteration是在動畫重復執行的時候觸發的。