大神教你用css3-animation製作逐幀動畫

2021-02-18 野狗


今天來聊聊css3中的動畫屬性animation,對這個屬性懵懂是在很早的時候有前輩用這個 animation 屬性來寫了一個菊花打轉的loading,然後google了一下知道了有這麼一個css動畫組件叫做 animation.css 其實還有很多這種動畫組件,他們很多都是基於jquery來操作的。

今天我們不是來談他們怎麼用的,只是來了解一下執行這些動作後的這個animation屬性,到底是怎麼起到作用的。

先上最終demo:奔跑的小人物

拿出手機手機掃一掃


假如你想要用非gif做一些css的逐幀動畫,那不妨可以看看這篇文章,說不定哪天還真用得著呢qq表情

animation介紹

對於這個css3屬性,w3c定義其為實驗性技術,那麼自然對於那些非高帥富瀏覽器來說都是痛,通過caniuse我們可以直觀看見這個屬性瀏覽器支持情況:


IE10+和firefox33+支持這個屬性切不需要寫私有前綴,chrome31+,safari7+,andriod4.1+都需要寫上自己的私有前綴才可以支持,不過oprea電腦端支持,但是移動端的卻不支持,無解。

屬性名: animation

屬性值: <single-animation>#

初始值: 詳見獨立屬性值

應用於: 所有元素

繼承性: 無

百分比: N/A

計算值:

single-animation的值有<a name="#typedef-single-animation-name" href="#typedef-single-animation-name" title="<single-animation-name>」><single-animation-name></a> || <a href="#time-value" title="<time>」><time> || <a href="#typedef-single-timing-function" title="<single-timing-function>」><single-timing-function></a> || <a href="#time-value" title="<time>」><time> || <a href="#typedef-single-animation-iteration-count" title="<single-animation-iteration-count>」><single-animation-iteration-count></a> || <a href="#typedef-single-animation-direction" title="<single-animation-direction>」><single-animation-direction> || <a href="#typedef-single-animation-fill-mode" title="<single-animation-fill-mode>」><single-animation-fill-mode></a> || <a href="#typedef-single-animation-play-state" title="<single-animation-play-state>」><single-animation-play-state>

其實這個animation 就是一個簡寫值,它包括了以上8個子屬性值,剛剛在上面也提到了,假如所有的瀏覽器都支持這個屬性的話就不需要填寫任何的前綴,如下:

.test{

    animation:< 各種屬性值 >;

    }

上面的只是適合firefox還有opera瀏覽器,假如說要兼容大部分的瀏覽器,那麼就應該這麼寫到:

.test{

  -webkit-animation: < 各種屬性值 >;

     -moz-animation: < 各種屬性值 >;

       -o-animation: < 各種屬性值 >;

          animation: < 各種屬性值 >;

    }

不管是動畫還是視頻,我們都應該明白這麼一個東西:這個動畫叫什麼名字,它的播放時長、播放快慢、是否延遲播放、是否無限制播放次數、是否倒放、是否暫停是否都需要有所改變。

這些都是構成一段視頻所需的基本要求,當然你說你還要有一個特效什麼的要放哪裡,假如說在視頻播放在30s秒的時候插播一則廣告神馬之類的,那麼這時候就要知道 @keyframes 關鍵幀的概念了,css3中的動作很多都是依賴於這個 keyframes 關鍵幀來模擬執行另外一個css樣式。

通俗說點就是 animation 只是定義一個動畫的基本設置,但是@keyframes 才是通過改變動畫裡面的內容來達到模擬動畫的效果,走一段100m的路,我們要求你都是要在60分鐘內完成,每次前進一步都是保持相同動作前進,那麼,當作為旁觀者來看的話,假如忽略背景作為對比,其實他是感受不到人在動的,這個其實又涉及到一個參照物的關係了,動與不動都是相對來說,兩個同等速度的物體在移動,A看B,B是靜止的,但是靜止中的C看B,B是一直在動。

廢話這麼多,其實就是想說 animation 是要依賴 @keyframes 生存的,不然它就沒有存在的意義。

animation-name,規定要綁定的keyframes的名稱,隨便你取,不過為了日後維護的方便,建議取一個跟動作相關名稱相近的名稱比較好。比如要我們要綁定一個跑的動作,那麼可以命名為run。

