十分鐘教你用 svg 做出精美的動畫!

2021-02-28 字節前端 ByteFE
前言

經常在Codepen上看到大俠們用 SVG 畫出不可思議的動畫,我一直很好奇他們是怎麼運作的,總覺得這需要對 SVG 有足夠透徹的了解,並且自己畫出那些 SVG 圖案,才有辦法讓他動起來。

但其實不然,今天教大家一個簡單的小技巧,讓你快速實現一個 svg 動畫!

打開Codepen,點擊界面中的build按鈕,就可以使用動畫構建一個房子,並且讓它升起寥寥炊煙!🏭

codepen[1]

尋找精美的 svg 圖案

既然自己畫不出來,那我們就去找現成的庫,svg 庫有很多,如Flaticon[2]、iconfont[3]、Iconfinder[4]或icons8[5]等網站會提供很多免費的 svg 圖案。

分析 svg 圖案

打開devtool觀察 svg 圖案,你會看到下面的結果:

element裡頭path跟circle都是 svg 的DOM元素,分別表示 svg 圖案內的線條與圓形。

舉個例子 🌰:

<path d="M 10 25
         L 10 75
         L 60 75
         L 10 25">
複製代碼

上面代碼中的 d 的內容:M 代表將筆移動到(10, 25),接著 L 畫一條線到(10, 75),最後回到起點畫出一個三角形。

通過 devtool,我們可以看到每個path對應圖案的哪個部分:

這時候應該形成思路,既然我們可以知道每個元素對應到圖案的哪個部分,我們就可以針對想要套上動畫的 DOM 元素來操作!TimelineLite/TimelineMax 工具

如果單純通過 id、className 來使用 CSS 或 JavaScript 自行處理動畫,難度還是頗高,更重要的是,要耗費大量的時間

所以我們得借用工具,Timeline(Lite|Max)跟 TweenMax 是知名的GreenSock Animation Platform(簡稱 GSAP)[6]推出的可創建時間軸(timeline)作為動畫或其他時間軸的容器,這使得整個動畫控制和精確管理時間變得簡單。

GSAP 甚至為我們提供了Ease Visualizer[7]來展示每種 Ease function 的效果,更順帶附上代碼:

codepen[8]

簡單幾句代碼就能達到如下效果:

上手 GSAP

GSAP 的 API 功能十分強大 👍,還有相關社區:官網文檔[9]、論壇[10]、TimelineMax 中文手冊[11]

在一開始的房子構建 🌰 中,我主要使用的是 TimelineMax 的from與staggerFrom,這兩個 API 只需要設定初始值,他會在指定時間內將補間動畫完成:

  tl.from("#House > rect:nth-child(24)", 1, {
      scaleX: 0,
      transformOrigin: "center",
      ease: Power2.easeOut
    })
複製代碼

這一步我們將 CSS Selector#House > rect:nth-child(24)這個元素,從scaleX為 0 開始,以 center(中心)為變形起點,利用Power2.easeOut,在一秒內回復到原始狀態,並執行補間動畫。

    .staggerFrom(
      ["#House > path:nth-child(34)", "#House > path:nth-child(32)"],
      0.8,
      {
        scaleY: 0,
        transformOrigin: "bottom",
        ease: Bounce.easeOut,
        stagger: 0.2
      },
      0,
      "scene1+=0.5"
    )
複製代碼

與from相似,只是staggerFrom可以一次放入多個 CSS Selector,用stagger這個屬性來設置數組中的 Selector 要以怎樣的時間差出現。

詳細 API 參數可以參考官方文檔[12]

接著回到我們的 SVG,在 devtool 的幫助下,要取出 svg 內部元素的CSS Selector非常容易,在 element 面板中找到對應的 DOM 元素點擊右鍵,選擇Copy -> Copy selector,就可以直接複製到該元素的 CSS Selector:

現在我們能取得 svg 中任意部分的 CSS Selector,也知道怎麼用 GSAP API 來進行補間動畫,現在是時候將其結合起來!

我們先調整下基本布局,一般在空白 Html 內直接放入 svg 時,圖案大多會緊靠頁面左上角,我們可以套用個margin: 0 auto將其置中,看起來會順眼一些,你也能額外加些 padding。我們在頁面添加一個按鈕來調用動畫:

<!--html part-->
<button onclick="animateBike()"> Build! </button>
<!--css part-->
<style>
#Capa_1 {
  margin: 0 auto;
  display: block;
  width: 256px;
  height: 100%;
}
</style>
複製代碼

接著我們使用TimelineMax提供的staggerFrom函數,利用 devtool 將滑板車的輪子部分找出來,複製它們的 CSS Selector,放入staggerFrom函數參數中,設定 x 與 y 軸的scale都從 0 開始,由center增長,採用Bounce.easeOut的 ease function ,而四個 Selector 間以stagger: 0.2的屬性值作為補間動畫出現的時間差:

  const tl = new TimelineMax();
  tl.staggerFrom(
      [
        "#Capa_1 > g > path:nth-child(1)",
        "#Capa_1 > circle:nth-child(7)",
        "#Capa_1 > path:nth-child(6)",
        "#Capa_1 > circle:nth-child(5)"
      ],
      1,
      {
        scaleY: 0,
        scaleX: 0,
        transformOrigin: "center",
        ease: Bounce.easeOut,
        stagger: 0.2
      }
    )
複製代碼

簡單幾行代碼,就能讓我們的滑板車動起來!

codepen[13]

補間是一個術語,用於描述逐幀序列,有時也稱為"中間"。在那個地方,一個動作導致下一個動作產生一個流暢的動作。
複製代碼

完善動畫

你可以把 TimelineMax 想像成時間軸,動畫按指定順序執行,而staggerFrom則可以同時讓多個 DOM 元素以微小時間差的順序啟動,另外我們還可以設置一些 Flag 來指定要等到哪幾個動畫完成後,才接續其他動畫。

最後,發揮自己的創意,使用各種 API 打出一套組合拳 👊:

codepen[14]

結論 🎉

看到這裡,躍躍欲試了嗎?

總之,我自己覺得蠻有趣的,希望或多或少對讀到這篇文章的人有點幫助。

最後給大家分享一個很酷的demo[15],來自我的文章封面

參考文章 📜

[1] codepen: https://codepen.io/johnYu243/pen/bGBVEwv

[2] Flaticon: https://www.flaticon.com/

[3] iconfont: https://www.iconfont.cn/

[4] Iconfinder: https://www.iconfinder.com/

[5] icons8: https://icons8.com/

[6] GreenSock Animation Platform(簡稱 GSAP): https://greensock.com/

[7] Ease Visualizer: https://greensock.com/ease-visualizer/

[8] codepen: https://codepen.io/johnYu243/pen/jOVbMzX

[9] 官網文檔: https://greensock.com/docs/

[10] 論壇: https://greensock.com/forums/forum/11-gsap/

[11] TimelineMax 中文手冊: https://www.tweenmax.com.cn/api/timelinemax/

[12] 官方文檔: https://greensock.com/docs/v2/TimelineMax

[13] codepen: https://codepen.io/johnYu243/pen/poNjNzz

[14] codepen: https://codepen.io/johnYu243/pen/yLVYVey

[15] demo: https://www.zgzzsq.com/376658.html

[16] GreenSock Animation Platform: https://greensock.com/

[17] How to Create Beautiful SVG Animations Easily: https://medium.com/@LewisMenelaws/how-to-create-beautiful-svg-animations-easily-610eb2690ac3

相關焦點

  • 十分鐘教你用svg做出精美的動畫!
    前言經常在Codepen上看到大俠們用SVG畫出不可思議的動畫,我一直很好奇他們是怎麼運作的,總覺得這需要對SVG有足夠透徹的了解,並且自己畫出那些SVG圖案,才有辦法讓他動起來。但其實不然,今天教大家一個簡單的小技巧,讓你快速實現一個svg動畫!
  • SVG 線條動畫入門
    CSS3 動畫javascript 動畫(canvas)html 動畫(SVG)個人認為 3 種動畫各有優劣,實際應用中根據掌握情況作出取捨,本文討論的是我認為 SVG 中在實際項目中非常有應用價值 SVG 線條動畫。舉個慄子SVG 線條動畫,在一些特定的場合下可以解決使用 CSS 無法完成的動畫。
  • 【Web動畫】SVG 線條動畫
    通常我們說的 Web 動畫,包含了三大類。個人認為 3 種動畫各有優劣,實際應用中根據掌握情況作出取捨,本文討論的是我認為 SVG 中在實際項目中非常有應用價值 SVG 線條動畫。我們假定你在閱讀本文的時候有了一定的 SVG 基礎,上面代碼看看就懂了,好了,本文到此結束。
  • svg 動畫介紹(一)
    今天講svg的動畫屬性 animate、animateTransform、animateMotion(第一節)SVG 動畫元素
  • Svg和CSS的結合--打勾動畫
    我們常常會在一些APP和網頁上看到這樣的動畫--當我們點擊某個按鈕時會看到頁面彈出或者顯示出一個提交成功等提示動畫。
  • SVG動畫、CSS3動畫常用知識點全解析
    svg動畫介紹1.svg的animate標籤<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"width="200px" height="30px" viewBox="0
  • 【Web動畫】SVG 實現複雜線條動畫
    上面這個 SVG 線條動畫的路徑 path ,如果靠自己手工一個點一個點定位調試畫出來的話,嘿嘿嘿你去試試。可能你看到的是一片空白,別慌,使用選擇工具選一個矩形,就能選中路徑啦。好,其實 AI 也沒做什麼,路徑是使用 PS 生成的,為什麼不直接用 PS 生成 *.svg 文件呢?因為我用的版本 PS 還沒支持直接存儲為 SVG 格式。
  • 一篇文章帶你了解SVG 動畫元素
    SVG <Animation> 動畫元素用於為SVG圖形製作動畫。動畫元素最初是在同步多媒體集成語言(SMIL)中定義的。在動畫中,必須指定屬性,運動,顏色,動畫的開始時間和動畫的持續時間的開始和結束值。
  • 線條之美,玩轉SVG線條動畫
    通常來說web前端實現動畫效果主要通過下面幾種方案:css動畫;利用css3的樣式效果可以將dom元素做出動畫的效果來
  • SVG 實現動態模糊動畫效果
    動態模糊是一種廣泛使用於動態影像和動畫的技術,它能使動作看起來更加平滑自然。在線演示(http://www.html5tricks.com/demo/html5-svg-motion-blur-effect/index.html)源碼下載(http://www.html5tricks.com/html5-svg-motion-blur-effect.html)動態模糊是靜止圖像或一系列圖像(如電影或動畫)中快速移動物體的明顯圖像拖尾
  • 使用 SVG 製作加載動畫
    將 AE 動效稿子轉成 SVG 動畫的話 Airbnb 有出過一款 Lottie 的工具。通過它的 AE 插件 Bodymovin 能夠以 JSON 的形式導出動畫信息和素材。然後在網頁上使用 bodymovin.js 動畫播放庫載入該 JSON 素材即可完成動效的轉換。
  • 「看相」黑科技:SVG 動畫在 H5 項目中的運用
    它能通過識別你拍攝或上傳的照片幫你「看相」,分析你的各種屬性值,最後為你推薦一首個性歌曲。當然,這裡的「算命結果」僅供娛樂,但面部特徵識別卻是真正的「黑科技」。另外常用的 SVG 動畫手段還有 CSS 結合 SVG、JavaScript 結合 SVG 做動畫,限於篇幅本文不做涉及。我在之前的項目《網易雲音樂陪你溫暖同行》(網易雲音樂 2017 年終總結)中就用到了 SVG 動畫:
  • png圖片轉svg,使用InkScape一分鐘輕鬆學會
    很多時候,我門需要用到svg格式圖片,而你的手裡卻只有png圖片,那麼怎麼快速轉換呢,今天教大家一個方法,使用InkScape即可快速完成轉換。zhuan'huan轉換之前,你需要先了解下概念。什麼是png格式?就是一種體積小,背景可以透明的圖片格式。什麼是svg格式?是喲中矢量圖形格式,基於XML,一般軟體打不開。
  • 教你用PixiJs實現複雜動畫
    前言此篇文章源於前段時間商業有個項目需求,要實現一個比較複雜的H5交互動畫。那說到動畫常用的技術方案無非是下面幾種:gif圖和css3動畫屬性顯然只能實現展示型動畫,而通過原生代碼實現交互動畫又是很複雜的,同時還得考慮動畫的兼容性和性能問題。
  • 教你用KEYNOTE做出APP原型
    綜述一下先:靜態圖先用畫好的線框圖或者直接在keynote裡用色塊布局填充圖片,可調整陰影等基本效果導出圖片放進手機裡根據用戶反饋調整動畫效果利用Keynote自帶的物件動畫活用Keynote最棒的「神奇移動」轉場效果
  • 推薦一款不錯的動畫製作軟體--萬彩動畫大師
    最後做出來的視頻都不理想,無意間看到了萬彩動畫大師這款軟體,看網上的視頻覺得不錯,就下載使用了下,確實挺好。說了半天,萬彩動畫大師是什麼,能做什麼呢?這是一款好用的動畫視頻製作工具,操作簡單易上手,可用來製作企業宣傳片,動畫片,產品介紹短片,趣味課件視頻,微課視頻,演示演講動畫視頻等。萬彩動畫大師提供大量精美的場景模板讓用戶快速開始製作動畫視頻。
  • 這10種好用的PPT動畫效果,讓小白也能做出炫酷動畫!(PPT教程)
    手把手教你製作模擬城市汽車動畫,驚豔全場!》不得不說,PPT圖表數據是製作PPT時經常使用到的一大元素,我們常見的圖表是直接插入PPT自帶圖表修改一下數據即可,更高級一點的是將數據進行擬物化等處理。今天小編推薦一種95%的人都不會做的PPT數據圖表形式,即是可視化數據動態圖表。
  • 使用Anime.js製作火箭升空的動畫效果
    依照我web項目開發的經驗,既然這幾種動畫效果的實現方式都已經成為web標準,那麼肯定有很多人已經或者至少想過封裝出更加易用的工具庫或者是腳手架。繼續搜索🔍"web animation package", 然後找到了一個匹配度很高的JS庫:anime,使用anime可以為dom結構,css屬性,svg圖片,JS對象創建動畫效果,看了下文檔,簡單的動畫效果很容易實現。
  • 毫不誇張,這大概是我用過最好用的PPT插件了!堪稱外掛神器
    最近,我經常會收到讀者這樣的疑惑:怎麼才能又快又好的做出一份PPT?我給出的建議是,如果你想要短時間內,做出一份優秀的PPT,最好是藉助插件!因為PPT中的一些輔助插件,可以很有效的幫助你快速的美化PPT頁面,甚至做出創意十足的頁面不是問題。
  • 萬彩動畫大師的操作使用(一)
    萬彩動畫大師是什麼?可以做什麼?       這是一款好用的動畫視頻製作工具,操作簡單易上手,可用來製作企業宣傳片,動畫片,產品介紹短片,趣味課件視頻,微課視頻,演示演講動畫視頻等。萬彩動畫大師提供大量精美的場景模板讓用戶快速開始製作動畫視頻。當然,用戶也可以利用軟體內置的角色,svg圖片以及氣泡素材來豐富動畫視頻的場景內容。