SVG использует двумерную декартову систему координат, в которой каждая точка определяется значениями по осям X (горизонталь) и Y (вертикаль). В отличие от классической математической модели:
(0, 0) находится в левом
верхнем углуЭто важно учитывать при работе с анимациями, поскольку направление движения и расчёт траекторий будут отличаться от привычных математических представлений.
Каждый SVG-документ имеет собственную систему координат, которая задаётся атрибутами:
widthheightviewBoxВ SVG координаты могут быть:
x="100" y="50")l, m, c вместо
L, M, C)В контексте библиотеки Vivus это особенно важно, поскольку она
анимирует именно пути (path), а значит,
корректность координат влияет на внешний вид анимации.
Пример пути:
<path d="M10 10 L100 100" />
Здесь:
M10 10 — перемещение в точку (10, 10)L100 100 — линия к точке (100, 100)Атрибут viewBox определяет, какая область
координат SVG отображается внутри контейнера.
Синтаксис:
viewBox="minX minY width height"
Пример:
<svg viewBox="0 0 200 100">
Это означает:
(0,0)SVG может иметь фиксированные размеры:
<svg width="400" height="200" viewBox="0 0 200 100">
В этом случае происходит масштабирование:
viewBox = 2 пикселя по
горизонталиviewBox = 2 пикселя по вертикалиЭто создаёт масштабируемую систему, где координаты остаются логическими, а не привязанными к пикселям.
Атрибут preserveAspectRatio управляет тем, как SVG
вписывается в контейнер при несоответствии пропорций.
Пример:
preserveAspectRatio="xMidYMid meet"
Основные режимы:
meet — сохраняет пропорции, добавляя пустые
областиslice — заполняет контейнер, обрезая лишнееnone — игнорирует пропорции (растягивает)Для анимаций Vivus чаще используется meet, чтобы
избежать искажений линий.
Библиотека Vivus анимирует SVG через постепенное прорисовывание линий
(stroke-dasharray и stroke-dashoffset). При
этом:
Если viewBox задан некорректно:
Рекомендуется использовать единый viewBox, например:
viewBox="0 0 1000 1000"
Преимущества:
Чтобы разместить объект по центру:
viewBoxcenterX = width / 2
centerY = height / 2
Пример:
<circle cx="500" cy="500" r="100" />
Для viewBox="0 0 1000 1000" это центр.
SVG поддерживает трансформации:
translate(x, y)scale(s)rotate(angle)matrix(...)Пример:
<g transform="translate(100, 50)">
<path d="M0 0 L100 0" />
</g>
Это сдвигает систему координат внутри группы
<g>.
Vivus учитывает трансформации, но:
Vivus использует метод:
path.getTotalLength()
Длина зависит от:
viewBox)Пример:
<path d="M0 0 L100 0" />
Длина = 100 единиц
Если изменить viewBox:
viewBox="0 0 200 100"
визуально линия станет короче, но логическая длина останется 100.
При использовании адаптивных SVG:
<svg viewBox="0 0 500 500" width="100%">
важно:
1. Отсутствие viewBox
<svg width="500" height="500">
Проблемы:
2. Несоответствие пропорций
viewBox="0 0 100 100"
width="500"
height="200"
Результат:
3. Слишком большие координаты
<path d="M10000 10000 L20000 20000" />
Проблемы:
Оптимальная структура:
<svg viewBox="0 0 500 500" preserveAspectRatio="xMidYMid meet">
<path d="M50 50 L450 50 L450 450 L50 450 Z" />
</svg>
Особенности:
Vivus поддерживает режимы:
delayedsynconeByOneВлияние координат:
sync длины путей определяют равномерностьoneByOne важен порядок и масштабdelayed влияет относительная длина каждого
pathРекомендации:
viewBox)g с трансформациямиpath (через редакторы)Графические редакторы (например, Illustrator, Figma) экспортируют SVG с собственными координатами:
Перед использованием в Vivus:
viewBoxviewBox задаёт систему координатpath описывает геометриюКорректная настройка координатной системы обеспечивает: