首頁 > web前端 > css教學 > css3常用屬性animation-play-state的使用技巧

css3常用屬性animation-play-state的使用技巧

高洛峰
發布: 2017-02-22 13:01:42
原創
1560 人瀏覽過

animation-play-state介紹

animation-play-state 屬性規定動畫正在運作還是暫停。

p{animation-play-state:paused;-webkit-animation-play-state:paused; /* Safari 和 Chrome */}
登入後複製

瀏覽器支援:
Internet Explorer 10Firefox 以及Opera 支援animation-play-state 屬性。
Safari Chrome 支援替代的 -webkit-animation-play-state 屬性。
註解:Internet Explorer 9 以及更早的版本不支援 animation-play-state 屬性。

語法:animation-play-state: paused|running;
paused    規定動畫已暫停。
running    規定動畫正在播放。

下面來講解一下animation-play-state的使用技巧。
註:範例程式碼的私有前綴都省略,大家自行腦補

使用animation-play-state控制每螢幕動畫播放

1 . 類別名稱active與動畫觸發
首先,使用active觸發每一螢幕的動畫,幾乎已經約定俗成,應該也建議成為預設的行業規範。
一般做法是,當對應一螢幕內容進入的時候,使用JS為容器加上類別名稱active:

container.classList.add("active");
登入後複製

##如果你做的動畫逼格較高,希望每次瀏覽這一屏幕內容的時候,動畫都走一遍,可以使用

reflow#重新觸發一下animation #:

container.classList.remove("active");
container.offsetWidth = container.offsetWidth;
container.classList.add("active");
登入後複製

2. 類別名稱active與動畫控制技巧如何具體控制動畫的播放呢?我們通常第一個反應是使用下面的方法實現,動畫的完整
CSS代碼在active狀態下呈現,如:

.element1 { /* 尺寸与定位 */ }.element2 { /* 尺寸与定位 */ }.element3 { /* 尺寸与定位 */ }...
 
.active .element1 { animate: name1 1s; }.active .element2 { animate: name2 1s; }.active .element3 { animate: name2 1s; }...
登入後複製

從實作和功能上將,上面方法是很不錯的,通俗易懂,不易犯錯。不過我個人比較喜歡使用配合CSS3的

animation-play-state#屬性對每個螢幕動畫進行控制,實作如下:##動畫相關

CSS程式碼直接寫在元素上:

#
.element1 { /* 尺寸与定位 */ animate: name1 1s; }.element2 { /* 尺寸与定位 */ animate: name2 1s; }.element3 { /* 尺寸与定位 */ animate: name3 1s; }...
登入後複製

建立一個類別名,如

.animate,凡是使用到了animation#動畫的元素都會加入這個類別名稱;如下CSS代碼:

.animate {
    animation-play-state: paused;
}.active .animate {
    animation-play-state: running;
}
登入後複製

之所以個人更喜歡後面的方法,是因為有一種「無侵入性」的感覺,程式碼層次清晰,控制關係明確。有利於後期的維護與擴展。

然而,使用

animation-play-state還是有些需要注意的,對於IE10/IE11瀏覽器,animation-play-state是不能簡寫的。如:

.element { animate: shake 4s 2s both infinite paused; }
登入後複製

只會讓整個

CSS宣告掛掉的!如下寫法支援:

.element { 
    animate: shake 4s 2s both infinite;
    animation-play-state: paused;
}
登入後複製

有人可能要奇怪了,怎麼突然

IE##瀏覽器亂入了?首先,我們不能無視主流手機之Windows Phone. 其次,帥氣的翻頁動畫並不是行動裝置專有,桌面端也適用。稍稍用力,桌上型手機全適配,何樂而不為! 不同狀態下的連續動畫

有時候,動畫可能不是一波流,分狀態。

例如,我們的小火箭,先是淡出動畫,然後無限上下懸浮。怎麼實現呢?


關鍵點就是動畫分解與延遲。 css3常用属性animation-play-state的使用技巧

據我所知,沒辦法只使用一個

keyframes

關鍵影格宣告就實現這個效果,因為,這裡有動畫狀態的變化:一個只執行一次的動畫和一個無限循環動畫。 怎麼辦?我們可以將動畫分解,寫2個

animation keyframes

動畫關鍵影格描述。

@keyframes fadeIn { /* ... */ }@keyframes float { /* ... */ }
登入後複製

 

然後,再分別套用這些關鍵影格動畫。如何應用呢?有

2

小技巧:1. 逗號與多animation動畫值
如下:

p class="element">小火箭</p>
 
.element { animation: fadeIn 1s, float .5s 1s infinite; }  /* 我淡出, 需要1秒;我1秒后开始无限漂浮 */
登入後複製

其中

float .5s 1s infinite

這裡的1s就是無限漂浮動畫執行延遲的時間,於是,兩個動畫完美配合,感覺就像是動畫。實際上,就是一個動畫,所有CSS3 animation動畫走同一個UI線程,這也是為何推薦使用CSS實現動畫效果的原因。 此寫法沒有相容性問題,大家可以開開心心地使用。


2. 标签嵌套与独立动画
我们还可以通过嵌套标签的形式实现连续动画,例如:

<p class="element-wrap"><p class="element">小火箭</p></p>
 
.element-wrap { animation: fadeIn 1s; }          /* 我淡出, 需要1秒 */.element { animation: float .5s 1s infinite; }   /* 我1秒后开始无限漂浮 */
登入後複製

有人可能会奇怪了。animation本身就支持多动画并行,你还搞个标签嵌套,没有任何使用的理由啊!没错,单纯看我们这个例子,确实是这样。但是:


