1. 調(diào)用動畫
定義好動畫之后就需要在想要的位置去調(diào)用啦,先來學習一下動畫調(diào)用的語法:
animation: name duration timing-function delay iteration-count direction fill-mode;
當然寫的時候可絕對不是這么寫的啊,只有冒號前面的animation
這個單詞不變,剩下單詞全部都要替換,那么要替換成什么呢?
請看中文翻譯版:
animation: 定義過的動畫名 動畫時長 動畫運行的方式 延遲 動畫次數(shù) 動畫方向 填充模式;
是不是看到這里直接暈了,甚至有種想關掉網(wǎng)頁的沖動?不要怕,這些只是看起來嚇人,其實都是紙老虎。
而且也不是這些屬性都要用到,哪個屬性你用不到就可以不寫,通常我們只會用到幾個常用的。
2. 極簡形式
先說說最最簡單的一種方式,看了絕對不懵圈的那種:
animation: name duration;
翻譯如下:
animation: 定義過的動畫名 動畫時長;
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Animate</title>
<style>
/* 清除瀏覽器默認邊距 */
* { padding: 0; margin: 0; }
/* 這段代碼是為了居中顯示,不是重點,看不懂的話可以無視 */
body {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
/* 定義動畫:動畫名(change-color) */
@keyframes change-color {
from /* 0% */ { color: red } /* 紅 */
16% { color: orange } /* 橙 */
32% { color: yellow } /* 黃 */
48% { color: green } /* 綠 */
64% { color: cyan } /* 青 */
80% { color: blue } /* 藍 */
to /* 100% */ { color: purple } /* 紫 */
}
.animate {
width: 300px;
height: 100px;
/* 再使用預先定義好的動畫 */
animation: change-color 10s;
/* 動畫:動畫名(change-color) 時長(10秒) */
}
</style>
</head>
<body>
<div class="animate">
<!-- 動畫:動畫名(change-color) 時長(10秒) -->
animation: change-color 10s;
</div>
</body>
</html>
運行結(jié)果:
可以看出整段文字按照咱們定義的 change-color 動畫來運行:赤橙黃綠青藍紫一共十秒,但十秒過后字變黑了,因為這段字默認的顏色本來就是黑色的。
3. 無限循環(huán)
如果我們不想讓它結(jié)束,那就十秒過后再來十秒,十秒完再十秒,無限重復、無限循環(huán):
animation: name duration iteration-count;
翻譯過來就是:
animation: 定義過的動畫名 動畫時長 動畫次數(shù);
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Animate</title>
<style>
/* 清除瀏覽器默認邊距 */
* { padding: 0; margin: 0; }
/* 這段代碼是為了居中顯示,不是重點,看不懂的話可以無視 */
body {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
/* 先定義動畫,動畫名叫:change-color */
@keyframes change-color {
from /* 0% */ { color: red } /* 紅 */
16% { color: orange } /* 橙 */
32% { color: yellow } /* 黃 */
48% { color: green } /* 綠 */
64% { color: cyan } /* 青 */
80% { color: blue } /* 藍 */
to /* 100% */ { color: purple } /* 紫 */
}
.animate {
width: 400px;
height: 100px;
/* 再使用預先定義好的動畫 */
animation: change-color 10s infinite;
/* 動畫:動畫名(change-color) 時長(10秒) 動畫次數(shù)(無限) */
}
</style>
</head>
<body>
<div class="animate">
<!-- 動畫:動畫名(change-color) 時長(10秒) 動畫次數(shù)(無限) -->
animation: change-color 10s infinite;
</div>
</body>
</html>
運行結(jié)果:
- 運行次數(shù)可以寫具體的數(shù)字,動畫會根據(jù)你寫的數(shù)字來運行相應的次數(shù),想要無限運行的話就寫infinite
雖然成功的無限循環(huán)了,但是目前看來有個缺點,那就是最后一幀紫色結(jié)束后突然就變成了第一幀的紅色,沒有任何的過渡效果。
有兩個解決方案:
1. 定義動畫的時候最后一幀再變回紅色:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Animate</title>
<style>
/* 清除瀏覽器默認邊距 */
* { padding: 0; margin: 0; }
/* 這段代碼是為了居中顯示,不是重點,看不懂的話可以無視 */
body {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
/* 先定義動畫,動畫名叫:change-color */
@keyframes change-color {
from /* 0% */ { color: red } /* 紅 */
13% { color: orange } /* 橙 */
26% { color: yellow } /* 黃 */
39% { color: green } /* 綠 */
52% { color: cyan } /* 青 */
65% { color: blue } /* 藍 */
78% { color: purple } /* 紫 */
to /* 100% */ { color: red } /* 最后一幀和第一幀的樣式一致 */
}
.animate {
width: 400px;
height: 100px;
/* 再使用預先定義好的動畫 */
animation: change-color 6s infinite;
/* 動畫:動畫名(change-color) 時長(6秒) 動畫次數(shù)(無限) */
}
</style>
</head>
<body>
<div class="animate">
<!-- 動畫:動畫名(change-color) 時長(6秒) 動畫次數(shù)(無限) -->
animation: change-color 6s infinite;
</div>
</body>
</html>
運行結(jié)果:
2. 交替動畫
什么是交替動畫呢?簡單來說就是從第一幀紅到最后一幀紫運行完了之后,再從最后一幀紫到第一幀紅,然后再從紅到紫、從紫到紅,大紅大紫。
這種動畫就不用最后一幀再定義回第一幀的紅色了,直接定義從紅到紫即可。來看看語法:
animation: 定義過的動畫名 動畫時長 動畫次數(shù) 動畫方向;
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Animate</title>
<style>
/* 清除瀏覽器默認邊距 */
* { padding: 0; margin: 0; }
/* 這段代碼是為了居中顯示,不是重點,看不懂的話可以無視 */
body {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
/* 先定義動畫,動畫名叫:change-color */
@keyframes change-color {
from /* 0% */ { color: red } /* 紅 */
to /* 100% */ { color: purple } /* 為了方便直接從紅到紫 */
}
.animate {
width: 450px;
height: 100px;
/* 再使用預先定義好的動畫 */
animation: change-color 1s infinite alternate;
/* 動畫:動畫名(change-color) 時長(1秒) 動畫次數(shù)(無限) 動畫方向(交替運行) */
}
</style>
</head>
<body>
<div class="animate">
<!-- 動畫:動畫名(change-color) 時長(1秒) 動畫次數(shù)(無限) 動畫方向(交替運行) -->
animation: change-color 1s infinite alternate;
</div>
</body>
</html>
運行結(jié)果:
4. 幀動畫
語法:
animation: 定義過的動畫名 動畫時長 動畫運行的方式;
動畫運行的方式要用到steps這個函數(shù)。
看起來可能有點暈,但是我們寫成英文看起來就會好很多:
animation: change-color 7s steps(10);
這里面唯一一個新鮮詞就是steps,這個steps后面要寫上小括號,括號里面就是這次動畫要按照多少幀來運行,來看個具體的案例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Animate</title>
<style>
/* 清除瀏覽器默認邊距 */
* { padding: 0; margin: 0; }
/* 這段代碼是為了居中顯示,不是重點,看不懂的話可以無視 */
body {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
/* 先定義動畫,動畫名叫:change-color */
@keyframes change-color {
from /* 0% */ { color: red } /* 紅 */
16% { color: orange } /* 橙 */
32% { color: yellow } /* 黃 */
48% { color: green } /* 綠 */
64% { color: cyan } /* 青 */
80% { color: blue } /* 藍 */
to /* 100% */ { color: purple } /* 紫 */
}
.animate {
width: 400px;
height: 100px;
/* 再使用預先定義好的動畫 */
animation: change-color 7s steps(1);
/* 動畫:動畫名(change-color) 時長(7秒) 動畫運行的方式(steps(1)) */
}
</style>
</head>
<body>
<div class="animate">
<!-- 動畫:動畫名(change-color) 時長(7秒) 動畫運行的方式(steps(1)) -->
animation: change-color 7s steps(1);
</div>
</body>
</html>
運行結(jié)果:
可以看到這就按照我們所設想的那樣:紅、橙、黃、綠、青、藍、紫……
咦?紫呢?怎么最后直接跳過紫色直接就進入黑色了呢?
原來,這里涉及到了一個幀動畫里面一個難以理解的點,在講這點之前我們先來看結(jié)論,這樣的話即使沒弄懂到底是怎么一回事也可以直接記住結(jié)論,讓動畫按照我們預先設想的那樣去運行。
4.1 非循環(huán)式幀動畫
語法:
animation: 動畫名 時長 step-end both;
來看具體案例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Animate</title>
<style>
/* 清除瀏覽器默認邊距 */
* { padding: 0; margin: 0; }
/* 這段代碼是為了居中顯示,不是重點,看不懂的話可以無視 */
body {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
/* 先定義動畫,動畫名叫:change-color */
@keyframes change-color {
from { color: red }
16% { color: orange }
32% { color: yellow }
48% { color: green }
64% { color: cyan }
80% { color: blue }
to { color: purple }
}
.animate {
width: 450px;
height: 100px;
/* 再使用預先定義好的動畫 */
animation: change-color 7s step-end both;
/* 動畫:動畫名(change-color) 時長(7秒) 動畫運行的方式(step-end) 填充模式(雙向) */
}
</style>
</head>
<body>
<div class="animate">
<!-- 動畫:動畫名(change-color) 時長(7秒) 動畫運行的方式(step-end) 填充模式(雙向)-->
animation: change-color 7s step-end both;
</div>
</body>
</html>
運行結(jié)果:
可以看到成功了,紫色出來了,而且永遠都不會再回到默認的黑色了。
這究竟是怎么一回事呢?step-end和both這兩個單詞到底是什么意思呢?
先不要著急,咱們先把結(jié)論記下來,原理放到后面講。
4.2 循環(huán)式幀動畫
語法:
animation: 動畫名 時長 step-end infinite;
除了在調(diào)用動畫的語法上最后一個單詞不一樣,其實主要區(qū)別在于定義動畫時,定義動畫的時候可以多加一幀,來看具體案例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Animate</title>
<style>
/* 清除瀏覽器默認邊距 */
* { padding: 0; margin: 0; }
/* 這段代碼是為了居中顯示,不是重點,看不懂的話可以無視 */
body {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
/* 先定義動畫,動畫名叫:change-color */
@keyframes change-color {
from { color: red }
14% { color: orange }
28% { color: yellow }
42% { color: green }
56% { color: cyan }
70% { color: blue }
84% { color: purple }
to { color: aquamarine }
}
.animate {
width: 450px;
height: 100px;
/* 再使用預先定義好的動畫 */
animation: change-color 7s step-end infinite;
/* 動畫:動畫名(change-color) 時長(7秒) 動畫運行的方式(step-end) 動畫次數(shù)(無限) */
}
</style>
</head>
<body>
<div class="animate">
<!-- 動畫:動畫名(change-color) 時長(7秒) 動畫運行的方式(step-end) 動畫次數(shù)(無限)-->
animation: change-color 7s step-end infinite;
</div>
</body>
</html>
運行結(jié)果:
反正最后一幀出不來,那我們直接就在最后多加一幀不就得了,最后一幀寫什么都可以,反正最后一幀就像空氣一樣——你永遠也看不到。
5. 小結(jié)
學會了這一章,你就已經(jīng)可以實現(xiàn)一些簡單的動畫效果了,但是為什么最后一幀會消失呢?
這和 steps
函數(shù)的運行機制有關,其實它的原理并不復雜,但就是因為不符合人類的直覺導致許多人無法理解。
接下來的章節(jié)我們就來深入的理解一下這個神秘的 steps
函數(shù)。