Snap.svg предоставляет гибкий API для работы с векторной графикой в
формате SVG. Одной из часто используемых возможностей является получение
содержимого SVG в виде строки. Различают два подхода: получение
inner SVG и outer SVG, которые
позволяют экспортировать либо внутреннее содержимое элемента, либо весь
элемент целиком с тегом <svg>.
Inner SVG — это строковое представление содержимого
элемента <svg> без самого контейнера
<svg>. В Snap.svg это достигается с помощью метода
innerSVG объекта Paper или любого элемента
типа Element.
Пример:
// Создание SVG контейнера
var s = Snap(400, 400);
// Добавление элементов
var circle = s.circle(100, 100, 50).attr({
fill: "red",
stroke: "#000",
strokeWidth: 2
});
var rect = s.rect(150, 150, 100, 50).attr({
fill: "blue",
stroke: "#000",
strokeWidth: 2
});
// Получение inner SVG
var inner = s.innerSVG();
console.log(inner);
В результате inner будет содержать строку, примерно
такую:
<circle cx="100" cy="100" r="50" fill="red" stroke="#000" stroke-width="2"/>
<rect x="150" y="150" width="100" height="50" fill="blue" stroke="#000" stroke-width="2"/>
Ключевые моменты:
innerSVG() возвращает только вложенные
элементы, без тега <svg>.Outer SVG — это полное представление SVG, включая
сам тег <svg> и все вложенные элементы. Snap.svg
предоставляет метод outerSVG(), который часто используется
для сохранения готовой графики в файл или передачи в другой
контекст.
Пример:
// Используем тот же контейнер s
var outer = s.outerSVG();
console.log(outer);
Результат будет примерно таким:
<svg width="400" height="400" xmlns="http://www.w3.org/2000/svg">
<circle cx="100" cy="100" r="50" fill="red" stroke="#000" stroke-width="2"/>
<rect x="150" y="150" width="100" height="50" fill="blue" stroke="#000" stroke-width="2"/>
</svg>
Особенности:
outerSVG() включает все атрибуты
контейнера, такие как width, height,
xmlns.Методы innerSVG и outerSVG доступны не
только для объекта Paper (SVG контейнера), но и для
отдельных элементов Snap. Например:
var g = s.group(circle, rect);
var gInner = g.innerSVG(); // только содержимое группы
var gOuter = g.outerSVG(); // группа вместе с тегом <g>
Пример вывода:
<!-- g.innerSVG() -->
<circle cx="100" cy="100" r="50" fill="red" stroke="#000" stroke-width="2"/>
<rect x="150" y="150" width="100" height="50" fill="blue" stroke="#000" stroke-width="2"/>
<!-- g.outerSVG() -->
<g>
<circle cx="100" cy="100" r="50" fill="red" stroke="#000" stroke-width="2"/>
<rect x="150" y="150" width="100" height="50" fill="blue" stroke="#000" stroke-width="2"/>
</g>
Преимущества:
Snap.svg хранит элементы как объекты JavaScript, но иногда требуется получить строку SVG через DOM API:
var svgNode = s.node; // объект <svg> в DOM
var outerDom = new XMLSerializer().serializeToString(svgNode);
console.log(outerDom);
Этот подход работает независимо от Snap.svg и позволяет полностью контролировать сериализацию, включая комментарии и пространственные атрибуты.
При экспорте через outerSVG или innerSVG
важно помнить:
.attr().fill,
stroke, stroke-width, но CSS внутри
<style> тегов не сериализуется
автоматически.<style> перед сохранением.Использование innerSVG() подходит для:
Использование outerSVG() подходит для:
Эти методы позволяют гибко управлять экспортом графики на уровне контейнера и отдельных элементов, обеспечивая полное покрытие сценариев работы с SVG в Snap.svg.