CSS offset 路径动画演示

笔记哥 / 05-11 / 42点赞 / 0评论 / 744阅读
什么是路径动画? 随手画一条不规则的线,让元素按照这条不规则的线运动起来,这就是所谓的路径动画。 前面说过的动画都只能针对某一个 CSS 属性,要想实现路径动画可没办法,路径动画必须借助 CSS3 的 `offset` 相关能力。 ## offset 相关属性 要实现路径动画,必须用到 offset 的相关属性: `offset-anchor` 指定元素的运动中心在哪个点上,默认是元素中心点。 `offset-distance` 指定元素沿路径的运动距离,100% 表示路径总长度。 `offset-rotate` 设置元素沿路径方向的旋转角度。 `offset-position` 定义元素沿路径的初始位置。 `offset-path` 指定元素运动路径。 `offset` 简写属性,包括以上所有属性。 ### offset-anchor 设置中心的位置: ![](https://cdn.res.knowhub.vip/c/2505/11/36cc1536.png?G1QAAMTsdJxIPoSm26hD2jvFHc2ARBVBpZ71es9Z%2byb6fheWHJ%2fR%2bvT94Q%2btTye1wlZJWJQVwQNgFEDEQrVketWMuIYD) ### offset-distance 设置元素在这个路径中的运动距离: ![](https://cdn.res.knowhub.vip/c/2505/11/9e178369.png?G1QAAMTydJz4v%2bOJbqMO3yaKRJsBiSqCSj3r9fz%2fPpfI%2bzmVOd6zj%2bXnwx%2f6WC7WirYqVJoaggegKGROKVQoYagp7uk%3d) ### offset-rotate 设置元素在路径上的旋转角度: ![](https://cdn.res.knowhub.vip/c/2505/11/e7186b5f.png?G1UAAMTydJz4uw%2f0u406fJsoEpqBijSCSj3r9Z6z9i3y%2fa7QFJ%2fR%2bvT94RetT5dsBVZFoRkZIZAEixrsCgSNFbAa13A%3d) 其中第一个 `auto` 表示让浏览器自己计算角度,第二个角度值表示在计算出来的角度基础上再旋转多少度。 ### offset-position 说实话,没搞懂这属性的用法,虽然案例看起来属性值是有效的,但没理解到它的实际生效规则。 按照 w3c 的规范说法:如果 offset-path 属性使用的函数未指定起始位置时,则使用 offset-position 属性指定的起始位置。 看下图,虽然元素的位置变化了,但是路径动画的运动距离也跟着变化了!!真是没搞懂... ![](https://cdn.res.knowhub.vip/c/2505/11/94ad3f42.gif?G1UAAMTc2vOlu21Os9%2fToCVYBtoMVKQRVOpZr2fvf51E%2fXWBpHh9bUxfH37RxnSymlELCcRgCIGZwVmTlSOwGkRFNUfvNw%3d%3d) 以上图片的代码: ```html
``` ### offset-path 指定元素运动路径 `url()` 指定 SVG 形状元素的 ID,用法 `offset-path: url(#myCircle)`。 `ray()` 线段。用这东东还不如使用 transform 位移。 `circle()` 圆形,用法:circle(6rem at 12rem 8rem),表示:圆形,半径为 6rem,圆心为 12rem 8rem。 `ellipse()` 椭圆,用法 ellipse(40% 50% at left)。表示:椭圆,长轴为 40%,短轴为 50%,圆心为左边。 `polygon()` 多边形,语法 `polygon(x1 y1, x2 y2, x3 y3, ...)` `inset()` 内嵌矩形,用法 inset(20px 50px 10px 0 round 50px)。表示:20px 50px 10px 0 分别表示上右下左的距离,圆角为 50px。 `rect()` 矩形,用法 rect(50px 150px 200px 50px round 20%)。表示:矩形上边在 50px,右边在 150px,下边在 200px,左边在 50px,圆角为 20%。 `xywh()` 矩形,用法 xywh(20px 20px 100% 100% round 10%)。表示:矩形从 20px 20px 开始,宽高为 100%,圆角为 10%。 `path()` 路径,最为强大的一个东东,复杂的路径动画都需要使用它。 各种路径动画: ![](https://cdn.res.knowhub.vip/c/2505/11/5fd16ada.gif?G1QAAMTc2vOlu003s9%2fToCVYBtoMSFQRVOpZr2fvf51E%2fXWB5Hh9bUxfH%2f7QxnTSaqiFBKJQBM%2fMYMtScwrFTJGAI3q%2fAQ%3d%3d) 上图源码: ```html
``` ## 路径 这里说到的路径,使用到了 SVG 里面的相关知识,SVG 用于绘制矢量图形。 什么是矢量图形?矢量图形是由线条组成的图形,而不是由像素组成的图形,所以矢量图形在放大时,不会出现锯齿,也不会失真。 ### 绘制一条复杂的路径 这里推荐一个网站:https://www.photopea.com/ 此网站完全就是 PS 的在线版本,直接浏览器打开即可使用。 1、进入网站之后点击 `Start using Photopea` 开始使用。 2、有一个隐私选择,直接 `同意并继续` 即可,如果担心隐私问题,可以使用浏览器的 `无痕模式` 打开。 3、新建一个画布。 ![](https://cdn.res.knowhub.vip/c/2505/11/fb976b3a.png?G1QAAMTW3Dgp8AVG22gDdWfqnTYDElUElXrW6917rpvo%2bwOMMz%2b9thHrwx9qG0Hqxl4IDGVF8iLCYnqUgqRw8cvM8uwB) 4、使用钢笔工具勾勒出想要的路径形状。 提示:钢笔工具在画布上按住拖动可以绘制出曲线。 ![](https://cdn.res.knowhub.vip/c/2505/11/c90a847e.png?G1QAAMT0bJxoe1rCNvqh%2f4lHQjMgUUVQqWe93nv3aUTf72BofGYfy8%2bHP%2fSxnKxmroXAMDYELyIs2YomDlKQBJoR93Q%3d) 5、导出 SVG 文件。 ![](https://cdn.res.knowhub.vip/c/2505/11/e2528df9.png?G1QAAMTsdJzIJ5Ki26hD2jvFHc2ARBVBpZ71es9Z%2byb6fheIxme0Pn1%2f%2bEPr08nqhZpJIAZD8MwMzkiqElhLSQy1uIYD) 6、找到导出的 SVG ,用记事本打开,path 标签中的 `d` 属性就是路径的坐标值。 ![](https://cdn.res.knowhub.vip/c/2505/11/f28d0238.png?G1QAAMTmtHFSDvDfRjvQJlZNtBmQqCKo1LNe7737NKLvN4EE%2f8w%2blp0Pf%2bhjGcWaUDMJJCLCeWYGZ1TR4liRVFIJfk8D) ### 使用路径做路径动画 注意:本示例中为了看到运动路径,将 SVG 的代码也放在了代码中,实际无需 SVG 代码,仅需要 path 中的路径参数即可! ```html
``` 效果: ![](https://cdn.res.knowhub.vip/c/2505/11/095c9588.gif?G1UAAMS25fNVepJl%2fZ4N5oK2BtUMVKQRVOpZr%2becfzei8bqwpHh9fS7fH37R53LSmrkWEhZlRQgAGAUJogEZRQxmFn3c) ## 写在最后 路径动画让 CSS 在动画领域拥有了更多创造性,虽然还有一些新的特性在浏览器中的兼容不太理想,但未来可期~~