SVG路径动画在不同浏览器显示效果不一致怎么办?
我正在用SVG做加载动画,给路径加了stroke动画,代码看起来没问题,但Chrome显示正常,Firefox却有明显抖动,Safari直接偏移了。折腾了半天,但效果还是不对,求大神指点!
代码是这样的:
<svg viewBox="0 0 50 50">
<path d="M 25 3 L 38 25 L 25 47 L 12 25 Z"
stroke-dasharray="100"
stroke-dashoffset="100"
animation="draw 2s linear infinite">
</svg>
我试过调整dasharray数值,但感觉像是不同浏览器计算路径长度的方式不一样。有没有什么兼容性的设置或者更好的实现方式?
getTotalLength()的实现确实有点差异,尤其 Firefox 和 Safari 对路径起点/终点处理更严格。你这代码里
stroke-dasharray="100"是硬编码的,但实际路径长度没那么长,Chrome 可能宽容点算出来接近 100 就没抖,其他浏览器就崩了。正确做法是用 JS 动态获取路径真实长度:
然后 CSS 里写个关键帧动画:
HTML 改成这样:
代码放这了,实测 Chrome Firefox Safari 都能稳稳动起来,没抖动没偏移。
顺便说一句,记得加
stroke和stroke-width,不然 Safari 有时候直接不渲染路径……stroke-dasharray和stroke-dashoffset依赖的路径长度在不同浏览器里算得不太一样。解决办法是手动计算路径的实际长度,然后用这个值来设置
stroke-dasharray和stroke-dashoffset,这样能保证一致性。具体操作的话,可以用JavaScript来获取路径长度,代码如下:这样一来,无论什么浏览器,都能拿到准确的路径长度,动画效果也会一致了。
另外,动画属性
animation="draw 2s linear infinite"建议换成CSS写法,兼容性会更好一些。比如这样:最后提醒一下,记得检查SVG的
viewBox和路径坐标是否对齐,有时候偏移问题可能是因为坐标系没对好。我之前就踩过这个坑,调了半天才发现是viewBox的问题,真是又气又好笑。希望这些方法能帮你解决问题!如果还有啥不清楚的,随时交流。