最近需要一个手写签名动画效果,最后用 SVG 实现咯。
stroke-dasharray
path 的 stroke-dasharray 的属性用来控制线段样式,奇数项定义实线,偶数项定义空白。
<svg height="80" width="300">
<g fill="none" stroke="black" stroke-width="4">
<path stroke-dasharray="5,5" d="M5 20 l215 0" />
<path stroke-dasharray="10,10" d="M5 40 l215 0" />
<path stroke-dasharray="20,10,5,5,5,10" d="M5 60 l215 0" />
</g>
</svg>
stroke-dashoffset
path 的 stroke-dashoffset 定义了线段开始的偏移量。
path.getTotalLength()
获取 path 的长度;
path.getPointAtLength(length)
获取给定长度 length 在 path 的坐标 (x, y);
svg.getBBox()
获取 svg 的原始大小;
实现方法
将 stroke-dasharray 的第二项定义为 path 的长度(path.getTotalLength()),第一项由 0 变化到长度。
使用 getPointAtLength 获取当前坐标,通过 CSS 应用到笔的元素上,如果 svg 经过了缩放,则使用 getBBox() 计算出比例。
补一个计算当前角度
var currentPoint = path.getPointAtLength(length);
var lastPoint = path.getPointAtLength(length - 1);
angle = Math.atan2(currentPoint.y - lastPoint.y, currentPoint.x - lastPoint.x) * 180 / Math.PI;

