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

来源:http://www.cnblogs.com/moqiutao/archive/2017/02/04/6363952.html
-Advertisement-
Play Games

animation-play-state介紹 animation-play-state 屬性規定動畫正在運行還是暫停。 瀏覽器支持:Internet Explorer 10、Firefox 以及 Opera 支持 animation-play-state 屬性。Safari 和 Chrome 支持替 ...


animation-play-state介紹

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

div
{
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. 其次,帥氣的翻屏動畫並不是移動端專有,桌面端也適用。稍稍用力,桌面移動全適配,何樂而不為!

不同狀態下的連續動畫

有時候,動畫可能不是一波流,分狀態。
例如,我們的小火箭,先是淡出動畫,然後無限上下懸浮。怎麼實現呢?

關鍵點就是動畫分解與延時。

據我所知,沒辦法只使用一個keyframes關鍵幀聲明就實現這個效果,因為,這裡有動畫狀態的變化:一個只執行一次的動畫和一個無限迴圈動畫。

怎麼辦?我們可以將動畫分解,寫2個animation keyframes動畫關鍵幀描述。

@keyframes fadeIn { /* ... */ }
@keyframes float { /* ... */ }

 

然後,再分別應用這些關鍵幀動畫。如何應用呢?有2個小技巧:
1. 逗號與多animation動畫值
如下:

div class="element">小火箭</div>
 
.element { animation: fadeIn 1s, float .5s 1s infinite; }  /* 我淡出, 需要1秒;我1秒後開始無限漂浮 */

其中float .5s 1s infinite這裡的1s就是無限漂浮動畫執行延遲的時間,於是,兩個動畫完美配合,感覺就像是一個動畫。實際上,就是一個動畫,所有CSS3 animation動畫走同一個UI線程,這也是為何推薦使用CSS實現動畫效果的原因。

此寫法沒有相容性問題,大家可以開開心心地使用。


2. 標簽嵌套與獨立動畫
我們還可以通過嵌套標簽的形式實現連續動畫,例如:

<div class="element-wrap"><div class="element">小火箭</div></div>
 
.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;
}

參考地址:https://isux.tencent.com/css-...


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • (0)寫在前面 編程和現實世界是息息相關的,你是如何理解現實世界中的繼承呢? 繼承在編程中應理解為:對父類資源(本文只討論方法)的使用,父類方法只提供類基本的功能,父類方法之間不存在調用關係。 (1)案例介紹 我們有這樣一個任務,控制一個人上下左右移動,我們開始構建類。 等等,上面的類違反了高內聚低 ...
  • CSS 偽類 (Pseudo-classes) 錨偽類:在支持 CSS 的瀏覽器中,鏈接的不同狀態都可以不同的方式顯示,這些狀態包括:活動狀態,已被訪問狀態,未被訪問狀態,和滑鼠懸停狀態。 a:link {color: #FF0000} /* 未訪問的鏈接 */ a:visited {color: ...
  • 一、關於漸變 漸變是一種應用於平面的視覺效果,可以從一種顏色逐漸地轉變成另外一種顏色,故可以創建類似於彩虹的效果漸變可以應用在任何可以使用圖片的地方。例如,您可以指定一個這麼一個漸變:頂部的顏色是紅色,中間的是藍色,底部為黃色來作為div的背景色。漸變通過-webkit-gradient方法實現,可 ...
  • 可以實現手勢操作:拖動、縮放、旋轉。封裝好的腳本方法是這樣的: html代碼: js調用: 轉載地址:http://blog.csdn.net/somethin...touch官網地址:https://www.awesomes.cn/repo/... ...
  • 最近剛閱讀完《高性能javascript》,想談談對js性能優化的看法。理解有些不同,可能還需要各位多多提醒。 話不多說,提到javascript難免會聯想到文檔對象模型(DOM),它作用於XML和HTML文檔的程式介面(API),位於瀏覽器中,主要用來與HTML文檔打交道。同樣也用於Web程式中獲 ...
  • 首先請看網友通過setTimeout實現的: 分析: 用setTimeout模擬線程,有一個事件處理隊列(this.tasks),然後每一個事件內部會調用事件調度函數(next),每一次的業務邏輯是通過定義的閉包函數fn,fn內部在處理完自身業務會執行next函數。 於是就想起處理這種含有非同步並且有 ...
  • 本文實現自定路由,主要是事件hashchange的使用,然後根據我們的業務需求封裝。 首先實現一個router的類,並實例化。 上邊唯一需要註意的是,在使用addEventListener的時候,需要註意bind函數的使用,因為我是踩了坑,這才體會到$.proxy()。 上邊使用的時候可以使用兩種方 ...
  • 作者:軒脈刃 1 原型法設計模式 在.Net中可以使用clone()來實現原型法 原型法的主要思想是,現在有1個類A,我想要創建一個類B,這個類是以A為原型的,並且能進行擴展。我們稱B的原型為A。 2 javascript的方法可以分為三類: a 類方法 b 對象方法 c 原型方法 例子: func ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...