手寫CSS3動畫的幾種流派

陽春三月,人好,物好,心情好. 差不多也是get新技能的時期. 作為一名能力者,我們將目標鎖定到了css3 animation中. 眾所周知, 自從css3 加入了 3d硬件加速 就變的叼的一b 動畫執行線程單獨獨立執行,使得我們觸碰到了GPU這個神奇的東西, 性能一下子提高八度. 眾多場景應用 微應用 營銷活動 充斥在我們的朋友圈中. css3動畫雖然 上手簡單 隨便都能搞一發 , 但是想要得心應手 運用自如還是需要 一定的深度的, 下拉我們來看下 我們需要 掌握 css3動畫 中的那些能力.

串行動畫

栗子 : 我們有一個盒子,我希望它能夠平移一段距離,然后旋轉,縮放,漸隱掉.

1.逗號流(comma)

<pre>

-webkit-animation :
slideRight 1s ease 0s both,
rotate360 1s linear 0.8s forwards,
lessen 1s ease 1.8s forwards,
fadeOut 1s ease 2.8s forwards;

</pre>

借助animation 逗號分隔的特性來實現.這種寫法非常獨特的優勢在與

  • 代碼可讀性強
  • 定義好的keyframes動畫可以被復用,
  • 保你分分鐘內搞定一串動畫

理想很美好,現實卻是殘酷的,運行上面的代碼,我們發現動畫并不是我們想象中的那樣,只有slideRight能正常執行完成.

問題:

  • slideRight 使用的是 -webkit-transform : translate(200px);
  • rotate360 使用的是 -webkit-transform : rotate(360deg);
  • lessen使用的是 -webkit-transform : scale(0.5);

當后一個動畫的執行的時候 會覆蓋掉前一個動畫的transform.
我們后一個動畫執行的時候 需要帶上前一個動畫的結束幀transform

如下解:
<pre>

