
陽春三月,人好,物好,心情好. 差不多也是get新技能的時期. 作為一名能力者,我們將目標(biāo)鎖定到了css3 animation中. 眾所周知, 自從css3 加入了 3d硬件加速 就變的叼的一b 動畫執(zhí)行線程單獨獨立執(zhí)行,使得我們觸碰到了GPU這個神奇的東西, 性能一下子提高八度. 眾多場景應(yīng)用 微應(yīng)用 營銷活動 充斥在我們的朋友圈中. css3動畫雖然 上手簡單 隨便都能搞一發(fā) , 但是想要得心應(yīng)手 運用自如還是需要 一定的深度的, 下拉我們來看下 我們需要 掌握 css3動畫 中的那些能力.
串行動畫
栗子 : 我們有一個盒子,我希望它能夠平移一段距離,然后旋轉(zhuǎn),縮放,漸隱掉.
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 逗號分隔的特性來實現(xiàn).這種寫法非常獨特的優(yōu)勢在與
- 代碼可讀性強
- 定義好的keyframes動畫可以被復(fù)用,
- 保你分分鐘內(nèi)搞定一串動畫
理想很美好,現(xiàn)實卻是殘酷的,運行上面的代碼,我們發(fā)現(xiàn)動畫并不是我們想象中的那樣,只有slideRight能正常執(zhí)行完成.
問題:
- slideRight 使用的是
-webkit-transform : translate(200px); - rotate360 使用的是
-webkit-transform : rotate(360deg); - lessen使用的是
-webkit-transform : scale(0.5);
當(dāng)后一個動畫的執(zhí)行的時候 會覆蓋掉前一個動畫的transform.
我們后一個動畫執(zhí)行的時候 需要帶上前一個動畫的結(jié)束幀transform
如下解:
<pre>
@include keyframes (rotate360){
0%{
-webkit-transform : translate(200px) rotate(0deg);
}
100%{
-webkit-transform : translate(200px) rotate(360deg);
}
</pre>
2.標(biāo)簽流(label)
此法是為了解上述描述的弊端, 通過嵌套標(biāo)簽來實現(xiàn)動畫
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>
動畫執(zhí)行的順序是按照 標(biāo)簽的順序來定的.
從translate 到 rotate 到 lessen 到 fadeOut. 比較完美,
但要注意動畫的執(zhí)行順序和標(biāo)簽結(jié)構(gòu)順序要一致 !important
- 好處不用說,動畫可復(fù)用.
- 結(jié)構(gòu)清晰
- 復(fù)雜動畫導(dǎo)致dom結(jié)構(gòu)過深
PS : 使用標(biāo)簽流制作的時候 如果元素絕對定位的屬性 請放在最外層標(biāo)簽上面
<p>
標(biāo)簽流的適用場景 適合簡單輕快的動畫
3.keyframes流
復(fù)雜型動畫 這類動畫基本不需要復(fù)用
<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預(yù)處理工具生成. 借助sass我們可以盡情的去使用這張王牌.
sass來執(zhí)行
<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 流非常適合復(fù)雜的動畫,它不具備 復(fù)用型,寫法也夠粗暴
- 復(fù)雜動畫王牌
- 終極手段
- 復(fù)用差 一次性frames
復(fù)雜動畫的王牌
3種流派 各有所長,我們在實際項目中需要靈活運用;
- 使用標(biāo)簽流完成 可復(fù)用的動畫
- 制作單一復(fù)雜動畫的時候,請選擇王牌keyframes
- 適當(dāng)使用逗號流也有奇效
實際項目案例

知了是一款k12的輕社交產(chǎn)品
http://imzhiliao.com