Как я могу сделать элемент SVG для перемещения по пути?

#svg #svg-animate

Вопрос:

Я хочу двигаться а rect вдоль а path . Поэтому я перевел rect так, чтобы его позиция была началом path . Но когда я запускаю анимацию rect , перевод интерпретируется относительно path . Таким образом rect , перемещения со смещением перевода вдоль пути.

Вот пример:

 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="600px"
    height="400px">
    <defs />
    <path id="path" d="M 100 100 L 100 15 L 500 15 L 500 150" fill="none" stroke="#000000" stroke-width="3"
      stroke-miterlimit="10" pointer-events="none" />
    <g transform="translate(50,75)">
      <rect height="50" width="100" fill="#FDD34D" rx="10" stroke-width="1px" stroke="#000000">
      </rect>
      <text x="15" y="28">Click me !</text>
      <animateMotion id="move" dur="4.6s" begin="click">
        <mpath xlink:href="#path" />
      </animateMotion>
    </g>
  </svg> 

Как я могу заставить rect себя двигаться по этому пути?

Редактировать

Я ищу решение, которое работает с несколькими различными путями. Например.

   <svg viewBox="-100 -130 700 400">
    <defs />
    <path id="path" d="M 0 0 L 0 -90 L 500 -90 L 500 150" fill="none" stroke="#ff0000" stroke-width="3"
      stroke-miterlimit="10" pointer-events="none" />

    <path id="path2" d="M 150 0 L 150 90 L -50 90 L -50 150" fill="none" stroke="#ff0000" stroke-width="3"
      stroke-miterlimit="10" pointer-events="none" />
    <g>
      <rect height="50" width="100" x="-50" y="-25" fill="#FDD34D" rx="10" stroke-width="1px" stroke="#000000" />
      <text text-anchor="middle" dominant-baseline="middle">Click me !</text>
      <animateMotion id="move" dur="4.6s" begin="click">
        <mpath xlink:href="#path" />
      </animateMotion>
    </g>

    <g>
      <rect height="50" width="100" x="100" y="-25" fill="#FDD34D" rx="10" stroke-width="1px" stroke="#000000" />
      <text text-anchor="middle" x="150" dominant-baseline="middle">Click me !</text>
      <animateMotion id="move" dur="4.6s" begin="click">
        <mpath xlink:href="#path2" />
      </animateMotion>
    </g>
  </svg> 

Ответ №1:

Основная идея состоит в том, чтобы текст и прямоугольник были сосредоточены вокруг точки x=0, y=0

 <svg  viewBox="-100 -130 700 400">
    <defs />
    <path id="path" d="M 0 0 L 0 -90 L 500 -90 L 500 150" fill="none" stroke="#ff0000" stroke-width="3"
      stroke-miterlimit="10" pointer-events="none" />
   <g>
      <rect height="50" width="100" x="-50" y="-25" fill="#FDD34D" rx="10" stroke-width="1px" stroke="#000000"/>    
      <text text-anchor="middle" dominant-baseline="middle">Click me !</text>
      <animateMotion id="move" dur="4.6s" begin="click">
        <mpath xlink:href="#path" />
      </animateMotion>
    </g>
  </svg> 

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

1. Отличная идея — центрировать текст и прямоугольник вокруг одной точки x = 0, y = 0!

2. Я добавил ответ. Это то, что вы имели в виду под «точкой x=0, y=0»?

Ответ №2:

Ладно, думаю, теперь я понял.Вы визуализируете какой-то элемент в центре, а затем переводите его в нужное положение.

   <svg viewBox="0 0 800 500">
<defs />

<g transform="translate(100, 120)">
  <path id="path" d="M 0 0 L 0 -85 L 500 -85 L 500 150" fill="none" stroke="#000000" stroke-width="3"
    stroke-miterlimit="10" pointer-events="none" />

  <g>
    <rect height="50" width="100" x="-50" y="-25" fill="#FDD34D" rx="10" stroke-width="1px" stroke="#000000">
    </rect>
    <text dominant-baseline="middle" text-anchor="middle">Click me !</text>
    <animateMotion id="move" dur="4.6s" begin="click">
      <mpath xlink:href="#path" />
    </animateMotion>
  </g>
</g>

<g transform="translate(180, 200)">
  <path id="path2" d="M 0 0 L 0 50 L 300 50 L 300 -100" fill="none" stroke="#000000" stroke-width="3"
    stroke-miterlimit="10" pointer-events="none" />

  <g>
    <rect height="50" width="100" x="-50" y="-25" fill="#FDD34D" rx="10" stroke-width="1px" stroke="#000000">
    </rect>
    <text dominant-baseline="middle" text-anchor="middle">Click me !</text>
    <animateMotion id="move" dur="4.6s" begin="click">
      <mpath xlink:href="#path2" />
    </animateMotion>
  </g>
</g>
  </svg>