Страницы

Поиск по вопросам

среда, 26 февраля 2020 г.

SVG изображение меняет размер после применения transform rotate

#javascript #svg #svg_animation


Я сделал SVG с машиной (image), которая следует за мышью и держит ее переднюю часть
к центру круга.  

Это очень хорошо работает в Windows (проверено на Chrome, Firefox, Edge). 

Проблема 

Когда положение машины меняется и начинается вращение, машина меняет размер без причины.
Это происходит (я думаю) на устройствах IOS (протестировано на Macbook - Safari и iPhone
- Safari & Chrome).

Положение просто изменяется, устанавливая x и y изображения. Вращение (которое, я
думаю, вызывает проблему) изменяется путем установки атрибута transform.

image.setAttributeNS(null, 'x', (xy.x - (12 * 0.25)));
image.setAttributeNS(null, 'y', (xy.y - (5.4 / 2)));
image.setAttributeNS(null, 'transform', 'rotate(' + (180 - angle) + ',' + xy.x +
',' + xy.y + ') '); 


Я сделал fiddle, где при нажатии на кнопку происходит перемещение  машины на другую
позицию . Пожалуйста, попробуйте это в Safari и Chrome, чтобы увидеть разницу.       
    


Ответы

Ответ 1



Пожалуйста, сообщите мне, - если это то движение машины, которое вам необходимо: var circle = document.getElementById("circle"); var radius = 100 / (2 * Math.PI); var xmlns = "http://www.w3.org/2000/svg"; var procent = 100 / (360 / 15); var offset = 0 - procent / 2; let angle = 0 function rotateCar(){ requestAnimationFrame(rotateCar); angle +=.5; car.setAttributeNS(null, 'transform', `rotate(${angle},21,21)`); } rotateCar() .wrapper { height: 300px; width: 300px; border: 1px solid black; }
В случае, если вы хотите центрировать автомобиль на дорожке, вы можете сделать что-то вроде этого: Вы оборачиваете изображение в группу. Внутри группы машина позиционируется так, чтобы она была в центре. Далее вы вращаете группу. var circle = document.getElementById("circle"); var radius = 100 / (2 * Math.PI); var xmlns = "http://www.w3.org/2000/svg"; var procent = 100 / (360 / 15); var offset = 0 - procent / 2; let angle = 0 function rotateCar(){ requestAnimationFrame(rotateCar); angle +=.5; car.setAttributeNS(null, 'transform', `rotate(${angle},21,21)`); } rotateCar() .wrapper { height: 300px; width: 300px; border: 1px solid black; }


Ответ 2



Второй вариант движения машины Чтобы развернуть машину для движения вдоль трассы и для уменьшения её размеров применена команда трансформации: transform:rotate(75deg) scale(0.75); В svg для корректного вычисления центра вращения потребовались бы некоторые усилия. В css это реализуется проще: transform-box: fill-box; - контейнер по габаритным размерам объекта И вычисляется центр вращения transform-origin:50% 50%;


Комментариев нет:

Отправить комментарий