@include keyframes (rotate360){
0%{
-webkit-transform : translate(200px) rotate(0deg);
}

100%{
-webkit-transform : translate(200px) rotate(360deg);
}

</pre>

2.標簽流(label)

此法是為了解上述描述的弊端, 通過嵌套標簽來實現動畫

HTML
<pre>

<div class="translate ib animate">
<div class="rotate ib animate">
<div class="lessen ib animate">
<div class="fadeOut ib animate">
<div class="box"></div>
</div>
</div>
</div>
</div>

</pre>

CSS
<pre>

.translate {
-webkit-animation: slideRight 1s ease 0s both;
-ms-animation: slideRight 1s ease 0s both;
-moz-animation: slideRight 1s ease 0s both;
-o-animation: slideRight 1s ease 0s both;
animation: slideRight 1s ease 0s both; }

.rotate {
-webkit-animation: rotate360 1s linear 0.8s both;
-ms-animation: rotate360 1s linear 0.8s both;
-moz-animation: rotate360 1s linear 0.8s both;
-o-animation: rotate360 1s linear 0.8s both;
animation: rotate360 1s linear 0.8s both; }

.lessen {
-webkit-animation: lessen 1s ease 1.8s both;
-ms-animation: lessen 1s ease 1.8s both;
-moz-animation: lessen 1s ease 1.8s both;
-o-animation: lessen 1s ease 1.8s both;
animation: lessen 1s ease 1.8s both; }

.fadeOut {
-webkit-animation: fadeOut 1s ease 2.8s both;
-ms-animation: fadeOut 1s ease 2.8s both;
-moz-animation: fadeOut 1s ease 2.8s both;
-o-animation: fadeOut 1s ease 2.8s both;
animation: fadeOut 1s ease 2.8s both; }

</pre>

keyframes

這里為了便于顯示貼了sass的代碼
<pre>

@include keyframes(lessen){
0%{
-webkit-transform : scale(1);
}

100%{
-webkit-transform : scale(0.5);
}
}

@include keyframes(fadeOut){
0%{
opacity: 1;
}

100%{
opacity: 0;
}
}

@include keyframes (rotate360){
0%{
-webkit-transform : rotate(0deg);
}

100%{
-webkit-transform : rotate(360deg);
}
}

@include keyframes (slideRight){

0%{
-webkit-transform : translate(0);
}

100%{
-webkit-transform : translate(200px);
}
}

</pre>

動畫執行的順序是按照 標簽的順序來定的.
從translate 到 rotate 到 lessen 到 fadeOut. 比較完美,
但要注意動畫的執行順序和標簽結構順序要一致 !important

  • 好處不用說,動畫可復用.
  • 結構清晰
  • 復雜動畫導致dom結構過深

PS : 使用標簽流制作的時候 如果元素絕對定位的屬性 請放在最外層標簽上面

<p>

標簽流的適用場景 適合簡單輕快的動畫

3.keyframes流

復雜型動畫 這類動畫基本不需要復用

<pre>
@-webkit-keyframes kfc-ani {
0% {
-webkit-transform: translate(0px) rotate(0deg) scale(1);
transform: translate(0px) rotate(0deg) scale(1);
-moz-transform: translate(0px) rotate(0deg) scale(1);
-ms-transform: translate(0px) rotate(0deg) scale(1); }
33.33333% {
-webkit-transform: translate(200px) rotate(0deg) scale(1);
transform: translate(200px) rotate(0deg) scale(1);
-moz-transform: translate(200px) rotate(0deg) scale(1);
-ms-transform: translate(200px) rotate(0deg) scale(1); }
66.66667% {
-webkit-transform: translate(200px) rotate(360deg) scale(1);
transform: translate(200px) rotate(360deg) scale(1);
-moz-transform: translate(200px) rotate(360deg) scale(1);
-ms-transform: translate(200px) rotate(360deg) scale(1); }
100.0% {
-webkit-transform: translate(200px) rotate(360deg) scale(0.5);
transform: translate(200px) rotate(360deg) scale(0.5);
-moz-transform: translate(200px) rotate(360deg) scale(0.5);
-ms-transform: translate(200px) rotate(360deg) scale(0.5); }
}
</pre>

這代碼是否夠酸爽,以上都是由css預處理工具生成. 借助sass我們可以盡情的去使用這張王牌.

sass來執行

<pre>
$keys :
(name : transform,value : translate(0px) rotate(0deg) scale(1),dur : 0s),
(name : transform,value : translate(200px) rotate(0deg) scale(1),dur : 1s),
(name : transform,value : translate(200px) rotate(360deg) scale(1),dur : 1s),
(name : transform,value : translate(200px) rotate(360deg) scale(0.5),dur : 1s);

.kfc-ani{
-webkit-animation : kfc-ani 4s ease 0s both;
}

@include kfc($keys,kfc-ani);
</pre>

keyframes 流非常適合復雜的動畫,它不具備 復用型,寫法也夠粗暴

  • 復雜動畫王牌
  • 終極手段
  • 復用差 一次性frames

復雜動畫的王牌

3種流派 各有所長,我們在實際項目中需要靈活運用;

  1. 使用標簽流完成 可復用的動畫
  2. 制作單一復雜動畫的時候,請選擇王牌keyframes
  3. 適當使用逗號流也有奇效

實際項目案例

知了是一款k12的輕社交產品
http://imzhiliao.com

源碼git

https://github.com/sherlock221/AnimationMultiple

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內容

  • 選擇qi:是表達式 標簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    love2013閱讀 2,326評論 0 11
  • 選擇qi:是表達式 標簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    wzhiq896閱讀 1,785評論 0 2
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    前端進階之旅閱讀 114,536評論 24 450
  • 1、屬性選擇器:id選擇器 # 通過id 來選擇類名選擇器 . 通過類名來選擇屬性選擇器 ...
    Yuann閱讀 1,652評論 0 7
  • 在這篇文章中崔老師精煉概括了教學中老師的任務:精心設計,全心投入,用心組織,認真傾聽,因勢利導,小結歸納,深化拓展。
    心中有善閱讀 164評論 0 0