CSS3動畫(animation)

使元素從一種樣式逐漸變化另一種樣式的效果枷邪。
手機(jī)設(shè)備的瀏覽器在使用CSS3動畫時别伏,要加上webkit前綴

animation-name屬性

  • 概念:檢索或設(shè)置對象所應(yīng)用的動畫名稱
  • 語法:animation-name: keyframename | none;
  • 參數(shù):keyframename(指定要綁定到選擇器的關(guān)鍵幀的名稱)瀑志,none(沒有動畫)
div > .inner { background-image: url(images/circle_inner.png);
    // 給元素設(shè)定名叫circle_inner的動畫
    -webkit-animation-name: circle_inner;
            animation-name: circle_inner;
}

// 定義動畫circle_inner菌瘫,這個接下來會講到
@keyframes circle_inner {
    from { transform: rotateX(0deg);   }
    to   { transform: rotateX(360deg); }
}

animation-duration屬性

  • 概念:檢索或設(shè)置對象動畫的持續(xù)時間
  • 語法:animation-duration: time
  • 參數(shù):time指定動畫播放完成花費(fèi)的時間熊户,默認(rèn)為0,意味著沒有動畫效果
div > .inner { background-image: url(images/circle_inner.png);
    -webkit-animation-name: circle_inner;
            animation-name: circle_inner;
    // 設(shè)置動畫時間為10s
    -webkit-animation-duration: 10s;
            animation-duration: 10s;
}

animation-timing-function屬性

  • 概念:檢索或設(shè)置對象動畫的過渡類型
  • 語法:animation-timing-function: linear | ease | ease-in | ease-out | ease-in-out
  • 參數(shù):
    linear => 線性過渡验懊,均勻運(yùn)動
    ease => 平滑過渡,結(jié)束比較生硬尸变,默認(rèn)值
    ease-in => 由慢到快义图,結(jié)束比較生硬
    ease-out => 由快到慢
    ease-in-out => 由慢到快再到慢,這種效果比較人性化
div > .inner { background-image: url(images/circle_inner.png);
    -webkit-animation-name: circle_inner;
            animation-name: circle_inner;
    -webkit-animation-duration: 10s;
            animation-duration: 10s;
    // 設(shè)置動畫效果為線性過渡
    -webkit-animation-timing-function: linear;
            animation-timing-function: linear;
}

animation-delay屬性

  • 概念:檢索或設(shè)置對象動畫的延遲時間
  • 語法:animation-delay: time
  • 參數(shù):定義動畫開始前的等待時間召烂,以秒或毫秒計碱工,默認(rèn)值為0
div > .inner { background-image: url(images/circle_inner.png);
    -webkit-animation-name: circle_inner;
            animation-name: circle_inner;
    -webkit-animation-duration: 10s;
            animation-duration: 10s;
    -webkit-animation-timing-function: linear;
            animation-timing-function: linear;
    // 設(shè)置2s延遲之后再開始動畫
    -webkit-animation-delay: 2s;
            animation-delay: 2s;
}

animation-iteration-count屬性

  • 概念:檢索或設(shè)置對象動畫的循環(huán)次數(shù)
  • 語法:animation-iteration-count: infinite | <number>;
  • 參數(shù):<number>為數(shù)字,默認(rèn)是1奏夫;inifinite為無限次數(shù)循環(huán)
div > .inner { background-image: url(images/circle_inner.png);
    -webkit-animation-name: circle_inner;
            animation-name: circle_inner;
    -webkit-animation-duration: 10s;
            animation-duration: 10s;
    -webkit-animation-timing-function: linear;
            animation-timing-function: linear;
    -webkit-animation-delay: 2s;
            animation-delay: 2s;
    // 無限循環(huán)執(zhí)行動畫
    // 注意delay是動畫之外的時間怕篷,所以無限循環(huán)動畫的時候,中間并不會停下來
    -webkit-animation-iteration-count: infinite;
            animation-iteration-count: infinite;
}

animation-direction屬性

  • 概念:檢索或設(shè)置對象動畫在循環(huán)中是否反向運(yùn)動
  • 語法:animation-direction: normal | reverse | alternate | alternate-reverse | initial | inherit
  • 參數(shù):
    normal => 正常方向
    reverse => 反方向運(yùn)動
    alternate => 動畫先正常運(yùn)動再反方向運(yùn)動酗昼,并持續(xù)交替運(yùn)行
    alternate-reverse => 動畫先反運(yùn)動再正方向運(yùn)動廊谓,并持續(xù)交替運(yùn)行