① 提取公用动画
这类多屏动画是有N多元素同时执行不同的动画。比方说,火箭是淡出,然后上下漂浮;火箭的火焰是淡出,然后大小变化;黑洞是淡出,然后左右随波。你如何实现?

如果纯粹借助animation语法,应该是:

.element1 { animation: fadeIn 1s, float .5s 1s infinite; }  /* 我淡出, 需要1秒;我1秒后开始无限漂浮 */.element2 { animation: fadeIn 1s, size .5s 1s infinite; }   /* 我淡出, 需要1秒;我1秒后开始大小变化 */.element3 { animation: fadeIn 1s, move .5s 1s infinite; }   /* 我淡出, 需要1秒;我1秒后开始左右移动 */
登入後複製

可以看到,淡出是公用的动画效果,我们可以借助嵌套标签,实现公用语法的合并,方面后期维护:

.element-wrap { animation: fadeIn 1s; }          /* 大家都1秒淡出 */.element1 { animation: float .5s 1s infinite; }  /* 我1秒后无限漂浮 */.element2 { animation: size .5s 1s infinite; }   /* 我1秒后忽大忽小 */.element3 { animation: move .5s 1s infinite; }   /* 我1秒后左右移动 */
登入後複製

 

②避免变换冲突
有个元素动画是边360度旋转、边放大(从0放大到100%),像这种具有典型特征的动画我们显然要独立提取与公用的:

@keyframes spin { /* transform: rotate... */ }@keyframes zoomIn { /* transform: scale... */ }
登入後複製

好了,现在问题来了,变放大边旋转:

.element { animation: spin 1s, zoomIn 1s; }  /* 旋转:啊,完蛋啦,我被放大覆盖啦! */
登入後複製

由于都是使用transform, 发生了残忍的覆盖。当然,有好事的人会说,你使用zoom不就好了!确实,如果只是移动端,使用zoom确实棒棒哒!但是,我们这个企业活动,PC是主战场,因此,FireFox浏览器(FF不识zoom)是不能无视的。

怎么办?重新建一个名为spinZoomIn的动画关键帧描述还是?

对啊,你直接外面套一层标签不就万事大吉了

.element-wrap { animation: spin 1s; }   /* 我转转转 */.element { animation: zoomIn 1s; }      /* 我大大大 */
登入後複製

无侵入定位和居中定位准则

1. 这里的“无侵入定位”指不受animation影响的元素定位,包含两部分:一是不使用keyframes关键帧决定初始位置;二是不要使用keyframes中出现的属性定位。

①. 不使用keyframes决定初始位置
应该都知道,CSS3 animation的fill-mode可以决定元素动画结束前后的位置,也就是也具有定位的作用。此时,可能就会有小伙伴,故作聪明,利用animation keyframes 0% {}或form {}去做定位,貌似,还省了写代码。看上去很赞,实际上狭隘了,这对于对animation支持不佳或不支持的浏览器实际上是不友好的,例如Android2.3不支持animation-fill-mode, IE6-IE9不支持CSS3 animation,于是乎,当遭遇这些浏览器的时候,页面动画元素的布局实际上是毁掉的。所以,这些动画元素定位的时候,需要使用“无侵入定位”,也就是,就算页面没有animation, 我也是个“标致人儿”。

②. 不使用keyframes中出现的属性定位
举个例子,有个球,正好定位在模块的中心,同时有个无限旋转效果。使用transform: translate(-50%,-50%)居中定位再合适不过了,不用我心里难受,于是,使用了transform定位。此时,冲突发生,旋转动画也是需要transform变换的。

@keyframes spin {
    0% { transform: rotate(0); }
    100% { transform: rotate(360deg); }}
登入後複製

要么使用业界约定俗成spin覆盖,要么另起炉灶没法重用:

@keyframes spin-trans {
    0% { transform: rotate(0) translate(-50%,-50%); }
    100% { transform: rotate(360deg) translate(-50%,-50%); }}
登入後複製

显然,都是不合适的。建议使用传统left/top/margin进行定位,与transform变换动画“无侵入”。

 

2. 这里的“居中定位准则”包含两部分:一是元素定位在容器中间位置;二是元素的定位方式为居中定位。

①. 元素定位在容器中间
容器以及容器内的动画元素可以看成是一个动画模块,为了这个模块可以轻松驾驭水平布局和垂直局部,里面的动画元素形成的整体一定要在容器的中间,不要被设计稿或周围环境影响。

②. 定位方式为居中定位
所谓“居中定位”是相对“传统定位”而言的。Web页面中的模块、文字什么的默认都是相对于左上角堆砌的,所以,很自然地,我们在重构页面,做布局,写交互效果的时候,也都是相对左上角定位。活用元素本身的定位特性,这是很赞的也推荐这么做!但是,如果你和多元素CSS动画打交道,可能就需要改变下惯性思维了,很重要的一点就是“从以左上角为参考点变成以中心点为参考点”
我们在实现多元素动画效果时候,会出现两类角色:一是容器;二是容器里面诸多动画元素。

其中,对于容器元素,尤其在做移动端产品时候,我们很自然会让其居中定位:

.container {
    position: absolute; left: 50%; top: 50%;
    transform: translate3d(-50%, -50%, 0);
}
登入後複製

 

左上角定位(或右上角定位):

.example {
    position: absolute; left: 100px; top: 100px;
}
登入後複製

 

中心点定位+ margin偏移:

.example {
    position: absolute; left: 50%; top: 50%; 
    margin-left: -100px; margin-top: -100px;
}
登入後複製

更多css3常用属性animation-play-state的使用技巧 相关文章请关注PHP中文网!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板