Библиотека SVG.js предоставляет гибкие методы для
динамического создания и вставки элементов SVG в документ. Основной
способ создания элемента — метод draw.*(), где
draw — контейнер SVG, а * — тип создаваемого
элемента: rect(), circle(),
line(), text() и т.д.
Пример создания прямоугольника:
const draw = SVG().addTo('body').size(400, 400);
const rect = draw.rect(100, 50).fill('#f06');
Метод add() позволяет вставить существующий элемент в
другой контейнер:
const group = draw.group();
group.add(rect);
При использовании nested() создаётся вложенный
SVG-контейнер:
const nestedSvg = draw.nested(200, 200).move(50, 50);
nestedSvg.circle(100).fill('blue');
Методы attr() и size() обеспечивают управление свойствами элементов:
rect.attr({ x: 10, y: 20, rx: 5, ry: 5 }); // установка нескольких атрибутов
rect.size(120, 60); // изменение ширины и высоты
Метод cx() и cy() управляют координатами
центра, а move() устанавливает позицию левого верхнего
угла:
rect.cx(200).cy(150);
rect.move(50, 50);
Для получения текущих значений используется аналогичный вызов без параметров:
const currentX = rect.x();
const currentWidth = rect.width();
Группы (group()) позволяют объединять
несколько элементов для совместных трансформаций и управления
стилями:
const group = draw.group();
const circle1 = draw.circle(50).fill('red');
const circle2 = draw.circle(50).fill('green').move(60, 0);
group.add(circle1).add(circle2);
group.move(100, 100).rotate(45);
Группы можно вкладывать друг в друга, создавая сложные иерархии.
Методы add(), children() и each()
позволяют управлять элементами внутри группы:
group.each(element => element.opacity(0.5));
Порядок элементов в DOM определяет их отображение.
SVG.js предоставляет методы front(),
back(), before(), after():
rect.front(); // перемещает элемент поверх всех
rect.back(); // помещает элемент под все остальные
circle1.before(rect); // вставка перед указанным элементом
circle2.after(rect); // вставка после указанного элемента
Метод index() позволяет получить или изменить позицию
элемента внутри родителя:
const idx = rect.index(); // получение индекса
rect.index(0); // установка нового индекса
Метод clone() создаёт точную копию элемента, включая все атрибуты и стили:
const rectClone = rect.clone().move(200, 50);
Метод remove() полностью удаляет элемент из DOM:
rect.remove();
Метод clear() очищает контейнер, удаляя все дочерние элементы:
group.clear();
SVG.js интегрируется с нативным DOM. Метод node возвращает DOM-узел элемента:
const svgNode = rect.node;
svgNode.addEventListener('click', () => console.log('Rect clicked'));
Методы appendTo(), prependTo(), append(), prepend() управляют добавлением элементов в любой DOM-контейнер:
const newRect = SVG().rect(50, 50).fill('orange');
newRect.appendTo(document.body);
Манипуляции DOM тесно связаны с трансформациями. Основные методы:
rect.rotate(30, 100, 50).scale(1.5, 1.5);
Метод transform() позволяет комбинировать все виды трансформаций в одном объекте:
rect.transform({ translateX: 50, translateY: 20, rotate: 45, scaleX: 2 });
Для поиска элементов в дереве SVG используются методы
find() и findOne(), которые принимают
CSS-подобный селектор:
const allRects = draw.find('rect');
const firstRed = draw.findOne('rect[fill="#f06"]');
Метод each() позволяет перебрать найденные элементы и выполнить операции над каждым:
draw.find('circle').each(c => c.fill('purple'));
Методы parent(), children() и
first()/last() облегчают навигацию по иерархии
элементов:
const parentGroup = circle1.parent();
const children = group.children();
Манипулирование DOM напрямую расширяет возможности анимации. Метод animate() используется для плавного изменения атрибутов и трансформаций:
rect.animate(1000).move(300, 100).fill('green');
Метод during() позволяет выполнять действия на каждом кадре анимации:
rect.animate(2000).during((pos, morph, eased) => {
rect.opacity(eased);
});
Метод loop() обеспечивает циклическую анимацию:
rect.animate(1000, '<>').loop();
SVG.js поддерживает обработку событий на уровне элементов:
rect.on('mouseenter', () => rect.fill('blue'));
rect.on('mouseleave', () => rect.fill('#f06'));
rect.off('mouseenter'); // отключение события
Метод click(), mouseover(), mouseout() предоставляют короткую запись для привязки событий.
Эти методы манипуляции DOM в SVG.js создают мощный инструмент для динамического управления графикой, комбинируя создание, трансформацию, группировку и взаимодействие с элементами SVG.