原文:A Beginner’s Introduction to CSS Animationcss
譯文:一個初學者對CSS動畫的介紹html
譯者:dwqscss3
如今,愈來愈多的網站使用了動畫,而且形式多樣,如GIF、SVG、WebGL、背景視頻等等。當在web中恰當使用動畫時,它能夠給網站注入活力和良好的交互性,給用戶提供額外的一層反饋和體驗。web
在這篇文章,我將向你介紹CSS動畫,隨着瀏覽器對動畫支持的改善,一種高效率的作事方式變得愈來愈流行。考慮到基礎知識,我將快速創建一個從正方形變成圓形的動畫案例。chrome
先看看效果:http://jsfiddle.net/Web_Code/tchoafyh/embedded/result/瀏覽器
CSS動畫主要的組件是@keyframes,這個規則就是用來建立動畫的。將@keyframes看成是時間軸的不一樣階段,在其內部,你能夠自定義時間軸的不一樣階段,每一個階段有不一樣的CSS聲明。函數
而後,爲了使CSS動畫生效,須要將@keyframes和一個選擇器綁定。最後將會逐漸解析@keyframes內的所有代碼,以階段爲劃分,慢慢改變把最初的樣式變成新的樣式。工具
首先,定義動畫的分隔。@keyframes的屬性以下:動畫
一、選擇一個名字(在案例我選擇tutsFade)網站
二、階段劃分:0%–100%,從0%到100%
三、CSS樣式:你想要在每個階段用到的樣式
例如:
@keyframe tutsFade{ 0%{ opacity:1; } 100%{ opacity:0; } } 或者: @keyframe tutsFade{ from{ opacity:1; } to{ opacity:0; } }
還有一種簡寫形式:
@keyframe tutsFade{ to{ opacity:0; } }
上述代碼將對元素的透明度應用一個過渡效果:從1到0,三種方式最終的效果相同。
Animation做爲一個選擇器去調用@keyframes。Animation有不少的屬性:
一、animation-name:@keyframes的名字(例如tutsFade)
二、animation-duration:動畫持續的時間
三、animation-timing-function:設置動畫的速度特效,能夠選擇linear/ease-in/ease/ease-out/ease-in-out/cubic-bezier
四、animation-delay:動畫開始以前的時間延遲
五、animation-iteration-count:動畫循環的次數
六、animation-direction:規定動畫是否反向輪播,normal是默認值,正常播放;alternate表示動畫反向輪播
七、animation-fill-mode:規定動畫在播放以前或以後,其動畫效果是否可見(none/forwards/backwards/both)
例如:
.element { animation-name: tutsFade; animation-duration: 4s; animation-delay: 1s; animation-iteration-count: infinite; animation-timing-function: linear; animation-direction: alternate; }
簡寫:
.element { animation: tutsFade 4s 1s infinite linear alternate; }
須要添加特定瀏覽器的私有前綴以確保最好的瀏覽器支持:chrome&Safari:-webkit-;Firefox:-moz-;Opera:-o-;IE:-ms-
修改以下:
.element { -webkit-animation: tutsFade 4s 1s infinite linear alternate; -moz-animation: tutsFade 4s 1s infinite linear alternate; -ms-animation: tutsFade 4s 1s infinite linear alternate; -o-animation: tutsFade 4s 1s infinite linear alternate; animation: tutsFade 4s 1s infinite linear alternate; }
@keyframes也同樣
@-webkit-keyframes tutsFade { /* your style */ } @-moz-keyframes tutsFade { /* your style */ } @-ms-keyframes tutsFade { /* your style */ } @-o-keyframes tutsFade { /* your style */ } @keyframes tutsFade { /* your style */ }
爲了獲得更多瀏覽器供應商的私有前綴,你能夠去http://css3please.com/,查找,上面提供了很是豐富的資源。
能夠添加多個動畫,各個動畫之間用逗號分隔。
.element { animation: tutsFade 4s 1s infinite linear alternate, tutsRotate 4s 1s infinite linear alternate; } @keyframes tutsFade { to { opacity: 0; } } @keyframes tutsRotate { to { transform: rotate(180deg); } }
利用上面的規則,我將建立一個簡單的圖形動畫。總共會有5個階段,而且在每一個階段都會對元素定義不一樣的Border-radius,rotation和background-color。
div { width: 200px; height: 200px; background-color: coral; }
建立一個名爲square-to-circle的keyframe元素,包含5個階段
@keyframes square-to-circle { 0% { border-radius:0 0 0 0; background:coral; transform:rotate(0deg); } 25% { border-radius:50% 0 0 0; background:darksalmon; transform:rotate(45deg); } 50% { border-radius:50% 50% 0 0; background:indianred; transform:rotate(90deg); } 75% { border-radius:50% 50% 50% 0; background:lightcoral; transform:rotate(135deg); } 100% { border-radius:50%; background:darksalmon; transform:rotate(180deg); } }
將定義的動畫應用以前的div
div { width: 200px; height: 200px; background-color: coral; animation: square-to-circle 2s 1s infinite alternate; }
最後要添加的一個動畫屬性是animation-timing-function,它對動畫元素的速度、加速和減速進行定義。一個相似的工具是:CSS Easing Animation Tool,可使用它來計算時間函數。
在案例中,我給動畫添加了一個cubic-bezier函數。
div { width: 200px; height: 200px; background-color: coral; animation: square-to-circle 2s 1s infinite cubic-bezier(1,.015,.295,1.225) alternate; }
爲了保證最好的瀏覽器支持,還必須添加私有前綴(沒有添加前綴的代碼以下)
div { width: 200px; height: 200px; background-color: coral; animation: square-to-circle 2s .5s infinite cubic-bezier(1,.015,.295,1.225) alternate; } @keyframes square-to-circle { 0% { border-radius:0 0 0 0; background:coral; transform:rotate(0deg); } 25% { border-radius:50% 0 0 0; background:darksalmon; transform:rotate(45deg); } 50% { border-radius:50% 50% 0 0; background:indianred; transform:rotate(90deg); } 75% { border-radius:50% 50% 50% 0; background:lightcoral; transform:rotate(135deg); } 100% { border-radius:50%; background:darksalmon; transform:rotate(180deg); } }
這個在FireFox顯示會有點異常,爲了在FireFox有絕佳的顯示效果,能夠給div添加以下樣式
outline: 1px solid transparent;