Вы можете добиться того же с помощью CSS offset-path
, offset-distance
и offset-rotate
свойств:
#path1 {
fill: none;
stroke: black;
}
.path_arrow {
transform: translate( -3px, -6px );
offset-path: path("M220 104C220 144,400 180,400 224");
offset-rotate: auto;
offset-distance: 50%;
}
body { background: white; }
<svg width="500" height="500" >
<path id="path1" d="M 220 104 C 220 144 400 180 400 224"
fill="none" stroke-width="2" stroke="black" />
<path class="path_arrow" d="M0,0 L0,12 L12,6 z" />
</svg>
Но поддержка их браузером намного ниже, чем у SMIL , поэтому я бы не рекомендовал его .
Обратите внимание, что я исправил ответ там , где отсутствовал атрибут calcMode="linear"
, чтобы порадовать браузеры Blink.
Если вам нужна поддержка IE, вы можете попробовать эту js реализацию , которая, кажется, поддерживает <animateMotion>
и rotate
, имея в виду, что я не тестировал ее сам.
Что касается вопроса «РЕДАКТИРОВАТЬ 2»:
Chrome действительно, кажется, нужен явный вызов для обновления <mpath>
. Это можно сделать, вызвав метод beginElement()
элемента <animationMotion>
после каждого обновления:
document.querySelector('svg').onmousemove = function(e) {
const rect = this.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
path1.setAttribute( 'd', `M ${x} ${y} C 220 144 400 180 400 224` );
// Chrome requires an explicit update
document.querySelector('animateMotion').beginElement();
}
move your mouse to change the path