【发布时间】:2020-05-08 12:57:33
【问题描述】:
我试图在贝塞尔曲线的中点放置一个箭头。在问题 How properly shift arrow head on cubic bezier in SVG to its center 中使用 <animateMotion> 的解决方案将移动箭头 <path> 并将其冻结在贝塞尔曲线的中间,仅适用于 Firefox。由于曲线的点在我的情况下经常变化,我不想使用marker-mid,因为每次计算贝塞尔曲线的中点对我来说成本很高。
<svg viewBox="0 0 500 500">
<g>
<path id="path1" d="M291.698 268.340 C321.698 268.340, 411.904 93.133 441.904 93.133"></path>
<path class="path_arrow" d="M0,0 L6,6 L0,12" transform="translate(-3,-6)">
<animateMotion dur="0s" rotate="auto" fill="freeze" keyTimes="0;1" keyPoints="0.5;0.5">
<mpath xlink:href="#path1"></mpath>
</animateMotion>
</path>
</g>
<g transform="translate(166.698,243.340)">
<circle r="5" class="p1"></circle>
</g>
<g transform="translate(441.904,68.133)" >
<circle r="5" class="p2"></circle>
</g>
</svg>
有没有办法使用 CSS Animations 来避免使用 <animateMotion> ?
编辑 1:
这里曲线的端点是可拖动的,因此曲线的点往往会经常变化。动画是将箭头移动到曲线的中心而不计算中点。
编辑 2:
感谢 Kaiido 的评论,我添加了calcMode="linear",箭头现在按预期放置在路径上。但是当我通过拖动重新定位终点时,箭头在 Chrome 中保持在其初始位置(如图所示),但预计会沿着父路径移动。在 Firefox 中,这和以前一样工作正常。
【问题讨论】:
-
分享完整的 SVG 和它的 viewbox,这样我们就可以看到动画了
-
提供的解决方案缺少一些使其在 Blink 浏览器上工作的东西,但从那时起我添加了它。 (
calcMode="linear")。因此,该解决方案现在适用于除 IE 之外的所有浏览器(尽管我没有测试,但它可能仍然适用于像 fakeSmile 这样的 polyfill)。你还需要一个纯 CSS 的解决方案吗?因为如果有的话,我担心你会得到比 SMIL 更低的浏览器支持。 -
关于你的“编辑2”你如何修改你的路径?
-
感谢 Kaiido 的回答。我只是根据移动的端点修改父路径的d值。我无法弄清楚 Firefox 如何自动执行动画,而 Chrome 没有。
-
那么用javascript?