После манипулирования с SVG в Safari, веб-инспектор Safari действительно , кажется, распознает свойство стиля transform-origin
SVG, но фактически не использует его при применении преобразований, что странно (например, использование transform-origin: center;
или transform-origin: 0px 0px
или transform-origin: 50px 50px
не имели никакого эффекта), поэтому исправление заключается в изменении центра вращения с помощью других средств.
Насколько я могу судить, macOS Safari и iOS Safari оба используют transform-origin
только для преобразований на основе CSS с использованием свойства transform
и не при использовании преобразований на основе атрибутов SVG с использованием transform=""
- тогда как Blink и Gecko оба используют transform-origin
для обоих преобразования на основе атрибутов и CSS.
Использование translate
step
Один из подходов состоит в добавлении шага translate
, чтобы центр вращения центрировался на холсте, затем выполните вращение, затем отмените шаг translate
:
transform="translate( 50, 50 ) rotate(45) translate( -50, -50 )"
Примерно так:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="100" height="100">
<rect fill="red" x="45" y="0" width="10" height="100" />
<rect fill="blue" x="45" y="0" width="10" height="100" transform="translate(50,50) rotate(-45) translate(-50,-50)" />
<rect fill="green" x="45" y="0" width="10" height="100" transform="translate(50,50) rotate( 45) translate(-50,-50)" />
<rect fill="orange" x="45" y="0" width="10" height="100" transform="translate(50,50) rotate(-90) translate(-50,-50)" />
</svg>
Лучший подход: использование rotate( angle, x, y )
:
Вместо применения начального шага translate
к цепочке transform
, я видел что функция преобразования rotate
поддерживает указание центра вращения с использованием дополнительных аргументов - так что это работает в Safari, Chrome (+ Edge + Opera) и Firefox:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="100" height="100">
<rect fill="red" x="45" y="0" width="10" height="100" />
<rect fill="blue" x="45" y="0" width="10" height="100" transform="rotate(-45, 50, 50)" />
<rect fill="green" x="45" y="0" width="10" height="100" transform="rotate( 45, 50, 50)" />
<rect fill="orange" x="45" y="0" width="10" height="100" transform="rotate(-90, 50, 50)" />
</svg>