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