div > .inner { background-image: url(images/circle_inner.png);
    -webkit-animation-name: circle_inner;
            animation-name: circle_inner;
    -webkit-animation-duration: 10s;
            animation-duration: 10s;
    -webkit-animation-timing-function: linear;
            animation-timing-function: linear;
    -webkit-animation-delay: 2s;
            animation-delay: 2s;
    -webkit-animation-iteration-count: infinite;
            animation-iteration-count: infinite;
    // 動畫先正常運(yùn)動再反方向運(yùn)動,并持續(xù)交替運(yùn)行
    -webkit-animation-direction: alternate;
            animation-direction: alternate;
}

animation-fill-mode屬性

  • 概念:規(guī)定當(dāng)動畫不播放時(當(dāng)動畫完成或動畫有延遲未開始播放時)麻削,要應(yīng)用到的元素的樣式
  • 語法:animation-fill-mode: none | forwards | backwards | both
  • 參數(shù):
    none => 默認(rèn)值蒸痹,不設(shè)置對象動畫之外的狀態(tài);
    forwards => 設(shè)置對象狀態(tài)為動畫結(jié)束時的狀態(tài)呛哟;
    backwards => 設(shè)置對象狀態(tài)為動畫開始時的狀態(tài)叠荠;
    both => 設(shè)置對象狀態(tài)為動畫結(jié)束或開始時的狀態(tài);
div > .inner { background-image: url(images/circle_inner.png);
    -webkit-animation-name: circle_inner;
            animation-name: circle_inner;
    -webkit-animation-duration: 10s;
            animation-duration: 10s;
    -webkit-animation-timing-function: linear;
            animation-timing-function: linear;
    -webkit-animation-delay: 2s;
            animation-delay: 2s;
    // 設(shè)置對象狀態(tài)為動畫結(jié)束時的狀態(tài)
    -webkit-animation-fill-mode: forwards;
            animation-fill-mode: forwards;
}

animation-play-state屬性

  • 概念:指定動畫是否正在運(yùn)行或已暫停
  • 語法:animation-play-state: paused | running
  • 參數(shù):paused(指定暫停動畫)扫责,running(指定正在運(yùn)行動畫榛鼎,默認(rèn)值)
div > .inner { background-image: url(images/circle_inner.png);
    -webkit-animation-name: circle_inner;
            animation-name: circle_inner;
    -webkit-animation-duration: 10s;
            animation-duration: 10s;
    -webkit-animation-timing-function: linear;
            animation-timing-function: linear;
    -webkit-animation-delay: 2s;
            animation-delay: 2s;
    -webkit-animation-iteration-count: infinite;
            animation-iteration-count: infinite;
    -webkit-animation-direction: alternate;
            animation-direction: alternate;
    -webkit-animation-fill-mode: forwards;
            animation-fill-mode: forwards;
    // 強(qiáng)制暫停動畫,無論之前寫了多少動畫,都不會有效果
    -webkit-animation-play-state: paused;
            animation-play-state: paused;
}

// 當(dāng)鼠標(biāo)移入的時候者娱,開始動畫
div:hover > div {
    cursor: pointer;
    -webkit-animation-play-state: running;
            animation-play-state: running;
}

animation屬性

  • 概念:復(fù)合屬性抡笼。檢索或設(shè)置對象所應(yīng)用的動畫特效。
  • 語法:animation: name duration timing-function delay iteration-count direction fill-mode play-state
  • 補(bǔ)充1:name和duration是必須的肺然,其他都是可選的
  • 補(bǔ)充2:如果只有一個時間值蔫缸,那么會認(rèn)為這個時間值是duration時間
  • 補(bǔ)充3:只有第一個name是固定的,后面的順序可以跟語法里的不一樣
div > .inner { background-image: url(images/circle_inner.png);
    -webkit-animation: circle_inner linear 10s infinite;
            animation: circle_inner linear 10s infinite;
}

關(guān)鍵幀

  • 概念:可以指定任何順序排列來決定Animation動畫變化的關(guān)鍵位置
  • 說明1:使用@keyframes規(guī)則創(chuàng)建動畫际起,通過逐步改變從一個CSS樣式設(shè)定到另一個拾碌。
  • 說明2:在動畫過程中可以通過@keyframes規(guī)則多次更改CSS樣式的設(shè)定
// 使用動畫
div > .inner { background-image: url(images/circle_inner.png);
    -webkit-animation: circle_inner linear 10s infinite;
            animation: circle_inner linear 10s infinite;
}

