我更喜歡把這種動畫叫作路徑跟隨動畫或者軌跡動畫,正如你所看到的,一個元素(物體)沿着特定的路徑(軌跡)進行運動。css
若是想在 CSS 中讓一個元素沿着路徑運動,核心要用的的屬性有兩個,分別是 offset-path
、offset-distance
。html
offset-path
這個屬性接受一個 path
用於指定元素的運動軌跡。segmentfault
offset-distance
這個屬性聲明瞭元素沿着路徑運動的距離。經常使用 100%
表示路徑總長度。微信
這和上一章節介紹的 SVG 描邊動畫 原理很相似,甚至核心用到的屬性都用了相同的關鍵字 offset
app
其實 offset-path
這個屬性都前身叫作 motion-path
,而且全部 motion-*
相關都屬性都改成了 offset-*
svg
https://codepen.io/xiaoluobod...動畫
SVG SMIL animation 中定義了更簡單的方式實現路徑動畫,使用 animateMotion
元素。一樣能夠定義一個 path
指定了元素運動的軌跡。spa
https://codepen.io/xiaoluobod...插件
下面咱們使用 GreenSock 來實現火箭🚀沿着路徑運動的路徑動畫,GreenSock 中使用 MotionPathPlugin
實現路徑動畫,他支持讓任何 Dom、SVG、Canvas 等元素動起來code
咱們須要準備兩個矢量文件:
火箭咱們能夠在 OpenMoji 或者 icons8 查詢獲取:
路徑比較簡單,在 Sketch 中畫一條路徑,拷貝出路徑代碼
<path d="M254.176965,724.703501 C344.518264,740.446962 426.933366,723.447117 501.422273,673.703966 C613.155634,599.08924 556.372552,480.989479 673.298424,465.529966 C790.224296,450.070453 833.25236,631.21486 973.972003,584.009185 C1067.7851,552.538735 1124.45691,434.26844 1143.98743,229.1983" id="rocket-path"></path>
在使用 MotionPathPlugin
時須要先註冊插件
// register the plugin (just once) gsap.registerPlugin(MotionPathPlugin);
// 指定要運動都元素 gsap.to("#rocket", { duration: 3.3, repeat: -1, ease: Linear.easeNone, motionPath:{ path: "#rocket-path", // 沿着軌跡運動 align: "#rocket-path", autoRotate: true, alignOrigin: [0.5, 0.5] } });
https://codepen.io/xiaoluobod...
本文是《SVG 動畫開發實戰》 系列文章第六章。
小冊是在 Notion 上完成撰寫的,因此我保留了 Notion 的分享版本,你也能夠點擊這裏查看。
小冊提供了 GitHub 版本的在線閱讀體驗,傳送門
關注個人技術公號,一樣也能夠找到此小冊系列,目前在更新中。。。