目錄
animation-play-state介紹
使用animation-play-state控制每螢幕動畫播放
例如,我們的小火箭,先是淡出動畫,然後無限上下懸浮。怎麼實現呢?
无侵入定位和居中定位准则
1. 这里的“无侵入定位”指不受animation影响的元素定位,包含两部分:一是不使用keyframes关键帧决定初始位置;二是不要使用keyframes中出现的属性定位。
2. 这里的“居中定位准则”包含两部分:一是元素定位在容器中间位置;二是元素的定位方式为居中定位。
首頁 web前端 css教學 css3常用屬性animation-play-state的使用技巧

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

Feb 22, 2017 pm 01:01 PM
css3

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中文网!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

純CSS3怎麼實現波浪效果? (程式碼範例) 純CSS3怎麼實現波浪效果? (程式碼範例) Jun 28, 2022 pm 01:39 PM

純CSS3怎麼實現波浪效果?這篇文章就來跟大家介紹一下使用 SVG 和 CSS 動畫來製作波浪效果的方法,希望對大家有幫助!

巧用CSS實現各種奇形怪狀按鈕(附代碼) 巧用CSS實現各種奇形怪狀按鈕(附代碼) Jul 19, 2022 am 11:28 AM

這篇文章帶大家看看怎麼使用 CSS 輕鬆實現高頻出現的各類奇形怪狀按鈕,希望對大家有幫助!

css怎麼隱藏元素但不佔空間 css怎麼隱藏元素但不佔空間 Jun 01, 2022 pm 07:15 PM

兩種方法:1、利用display屬性,只要為元素加上「display:none;」樣式即可。 2.利用position和top屬性設定元素絕對定位來隱藏元素,只需為元素加上「position:absolute;top:-9999px;」樣式。

css3怎麼實現花邊邊框 css3怎麼實現花邊邊框 Sep 16, 2022 pm 07:11 PM

在css中,可以利用border-image屬性來實作花邊邊框。 border-image屬性可以使用圖片來建立邊框,即給邊框加上背景圖片,只需要將背景圖片指定為花邊樣式即可;語法「border-image: url(圖片路徑) 向內偏移值圖像邊界寬度outset 是否重複;」。

css3如何實現滑鼠點擊圖片放大 css3如何實現滑鼠點擊圖片放大 Apr 25, 2022 pm 04:52 PM

實作方法:1、使用「:active」選擇器選取滑鼠點擊圖片的狀態;2、使用transform屬性和scale()函數實現圖片放大效果,語法「img:active {transform: scale(x軸放大倍率,y軸放大倍率);}」。

原來利用純CSS也能實現文字輪播與圖片輪播! 原來利用純CSS也能實現文字輪播與圖片輪播! Jun 10, 2022 pm 01:00 PM

怎麼製作文字輪播與圖片輪播?大家第一想到的是利用js,其實利用純CSS也能實現文字輪播與圖片輪播,下面來看看實作方法,希望對大家有幫助!

css3怎麼設定動畫旋轉速度 css3怎麼設定動畫旋轉速度 Apr 28, 2022 pm 04:32 PM

在css3中,可以利用「animation-timing-function」屬性來設定動畫旋轉速度,該屬性用於指定動畫將如何完成一個週期,設定動畫的速度曲線,語法為「元素{animation-timing-function:速度屬性值;}」。

css3動畫效果有變形嗎 css3動畫效果有變形嗎 Apr 28, 2022 pm 02:20 PM

css3中的動畫效果有變形;可以利用「animation:動畫屬性@keyframes ..{..{transform:變形屬性}}」實現變形動畫效果,animation屬性用於設定動畫樣式,transform屬性用於設定變形樣式。

See all articles