Для работы с внешними SVG в Snap.svg используется метод
Snap.load(). Он позволяет загружать SVG-файл и затем
работать с его содержимым как с обычными элементами Snap. Синтаксис:
Snap.load("path/to/file.svg", function(fragment) {
// fragment — загруженный SVG как фрагмент документа
});
Ключевой момент: загружаемый файл должен быть
корректным SVG, а путь к нему относительным или абсолютным URL.
fragment можно добавлять на канву с помощью метода
append или манипулировать отдельными элементами внутри
него.
После загрузки SVG-файла фрагмент необходимо встроить в основной документ:
var s = Snap("#svgCanvas");
Snap.load("icon.svg", function(fragment) {
s.append(fragment);
});
Здесь #svgCanvas — это контейнер
<svg> в HTML. Метод append добавляет все
элементы загруженного SVG внутрь канвы Snap, делая их доступными для
дальнейшей работы.
Фрагмент SVG, полученный через Snap.load(), является
объектом Fragment, который можно рассматривать как
мини-документ. Для доступа к конкретным элементам применяются методы
поиска, такие как select и selectAll:
Snap.load("icon.svg", function(fragment) {
var circle = fragment.select("circle");
circle.attr({
fill: "red",
r: 50
});
s.append(fragment);
});
Важные детали:
select(selector) возвращает первый найденный
элемент.selectAll(selector) возвращает массив найденных
элементов.SVG-файлы часто содержат элементы с атрибутом id.
Snap.svg позволяет напрямую получать доступ к таким элементам:
Snap.load("icon.svg", function(fragment) {
var path = fragment.select("#myPath");
path.attr({
stroke: "#0000FF",
strokeWidth: 2
});
s.append(fragment);
});
Использование id упрощает манипуляцию сложными SVG с
множеством элементов, позволяя работать только с нужными объектами.
После добавления фрагмента на канву можно применять трансформации и анимацию:
Snap.load("icon.svg", function(fragment) {
s.append(fragment);
var group = fragment.selectAll("*"); // выбираем все элементы
group.forEach(function(el) {
el.transform("translate(100,50) rotate(45)");
el.animate({opacity: 0.5}, 1000, mina.easeinout);
});
});
Особенности:
transform.animate и
встроенные функции тайминга mina.Snap.load работает асинхронно, поэтому при загрузке нескольких файлов нужно учитывать порядок выполнения. Пример последовательной загрузки:
Snap.load("icon1.svg", function(f1) {
s.append(f1);
Snap.load("icon2.svg", function(f2) {
s.append(f2);
});
});
Для параллельной загрузки можно использовать
Promise:
function loadSVG(path) {
return new Promise(resolve => Snap.load(path, resolve));
}
Promise.all([loadSVG("icon1.svg"), loadSVG("icon2.svg")])
.then(fragments => {
fragments.forEach(f => s.append(f));
});
Такой подход упрощает работу с большим количеством SVG и обеспечивает предсказуемую последовательность действий.
g и применять трансформации к группе.