time,這裡有兩個時間,前面一個是規定完成這個動畫所需要的時間,全稱叫animation-duration,第二個time為動畫延遲開始播放的時間,全稱叫animation-delay,這兩個數值可以用秒’s』也可以用微秒’ms』來寫,1000ms=1s,這個不用一一介紹。

animation-timing-function,規定動畫的運動曲線,這裡有9個值,分別是ease | linear | ease-in | ease-out | ease-in-out | step-start | step-end | steps(< integer >[, [ start | end ] ]?) | cubic-bezier(x1, y1, x2, y2) ease:動畫緩慢開始,接著加速,最後減慢,默認值;

linear:動畫從頭到尾的速度是相同的;

ease-in:以低速開始;

ease-out:以低速結束;

ease-in-out:動畫以低速開始和結束;

說說這個 steps(n,[ start | end ] ]?)這個階梯函數,這個函數可以把動畫平均劃分為基本相等的,這個n是一個自然數,意思就是把一個動畫平均分成n等分,直到平均地走完這個動畫,這個要跟linear區別開來,因為linear是把動畫作為一個整體,中間沒有斷點,而steps是把動畫分段平均執行開來。step-start等同於steps(1,start),動畫分成1步,動畫執行時為開始左側端點的部分為開始;step-end等同於steps(1,end):動畫分成一步,動畫執行時以結尾端點為開始,默認值為end。對此,w3c圖解如下:


利用這個step階梯函數我們可以做出像一開始我們做出的逐幀動畫的效果。

PS:其實,我對這個函數有點疑惑不解,這個steps(1,start),按照我的理解應該是從動畫第二張圖片作為動畫的開始,有哪位知道這個step更加具體的介紹麻煩告知一下,因為這樣可以少寫後面的keyframes 中的css樣式,比如下面的兩個函數在執行動畫來說都是一樣的:

.test1{

 background:url(http://img.xiaoho.com/2014/12/test.png) no-repeat 0 0;

 -webkit-animation:run 350ms steps(1) infinite 0s;}

@-webkit-keyframes run {    

    0% {

        background-position:0;

    }

    20% {

       background-position:-90px 0;

    }

    40% {

       background-position:-180px 0;

    }

    60% {

       background-position:-270px 0;

    }

    80% {

       background-position:-360px 0;

    }

    100% {

       background-position:-450px 0;

    }

}

.test2{

 background:url(http://img.xiaoho.com/2014/12/test.png) no-repeat 0 0;

 -webkit-animation:run 350ms steps(5) infinite 0s;}

@-webkit-keyframes run {

    100% {

       background-position:-450px 0;

    }

}

圖片如下


圖片只需要5步即可完成即可完成整個動作。

這兩個在運行起來其實是一樣的,第一種是把動畫分成一步,動畫開始以結尾端點為起點開始執行,然後在0%,20,40,80,100執行了背景圖的切換;而第二種是動畫分成5步,然後在100%處的時候調用最後一張背景圖。

animation-iteration-count,動畫播放次數,默認值為1,infinite為無限制,假如設置為無限制,那麼動畫就會不停地播放。



animation-direction,規定動畫是否反方向運動。

< single-animation-direction > = normal | reverse | alternate | alternate-reverse

第一個值是正常轉動播放,默認值,reverse為反向轉動,alternate一開始正常轉動,播放完一次之後接著再反向轉動,假如設置animation-iteration-count:1則該值無效,alternate-reverse一開始為反向轉動,播完一次之後按照回歸正常轉動,交替轉動,設置count為1,則該值無效。具體效果請拿手手機掃描樓下二維碼


animation-play-state,定義動畫是否運行或暫停,這是後來新增的屬性,有兩個屬性值分別是running和paused。默認值為normal,動畫正常播放。假如是為paused,那麼動畫暫停。假如一個動畫一開始為運動,那麼假如設置paused那麼該動畫暫停,假如再設置running,那麼該動畫會從剛才暫停處開始運動,可能說得有點小拗口,那麼可以前往w3c看demo

animation-fill-mode,定義動畫播放時間之外的狀態,顧名思義,要麼就是在動畫播放完了之後給它一個狀態

animation-fill-mode : none | forwards | backwards | both; none,播放完之後不改變默認行為,默認值,forwards則是停在動畫最後的的那個畫面,backwards則是回調到動畫最開始出現的畫面,both則應用為動畫結束或開始的狀態,不上示例貌似對不起觀眾了,那就來一個小demo


結語

好了,天色已晚就暫時寫這麼多了,做了一個最終hot打架小動畫出來,各位可以欣賞一下,拿出手機出來掃掃可能說不定你真的會對這個animation屬性感興趣哦。


內啥,想要看css的直接可以去原始碼上看,這裡就不貼出來了,自己動手豐衣足食哈。

參考資料:

https://www.w3.org/TR/2013/WD-css3-transitions-20130212/#transition-timing-function-property

https://drafts.csswg.org/css-animations/#animation


本文轉自:http://xiaoho.com/?p=896


這裡,了解野狗!

相關焦點

  • 前端工程師必備的css3動畫技巧
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫本文是筆者之前文章用css3實現驚豔面試官的背景即背景動畫(高級附源碼)的續篇也是介紹css3技巧的文章,因為css這塊知識難點不是很多,更多的在於去熟悉css3的新特性和基礎理論知識。
  • 前端工程師必備的css3動畫技巧(附源碼)
    本文是筆者之前文章用css3實現驚豔面試官的背景即背景動畫(高級附源碼)的續篇也是介紹css3技巧的文章,因為css這塊知識難點不是很多
  • CSS3動畫使用技巧與總結
    構建css3動畫的屬性很簡單,總的來說只有transform(變形),transition(過渡),和animation(動畫)這三種。
  • 10個CSS3動畫工具,值得你收藏!
    在css3中引入了全新的動畫語法,它能夠幫助你在設計中實現許多有趣的事情。通常構建炫酷的動畫是非常複雜和費時的,而使用動畫庫和生成器則可以幫助你完美處理這一切。在這篇文章中我們將推薦十款出色的工具,它們可以幫助你更快更輕鬆地完成自己的動畫。
  • 值得你收藏的10個CSS3動畫工具
    在CSS3中引入了全新的動畫語法,它能夠幫助你在設計中實現許多有趣的事情。通常構建炫酷的動畫是非常複雜和費時的,而使用動畫庫和生成器則可以幫助你完美處理這一切。在這篇文章中我們將推薦十款出色的工具,它們可以幫助你更快更輕鬆地完成自己的動畫。1. CSS3Gen - CSS3動畫生成器
  • 用css3實現背景即背景動畫(高級附源碼)
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫我們傳統的前端更多的是用javascript實現各種複雜動畫,自從有了Css3 transition和animation以來,前端開發在動畫這一塊有了更高的自由度和格局,對動畫的開發也越來越容易。
  • 五年級信息技術教案 當個動畫設計師(製作逐幀動畫)
    教學目標:1、知道動畫製作的基本原理。2、知道Flash軟體界面的各組部分及功能。3、知道幀的類型及作用。如果使用Flash軟體,親手製作模擬火箭發射過程的動畫,肯定是一個十分開心且有意義的事情。2、揭題:(出示課題) 第七課: 當個動畫設計師---製作逐幀動畫二、輕鬆學1、認識Flash界面。
  • H5中CSS3動畫屬性詳解
    動畫的基本使用製作動畫分為兩步:(1)先定義動畫(2)再使用(調用)動畫(哪個盒子要加動畫,就調用對應的動畫名稱)一般我們用百分比來規定變化發生的時間,或用關鍵詞 "from" 和 "to",等同於 0% 和 100%
  • 新手如何快速上手CSS3動畫
    這裡為什麼用transition而不用animation?那就要說說他們直接的區別了。transition需要觸發一個事件, 而animation在不需要觸發任何事件的情況下也可以顯式的隨著時間變化來改變元素css的屬性值,從而達到一種動畫的效果。transition屬性是一個簡單的動畫屬性,非常簡單非常容易用。
  • 【效果高能】你不知道的 Animation 動畫技巧
    本篇文章將著重對 animation 的使用做個總結,如果你的工作中動畫需求較多,相信本篇文章能夠讓你有所收穫:Animation 與 Svg 又會擦出怎樣的火花呢?: scroll; animation-duration: 5s; animation-timing-function: linear; animation-iteration-count: infinite; /* animation: scroll 5s linear infinite; 動畫屬性簡寫 */}
  • 巧妙利用CSS3實現太陽系行星公轉運動軌跡
    突然發現好奇不僅僅害死貓,也可以增長知識嘛(你這是什麼謬論!!!)。也許有的朋友看過有關的文章那麼今天我們就一起來看看怎麼巧妙的利用CSS3 來實現這麼漂亮的動畫的吧!我不清楚大家對於CSS3的動畫了解多少,但是我對於 CSS3的東西還是限制與用什麼查什麼的階段。
  • CSS動畫效果之transition、animation
    動畫animation動畫(animation)和過渡十分相似,不同的是在默認情況下它不需要指定觸發行為就可以發生。動畫的使用步驟:1、設置動畫關鍵幀;2、在需要添加動畫的元素中設置動畫。>animation-duration:設置動畫的執行時間。
  • 淺談CSS3動畫的凌波微步--steps()
    用JavaScript定時器麻溜寫完之後,恰好同事勇司機接完水。瞟了一眼,然後湊過來說,這個用CSS3也可以寫,而且一行JavaScript都不用寫。"一行JavaScript都不用寫,純CSS3就可以寫。CSS3有這麼溜的操作!"''對呀!CSS3 animation當中有一個steps(),你上網查一下就知道了!""漲姿勢了!
  • css3動畫怎麼實現旋轉效果
    華清遠見成都中心高端IT就業培訓專家伴隨HTML5而來的CSS3讓前端小夥伴們可以用簡單的CSS樣式即可寫出動畫效果來,而在這之前,一提到動畫我們可能會想到JavaScript,Flash,等。如果是用JavaScript那倒也不是很糟糕的事啦,但如果寫出來的效果非要強迫客戶端安裝第三方插件才能顯示,畢竟不是很理想。
  • 「咻動畫」補間動畫與逐幀動畫的區別
    補間動畫與逐幀動畫的區別是什麼?我們都知道動畫是在動畫製作軟體的時間幀上進行製作而成的。而動畫製作方法又有補間與逐幀之分,那麼這兩者之間的區別在哪呢?補間動畫與逐幀動畫的區別【逐幀動畫】逐幀動畫顧名思義就是需要進行逐幀繪製的一種動畫製作形式
  • CSS3的新特性
    border-image: url slice repeat|initial|inherit;4.選擇器css3first-letter { border:1px solid #fff;}div:before { content: "test" border:1px solid #fff;}div:after{ border:1px solid #fff; content: "test"}css3
  • 用CSS3和JavaScript開發《街頭霸王》遊戲
    這種技術的主要功能是利用鋪貼PNG背景圖的方式「重現」GIF圖的動畫效果。我的朋友都知道,年輕時候我非常痴迷《街頭霸王》遊戲,而當我看到了這個素材….你知道我的腦子裡想到了什麼嗎?有一個很好的網站Texture Packer,它能幫你處理這些圖片。最終,你的圖片應該是這個樣子:
  • 精通react/vue組件設計教你實現一個極具創意的加載(Loading)組件
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言本文是筆者寫組件設計的第八篇文章, 今天帶大家用5分鐘實現一個極具創意的加載(loading)組件.涉及的核心知識點主要是css3相關特性, 如果大家非常熟悉,可直接跳過介紹直接看正文
  • 東莞二維動畫製作方式
    多媒體的時代,視頻營銷是企業宣傳必不可少的手段之一,二維動畫集任意性、趣味性、誇張成分等魅力融於一身,打開方式更加吸引人。巨天影視二維動畫製作通過課件流程演示、娛樂和趣味包裝、MG動畫、二維電影等豐富、多元、趣味的視覺呈現,將企業產品、服務和企業文化內涵全方位融合,每一幅畫都是動畫師為企業精心設計、量身定製。
  • 現在製作flash動畫都流行用這款軟體
    目前動作製作的軟體工具可分為兩大類: 一是綁定動畫,通過動畫部件的位移或者旋轉操作來實現動畫的變化。 二是逐幀動畫,通過創建不同的動畫幀,將不同時間線的幀進行合成從而形成動畫,這種方式也是最容易理解和實現的。