// 定義動畫
@-webkit-keyframes circle_inner {
    form   { transform: rotateX(0deg);   }  // 寫0%也可以
    25%    { transform: rotateX(45deg);  }
    75%    { transform: rotateX(315deg); }
    to     { transform: rotateX(360deg); }  // 寫100%也可以
}
@keyframes circle_inner {
    form   { transform: rotateX(0deg);   }
    25%    { transform: rotateX(45deg);  }
    75%    { transform: rotateX(315deg); }
    to     { transform: rotateX(360deg); }
}

will-change原理

思考:一個網(wǎng)頁有好幾張背景圖片組成,怎樣提高性能街望,滾屏的時候不會卡校翔?
方案:
1,position-fixed代替background-attachment
2灾前,帶圖片的元素放在偽元素中
3防症,巧用will-change

下面就來說說will-change
  • 目標(biāo):啟動GPU,以增強(qiáng)頁面渲染性能
  • 概念:提前通知瀏覽器元素將要做什么動畫哎甲,讓瀏覽器提前準(zhǔn)備合適的優(yōu)化設(shè)置
  • 語法:will-change: auto | scroll-position | contents | <custom-ident> | <animateable-feature>
  • 參數(shù):
    auto (沒有特定的意圖蔫敲,適用于它通常所做的任何優(yōu)化)
    scroll-position (表示將要改變元素的滾動位置)
    contents (表示將要改變元素的內(nèi)容)
    <custom-ident> (明確指定將要改變的屬性與給定的名稱,如transform) => 推薦使用
    <animateable-feature> (可動畫的一些特征值炭玫,比如left奈嘿,top,margin等 => 不推薦使用
div > div { position: absolute; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%; 
    margin: auto; background-repeat: no-repeat; background-position: center;
    -webkit-transition: transform 10s ease;
       -moz-transition: transform 10s ease;
        -ms-transition: transform 10s ease;
         -o-transition: transform 10s ease;
            transition: transform 10s ease;
}
div:hover {
    // 明確將要改變的屬性是transform
    // 放在父級元素的hover上吞加,這樣可以提升性能裙犹,因為沒有hover的時候,就釋放GPU了
    -webkit-will-change: transform;
       -moz-will-change: transform;
            will-change: transform;
}

注意:

  1. 勿濫用衔憨,不能在每個元素上都加上will-change
  2. 提前聲明
    CSS都加載好叶圃,當(dāng)有用戶操作的時候觸發(fā)變化,這是可以的
    頁面加載時践图,直接開始動畫掺冠,這種情況加will-change就沒什么用了。因為瀏覽器都要馬上開始動畫了平项,這時候啟用GPU已沒有多大意義
  3. remove
    盡量把will-chang加載hover這種跟用戶操作相關(guān)的地方赫舒。這樣用戶不操作,就不會啟用GPU闽瓢。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末接癌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扣讼,更是在濱河造成了極大的恐慌缺猛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荔燎,居然都是意外死亡耻姥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門有咨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琐簇,“玉大人,你說我怎么就攤上這事座享⊥裆蹋” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵渣叛,是天一觀的道長丈秩。 經(jīng)常有香客問我,道長淳衙,這世上最難降的妖魔是什么蘑秽? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮箫攀,結(jié)果婚禮上肠牲,老公的妹妹穿的比我還像新娘。我一直安慰自己靴跛,他們只是感情好埂材,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汤求,像睡著了一般。 火紅的嫁衣襯著肌膚如雪严拒。 梳的紋絲不亂的頭發(fā)上扬绪,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音裤唠,去河邊找鬼挤牛。 笑死,一個胖子當(dāng)著我的面吹牛种蘸,可吹牛的內(nèi)容都是我干的墓赴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼航瞭,長吁一口氣:“原來是場噩夢啊……” “哼诫硕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刊侯,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤章办,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體藕届,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挪蹭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了休偶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梁厉。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖踏兜,靈堂內(nèi)的尸體忽然破棺而出词顾,到底是詐尸還是另有隱情,我是刑警寧澤庇麦,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布计技,位于F島的核電站,受9級特大地震影響山橄,放射性物質(zhì)發(fā)生泄漏垮媒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一航棱、第九天 我趴在偏房一處隱蔽的房頂上張望睡雇。 院中可真熱鬧,春花似錦饮醇、人聲如沸它抱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽观蓄。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背安拟。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工弧械, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親克锣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354