目前有愈來愈多的網站都使用animation,不管他們是用GIF,SVG,WebGL,視頻背景或者其餘形式展現。適當地使用動畫會讓網站更生動,互動性更好,爲用戶增長一個額外的反饋和體驗層。css
在本教程中我會向你介紹CSS動畫;隨着瀏覽器支持性的提升已經變得愈來愈流行了,css動畫在作一些事情上有很高的性能。在涵蓋了基礎知識後,咱們將建一個快速的例子:矩形變成圓形的動畫。html
演示看這裏css3
@keyframes和動畫 介紹web
css動畫的主要組件:@keyframes,建立動畫的css規則。把@keyframes想象爲動畫步驟的時間軸。在@keyframes裏,你能夠定義這些步驟,每一個都有不一樣的樣式聲明。瀏覽器
第二步,讓css動畫能運行,須要爲@keyframes綁定一個選擇符。基於這些步驟,@keyframes聲明的全部代碼都會變解析而後對新的樣式進行初始化。函數
這裏咱們將會設置動畫的步驟,@keyframes的屬性以下:性能
例子:動畫
@keyframes tutsFade {
網站
0%
{
opacity:
1
;
}
100%
{
opacity:
0
;
}
}
@keyframes tutsFade {
from {
opacity:
1
;
}
to {
opacity:
0
;
}
}
@keyframes tutsFade {
to {
opacity:
0
;
}
}
animation的屬性:spa
animation-name
: @keyframes名稱
(此例爲 tutsFade).animation-duration
:時間間隔,動畫從開始到結束的總長.animation-timing-function
: 設置動畫速度 ( linear | ease | ease-in | ease-out | ease-in-out | cubic-bezier ).animation-delay
:動畫開始前的延遲.animation-iteration-count
: 在動畫期間它會遍歷多少次.animation-direction
: 改變循環的方向,從開始到結束,仍是從結束到開始,或者二者都.animation-fill-mode
: 指定動畫結束時元素應用的樣式 ( none | forwards | backwards | both ).例如:
.element {
animation-name: tutsFade;
animation-duration:
4
s;
animation-delay:
1
s;
animation-iteration-count: infinite;
animation-timing-function: linear;
animation-
direction
: alternate;
}
.element {
animation: tutsFade
4
s
1
s infinite linear alternate;
}
在工做中,咱們須要使用瀏覽器指定前綴確保最好的瀏覽器支持。標準前綴應用:
-webkit-
-moz-
-o-
-ms-
動畫屬性使用了瀏覽器前綴的形式:
.element {
-webkit-animation: tutsFade
4
s
1
s infinite linear alternate;
-moz-animation: tutsFade
4
s
1
s infinite linear alternate;
-ms-animation: tutsFade
4
s
1
s infinite linear alternate;
-o-animation: tutsFade
4
s
1
s infinite linear alternate;
animation: tutsFade
4
s
1
s infinite linear alternate;
}
@-webkit-keyframes tutsFade {
/* your style */
}
@-moz-keyframes tutsFade {
/* your style */
}
@-ms-keyframes tutsFade {
/* your style */
}
@-o-keyframes tutsFade {
/* your style */
}
@keyframes tutsFade {
/* your style */
}
多動畫
使用逗號分割添加多動畫。爲tutsFade
元素添加回轉,咱們要聲明一個額外的@keyframes而後綁定到元素上:
.element {
animation: tutsFade
4
s
1
s infinite linear alternate,
tutsRotate
4
s
1
s infinite linear alternate;
}
@keyframes tutsFade {
to {
opacity:
0
;
}
}
@keyframes tutsRotate {
to {
transform: rotate(
180
deg);
}
}
這個例子中總共有五個步驟,每一個步驟將爲元素定義一個圓角,一個迴轉和不一樣的背景色,下面是實現的步驟和代碼。
首先建立一個標記,動畫的元素。甚至不用class,僅僅只用一個div:
<
div
></
div
>
而後運用元素選擇爲div添加樣式:
div {
width
:
200px
;
height
:
200px
;
background-color
: coral;
}
定義一個 @keyframes,命名爲square-to-circle,五個步驟以下:
@keyframes square-to-
circle
{
0%
{}
25%
{}
50%
{}
75%
{}
100%
{}
}
@-webkit-keyframes square-to-
circle
{
0%
{
border-radius:
0
0
0
0
;
}
25%
{
border-radius:
50%
0
0
0
;
}
50%
{
border-radius:
50%
50%
0
0
;
}
75%
{
border-radius:
50%
50%
50%
0
;
}
100%
{
border-radius:
50%
;
}
}
@keyframes square-to-
circle
{
0%
{
border-radius:
0
0
0
0
;
background
:coral;
}
25%
{
border-radius:
50%
0
0
0
;
background
:darksalmon;
}
50%
{
border-radius:
50%
50%
0
0
;
background
:indianred;
}
75%
{
border-radius:
50%
50%
50%
0
;
background
:lightcoral;
}
100%
{
border-radius:
50%
;
background
:darksalmon;
}
}
@keyframes square-to-
circle
{
0%
{
border-radius:
0
0
0
0
;
background
:coral;
transform:rotate(
0
deg);
}
25%
{
border-radius:
50%
0
0
0
;
background
:darksalmon;
transform:rotate(
45
deg);
}
50%
{
border-radius:
50%
50%
0
0
;
background
:indianred;
transform:rotate(
90
deg);
}
75%
{
border-radius:
50%
50%
50%
0
;
background
:lightcoral;
transform:rotate(
135
deg);
}
100%
{
border-radius:
50%
;
background
:darksalmon;
transform:rotate(
180
deg);
}
}
定義了square-to-circle動畫後,須要將它應用到div上:
div {
width
:
200px
;
height
:
200px
;
background-color
: coral;
animation: square-to-
circle
2
s
1
s infinite alternate;
}
動畫名:square-to-circle
.2s
.1s
.能夠爲animation添加的最後一個屬性是animation-timing-function
.定義移動的速度,加速或者減速。這個函數能夠是一個很是詳細的值,尷尬的手動計算,可是有不少免費的網站爲timing-function提供資源和在線定製。
例如:CSS Easing Animation Tool,如今來計算咱們的定時功能。
運用立方貝塞爾函數爲square-to-circle動畫添加伸縮效果。
div {
width
:
200px
;
height
:
200px
;
background-color
: coral;
animation: square-to-
circle
2
s
1
s infinite cubic-bezier(
1
,.
015
,.
295
,
1.225
) alternate;
}
-webkit-
,
-moz-
,
-ms-
,
-o-
) 的代碼以下:
div {
width
:
200px
;
height
:
200px
;
background-color
: coral;
animation: square-to-
circle
2
s .
5
s infinite cubic-bezier(
1
,.
015
,.
295
,
1.225
) alternate;
}
@keyframes square-to-
circle
{
0%
{
border-radius:
0
0
0
0
;
background
:coral;
transform:rotate(
0
deg);
}
25%
{
border-radius:
50%
0
0
0
;
background
:darksalmon;
transform:rotate(
45
deg);
}
50%
{
border-radius:
50%
50%
0
0
;
background
:indianred;
transform:rotate(
90
deg);
}
75%
{
border-radius:
50%
50%
50%
0
;
background
:lightcoral;
transform:rotate(
135
deg);
}
100%
{
border-radius:
50%
;
background
:darksalmon;
transform:rotate(
180
deg);
}
}
在現代瀏覽器中一切運行正常,可是在Firefox中渲染對象有點不足,邊緣會出現鋸齒:
幸運的是,有一個解決方法。在div上添加透明的outline以後Firefox就會完美地渲染!
outline
:
1px
solid
transparent
;