Селекторы в библиотеке Snap.svg обеспечивают доступ к существующим SVG-элементам, позволяя находить, модифицировать и управлять ими. Они во многом повторяют концепции CSS-селекторов и методов работы с DOM, но адаптированы под специфику SVG.
Snap.svg предоставляет несколько ключевых методов для выбора элементов:
Snap.select()Snap.selectAll()select() и selectAll() у объектов
типа Paper или ElementSnap.select()Метод Snap.select() используется для поиска первого
элемента, соответствующего заданному CSS-селектору.
Синтаксис:
var element = Snap.select(selector);
Пример:
var circle = Snap.select("circle");
circle.attr({
fill: "red"
});
В данном случае выбирается первый элемент <circle>
в документе и изменяется его цвет заливки.
Особенности:
ElementnullSnap.selectAll()Позволяет выбрать все элементы, соответствующие селектору.
Синтаксис:
var elements = Snap.selectAll(selector);
Пример:
var circles = Snap.selectAll("circle");
circles.forEach(function(el) {
el.attr({
stroke: "black"
});
});
Особенности:
Set)forEachВместо глобального поиска можно ограничить область выборки конкретным SVG-контейнером.
Пример:
var s = Snap("#svg");
var rect = s.select("rect");
rect.attr({
fill: "blue"
});
В этом случае поиск будет выполняться только внутри элемента
#svg.
select() у
элементовКаждый элемент Snap.svg может выполнять поиск внутри себя.
Пример:
var group = Snap.select("#group");
var innerCircle = group.select("circle");
innerCircle.attr({
r: 50
});
Это особенно полезно при работе с вложенными структурами SVG.
selectAll() у
элементовАналогично, можно выбрать все дочерние элементы, соответствующие селектору:
var group = Snap.select("#group");
var allRects = group.selectAll("rect");
allRects.forEach(function(el) {
el.attr({
opacity: 0.5
});
});
Snap.svg поддерживает стандартные CSS-селекторы:
Snap.select("rect");
Snap.select("#myCircle");
Snap.select(".active");
Snap.select("g.highlight circle");
Snap.select('rect[width="100"]');
После получения элемента или набора элементов доступны все методы Snap.svg:
attr() — изменение атрибутовanimate() — анимацияremove() — удалениеaddClass() / removeClass() — управление
классамиПример:
var items = Snap.selectAll(".item");
items.forEach(function(el) {
el.animate({
transform: "r45"
}, 500);
});
Так как Snap.select() может вернуть null,
необходимо учитывать это при работе:
var el = Snap.select("#unknown");
if (el) {
el.attr({ fill: "green" });
}
При частой работе с селекторами важно учитывать:
select() могут быть затратнымиПлохо:
Snap.select("#rect").attr({ x: 10 });
Snap.select("#rect").attr({ y: 20 });
Лучше:
var rect = Snap.select("#rect");
rect.attr({ x: 10 });
rect.attr({ y: 20 });
Хотя синтаксис похож на querySelector, есть важные
различия:
| Особенность | Snap.svg | DOM API |
|---|---|---|
| Возвращаемый тип | Element / Set | Node / NodeList |
| Методы работы | attr(), animate() | setAttribute(), style |
| Анимации | встроенные | через CSS/JS |
Селекторы применимы и к элементам, созданным через Snap:
var s = Snap("#svg");
var rect = s.rect(10, 10, 100, 100).attr({
id: "myRect"
});
var found = Snap.select("#myRect");
found.attr({
fill: "yellow"
});
При сложных SVG-документах селекторы позволяют точно находить нужные элементы:
var s = Snap("#svg");
var target = s.select("g#menu rect.button");
target.attr({
fill: "orange"
});
querySelectorAllvar s = Snap("#svg");
// Выбрать все круги внутри группы
var circles = s.select("g#group").selectAll("circle");
// Применить стиль
circles.forEach(function(el) {
el.attr({
fill: "#3498db",
stroke: "#2c3e50",
strokeWidth: 2
});
});
id) ускоряет
выборкуСелекторы в Snap.svg напрямую работают с DOM-структурой SVG-документа, что позволяет:
Set)Объект Set, возвращаемый selectAll(),
предоставляет удобный API:
var elements = Snap.selectAll("rect");
elements.forEach(function(el, index) {
el.attr({
x: index * 20
});
});
Система селекторов в Snap.svg сочетает привычный синтаксис CSS с мощными возможностями управления SVG, обеспечивая гибкий и удобный способ работы с графическими элементами на уровне DOM.