Контейнеры в SVG.js — это фундаментальный механизм структурирования
графики. Они позволяют группировать элементы, управлять их положением,
применять трансформации и повторно использовать ресурсы. Три ключевых
контейнера: g (группа), svg (вложенный
SVG-контекст) и defs (определения).
g
(группировка элементов)Контейнер g используется для логического объединения
нескольких SVG-элементов в единое целое. Все дочерние элементы наследуют
трансформации и некоторые атрибуты группы.
const draw = SVG().addTo('#canvas').size(400, 400)
const group = draw.group()
group.rect(100, 100).fill('red')
group.circle(50).move(25, 25).fill('blue')
Все элементы теперь принадлежат группе и могут управляться совместно.
Одно из ключевых преимуществ g — применение
трансформаций ко всем вложенным элементам:
group.translate(50, 50)
group.rotate(45)
group.scale(1.5)
Трансформация применяется ко всей группе, без необходимости изменять каждый элемент отдельно.
group.fill('green')
group.opacity(0.5)
Некоторые атрибуты (например, fill,
opacity) могут наследоваться дочерними элементами.
Группы могут быть вложенными:
const parentGroup = draw.group()
const childGroup = parentGroup.group()
childGroup.rect(50, 50).fill('orange')
Такая структура позволяет строить сложные иерархии.
element.addTo(group)
Элемент может быть динамически перемещён в другую группу.
group.children()
group.first()
group.last()
svg
(вложенный SVG)Контейнер svg создаёт новый независимый SVG-контекст
внутри текущего. Это аналог вложенного <svg> в чистом
SVG.
const nested = draw.nested()
Или:
const nested = draw.svg()
nested.size(200, 200)
nested.rect(100, 100).fill('purple')
Вложенный SVG позволяет изолировать систему координат:
nested.viewbox(0, 0, 100, 100)
Это удобно для масштабируемых компонентов.
g| Свойство | g |
svg |
|---|---|---|
| Система координат | общая с родителем | независимая |
| Трансформации | наследуются | изолированы |
| Использование | группировка | вложенные сцены |
defs
(определения)Контейнер defs используется для хранения элементов,
которые не отображаются напрямую, но могут быть использованы
повторно:
defsconst defs = draw.defs()
const gradient = defs.gradient('linear', function(add) {
add.stop(0, '#ff0000')
add.stop(1, '#0000ff')
})
draw.rect(200, 100).fill(gradient)
const pattern = defs.pattern(20, 20, function(add) {
add.rect(10, 10).fill('#ccc')
})
draw.rect(200, 200).fill(pattern)
const symbol = defs.symbol()
symbol.circle(50).fill('green')
draw.use(symbol).move(100, 100)
draw.use(symbol).move(200, 200)
use создаёт копию элемента без дублирования
структуры.
const marker = defs.marker(10, 10, function(add) {
add.path('M0,0 L10,5 L0,10 Z').fill('black')
})
draw.line(0, 0, 100, 100).marker('end', marker)
defsg и
defsconst group = draw.group()
const gradient = draw.defs().gradient('linear', add => {
add.stop(0, 'yellow')
add.stop(1, 'red')
})
group.rect(100, 100).fill(gradient)
const group = draw.group()
const nested = group.nested()
nested.circle(50).fill('blue')
g — логическая структураsvg — изоляция и масштабируемостьdefs — повторное использованиеСоздание переиспользуемых блоков:
function createButton(draw, x, y) {
const group = draw.group()
group.rect(100, 40).fill('#eee')
group.text('OK').move(30, 10)
return group.move(x, y)
}
defs для
темыconst theme = defs.gradient('linear', add => {
add.stop(0, '#222')
add.stop(1, '#555')
})
draw.rect(300, 200).fill(theme)
svgconst widget = draw.nested().size(100, 100)
widget.viewbox(0, 0, 10, 10)
widget.circle(5).center(5, 5)
контейнеры являются наследниками базового класса
Container
поддерживают методы:
.add().remove().children().clear()group.front()
group.back()
group.forward()
group.backward()
Порядок влияет на визуальное наложение.
g уменьшает количество операций при
трансформацияхdefs снижает дублирование DOMsvg позволяет изолировать сложные сценыg не влияют на координаты вложенного
svgdefs не отображаются без
useSVG.js полностью повторяет концепции:
<g> → group()<svg> → nested() /
svg()<defs> → defs()При этом добавляет удобный API и управление объектами.
const draw = SVG().addTo('#app')
const defs = draw.defs()
const gradient = defs.gradient('linear', add => {
add.stop(0, '#f06')
add.stop(1, '#0ff')
})
const group = draw.group()
group.rect(100, 100).fill(gradient)
const nested = draw.nested().size(200, 200)
nested.circle(80).center(100, 100).fill('green')
Контейнеры образуют основу архитектуры SVG-приложений, обеспечивая гибкость, масштабируемость и повторное использование графических элементов.