Настройка анимации 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.