Анимация перемещения image в svg

<svg id="example2" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <image width="100" height="100" x="150" y="10" xlink:href="http://via.placeholder.com/100x100/33ff99/555555?text=logo1" />
    <image id="orange-circle" width="100" height="100" x="0" y="0" xlink:href="http://via.placeholder.com/100x100/33ff99/555555?text=logo2" />
    <!-- <circle id="orange-circle" r="30" cx="50" cy="50" fill="orange" /> -->
    <animate 
    xlink:href="#orange-circle" 
    attributeName="cx" 
    from="50" to="450" dur="1s" fill="freeze" />
</svg>

У меня есть код который вставляет 2 картинки и код анимации, который должен переместить картинку вправо.

Анимация работает с circle но не работает с image.

Что я делаю не правильно?


Ответы (1 шт):

Автор решения: Alexandr_TT

Справочная информация

Старайтесь не задавать id через дефис между словами #orange-circle В командах анимации Firefox воспринимает это, как вычитание и анимация не работает. Это давно известный баг FF

Команды анимации можно писать, как вне тела кода, анимамированного объекта, так и внутри него. Надежнее и нагляднее последний способ написания анимации внутри объекта

<image .....>
<animate .... />
</image>

Обратите внимание на первую строчку, - тег image не закрыт и обязательно закрывающий тег </image> после окончания команды анимации.

Перемещения картинки.

Можно изменять параметр x, но это сильно нагружает видеокарту, так идет постоянный пересчет редеринга при перемещении на каждый пиксель.
Как указал в комментариях @Stranger in the Q лучше использовать transform="translate(x,y)"

Перемещение по X
Изменяем только координату x в команде translate

<animateTransform attributeName="transform" type="translate" 
  begin="0s" dur="4s" values="0,10;200,10;0,10" repeatCount="indefinite" /> 

<svg id="example2" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <image width="100" height="100" x="150" y="10" xlink:href="http://via.placeholder.com/100x100/33ff99/555555?text=logo1" />
    
	<image id="orange-circle" width="100" height="100" x="0" y="0" 
	xlink:href="http://via.placeholder.com/100x100/33ff99/555555?text=logo2" >
     <animateTransform attributeName="transform" type="translate" begin="0s" dur="4s" values="0,10;200,10;0,10" repeatCount="indefinite" /> 
	</image>  

  <circle id="orange-circle" r="30" cx="50" cy="50" fill="orange"> 
    <animate 
    attributeName="cx" 
    from="50" to="450" dur="2s" fill="freeze" repeatCount="indefinite" />
	</circle>
</svg>

Перемещение по обоим координатам сразу

Изменяем обе координаты x, y в команде translate

<svg id="example2" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <image width="100" height="100" x="150" y="10" xlink:href="http://via.placeholder.com/100x100/33ff99/555555?text=logo1" />
    
	<image id="orange-circle" width="100" height="100" x="0" y="0" 
	xlink:href="http://via.placeholder.com/100x100/33ff99/555555?text=logo2" >
     <animateTransform attributeName="transform" type="translate" begin="0s" dur="4s" values="0,10;200,10;200,100;10,100;0,10" repeatCount="indefinite" /> 
	</image>  

  <circle id="orange-circle" r="30" cx="50" cy="50" fill="orange"> 
    <animate 
    attributeName="cx" 
    from="50" to="450" dur="2s" fill="freeze" repeatCount="indefinite" />
	</circle>
</svg>

Перемещение группы объектов

В примере ниже круг и одно из изображений оборачиваются в групповой тег <g> и анимация применяется в целом для группы

<svg id="example2" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <image width="100" height="100" x="150" y="10" xlink:href="http://via.placeholder.com/100x100/33ff99/555555?text=logo1" />
  
  <g>
	<image id="orange-circle" width="100" height="100" x="0" y="0" 
	xlink:href="http://via.placeholder.com/100x100/33ff99/555555?text=logo2" >
 	</image>  
  <circle id="orange-circle" r="30" cx="50" cy="50" fill="orange"/> 
   <animateTransform attributeName="transform" type="translate" begin="0s" dur="4s" values="0,10;200,10;200,100;10,100;0,10" repeatCount="indefinite" /> 
  </g>  
	
</svg>

→ Ссылка