Настройка анимации SVG: запуск обводки из середины контура

Имеется SVG-файл со следующей структурой:

<?xml version="1.0"?>
<svg width="320" height="240" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
 <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
 <g>
  <title>Layer 1</title>
  <rect stroke="#000000" fill="none" stroke-width="4" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="37.94335" y="79.25392" width="248.405285" height="94.552735" id="svg_5"/>
 </g>
 <g display="inline">
  <title>Layer 2</title>
 </g>
</svg>

Задача состоит в том, чтобы анимация движения зелёной линии начиналась не с начала обводки элемента, а с её середины. Ниже представлено реализованное решение с использованием React и хука useEffect.

Реализация анимации

Код выполняет следующие ключевые действия:

  • Получает ссылку на SVG-элемент и целевой объект анимации
  • Инициализирует параметры обводки (stroke-dasharray и stroke-dashoffset)
  • Запускает анимацию с расчётом смещения, обеспечивающего начало отрисовки из середины контура

Ключевые моменты реализации

В функции анимации особенно важны следующие вычисления:

  • Определение длины контура: Используется метод getTotalLength() для получения общей длины пути
  • Расчёт начального смещения: Устанавливается начальная точка анимации на 50% длины контура (startOffset = 0.5 * totalLength)
  • Динамическое обновление stroke-dashoffset: Текущее смещение вычисляется с учётом прогресса анимации, что создаёт эффект "роста" линии из середины

Анимация контролируется флагом isAnimated и длится 6000 миллисекунд. При завершении анимации состояние isAnimated устанавливается в false, что останавливает процесс.

Данное решение обеспечивает точный контроль над начальной точкой анимации обводки и может быть адаптировано для других значений смещения путём изменения коэффициента в расчёте startOffset.