一笔画皮卡丘:SVG 路径生长/画线动画

326 阅读1分钟

grow.gif

GitHub: github.com/icochi/pika…

Gitee: gitee.com/icochi/pika…

Codepen: codepen.io/icochi/pen/…

Bilibili: www.bilibili.com/video/BV1vR…

一、概述

SVG 图形元素一般都会有 fill 属性和 stroke 属性

keynote-jpg.009.jpeg fill 用于定义填充颜色

keynote-jpg.010.jpeg stroke 用于定义轮廓颜色。

keynote-jpg.011.jpeg

而图形轮廓除了实线,还可以是虚线,stroke-dasharray 就用来定义虚线轮廓的排列规则。

keynote-jpg.019.jpeg

二、stroke-dasharray

假设我们有一根接近无限长的绳子,需要间隔涂上黑、白两种颜色。

keynote-jpg.021.jpeg

而具体每种颜色分别涂多长,需要参考一个长度清单。

keynote-jpg.024.jpeg

我们从绳子中间开始涂色,在长度清单取值,间隔涂上黑色、白色。

keynote-jpg.027.jpeg

keynote-jpg.028.jpeg

keynote-jpg.029.jpeg

把正方向涂满,再回到中间位置。

keynote-jpg.037.jpeg

以相反的顺序往负方向涂色,

keynote-jpg.038.jpeg

keynote-jpg.039.jpeg

keynote-jpg.040.jpeg

直到整条绳子都涂满。

keynote-jpg.045.jpeg

现在我可以将这条绳子摆成任何形状,然后把不需要的部分盖住。

keynote-jpg.049.jpeg

浏览器的原理可能更复杂,但结果是一样的。

keynote-jpg.051.jpeg

三、stroke-dashoffset

而属性 stroke-dashoffset 就是用来设定,从绳子的什么位置开始摆这个形状。

keynote-jpg.053.jpeg

默认就是从我们涂第一个颜色的位置为起点,数值是几就往后移动多少。

keynote-jpg.058.jpeg

我们可以利用这个原理制作动画。

SVG 路径元素有 getTotalLength() 方法,可以得到路径总长度。

keynote-jpg.062.jpeg

我们把 stroke-dasharray 和 stroke-dashoffset 的值,设定为路径总长度。

keynote-jpg.064.jpeg

然后定义关键帧动画,将 stroke-dashoffset 递减为 0,路径生长动画就完成了。

offset-count-down.gif