Библиотека Vivus работает с SVG-графикой через привязку к DOM-элементам. Ключевым моментом является корректный выбор элемента, к которому будет применяться анимация. В основе лежит стандартный механизм селекторов, знакомый по JavaScript и CSS.
Vivus принимает в качестве первого аргумента:
id)Простейший пример:
new Vivus('my-svg', {
type: 'delayed',
duration: 200
});
В данном случае 'my-svg' — это значение атрибута
id SVG-элемента:
<svg id="my-svg" viewBox="0 0 200 200">
<path d="..." />
</svg>
Vivus автоматически находит элемент через
document.getElementById.
Вместо строкового селектора можно передать уже найденный элемент:
const svgElement = document.querySelector('#my-svg');
new Vivus(svgElement, {
type: 'sync'
});
Такой подход удобен при:
Vivus не поддерживает множественную инициализацию через один вызов. Для нескольких SVG требуется создавать отдельный экземпляр для каждого:
const svgs = document.querySelectorAll('.icon');
svgs.forEach(svg => {
new Vivus(svg, {
duration: 150
});
});
Важно: querySelectorAll возвращает NodeList, а не
отдельный элемент — Vivus не сможет работать с коллекцией напрямую.
Иногда SVG размещается внутри контейнера:
<div id="container">
<svg viewBox="0 0 100 100">
<path d="..." />
</svg>
</div>
Передача контейнера:
new Vivus('container', {
file: 'image.svg'
});
Здесь поведение зависит от параметра file:
file, Vivus загрузит SVG внутрь
контейнераfileVivus умеет подгружать SVG-файлы:
new Vivus('container', {
file: 'path/to/image.svg'
});
Особенности:
При этом селектор указывает именно на контейнер, а не на SVG.
Vivus напрямую не поддерживает CSS-селекторы (например
.class или div > svg). Передача строки
интерпретируется строго как id.
Неверно:
new Vivus('.icon'); // не сработает
Правильно:
const element = document.querySelector('.icon');
new Vivus(element);
Если SVG добавляется после загрузки страницы (например, через AJAX или JS), необходимо:
Пример:
setTimeout(() => {
const svg = document.querySelector('#dynamic-svg');
new Vivus(svg, {
duration: 200
});
}, 1000);
Или через MutationObserver:
const observer = new MutationObserver(() => {
const svg = document.querySelector('#dynamic-svg');
if (svg) {
new Vivus(svg);
observer.disconnect();
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
Vivus не всегда явно сообщает об ошибках селектора. При передаче несуществующего элемента возможны:
Рекомендуется проверка:
const el = document.getElementById('my-svg');
if (el) {
new Vivus(el);
}
Vivus не ищет элементы внутри Shadow DOM автоматически. Если SVG находится внутри теневого дерева:
const shadowRoot = element.shadowRoot;
const svg = shadowRoot.querySelector('svg');
new Vivus(svg);
Vivus анимирует все path внутри SVG. Однако можно ограничить область:
<svg id="icon">
<g id="animate-me">
<path d="..." />
</g>
<g>
<path d="..." />
</g>
</svg>
const group = document.querySelector('#animate-me');
new Vivus(group);
Таким образом анимация применяется только к выбранной группе.
SVG — это XML-документ, встроенный в HTML. Поэтому:
querySelector работает аналогичноpath, g,
circle и другие элементыПример:
const paths = document.querySelectorAll('#my-svg path');
paths.forEach(path => {
console.log(path);
});
Vivus автоматически обрабатывает все path, но их можно
подготовить заранее:
Vivus поддерживает атрибут:
<path d="..." data-ignore="true" />
Такие элементы не будут анимироваться, даже если находятся внутри выбранного SVG.
Порядок анимации зависит от порядка элементов в DOM:
<svg>
<path id="first" />
<path id="second" />
</svg>
Vivus сначала анимирует first, затем
second.
Изменить порядок можно:
const svg = document.querySelector('#my-svg');
const paths = svg.querySelectorAll('path');
svg.appendChild(paths[0]); // перемещение в конец
При повторном использовании одного и того же элемента важно:
Неправильно:
new Vivus('my-svg');
new Vivus('my-svg'); // конфликт
Правильно — использовать один экземпляр:
const anim = new Vivus('my-svg');
anim.reset().play();
Каждый SVG должен иметь уникальный id, если используется
строковый селектор:
<svg id="icon1"></svg>
<svg id="icon2"></svg>
Повторяющиеся id приведут к:
| Подход | Когда использовать |
|---|---|
new Vivus('id') |
простой случай |
new Vivus(element) |
динамика, сложная логика |
querySelector + Vivus |
классы, вложенность |
контейнер + file |
загрузка SVG извне |
| цикл по NodeList | множественные SVG |
Грамотная работа с селекторами обеспечивает корректную инициализацию Vivus, управляемый порядок анимации и гибкость при интеграции в сложные интерфейсы.