Работа с векторной графикой в браузере значительно упрощается при использовании готовых SVG-файлов, созданных в графических редакторах. Одним из наиболее удобных инструментов для подготовки таких файлов является Adobe Illustrator. Правильный экспорт и структура SVG напрямую влияют на то, насколько удобно будет управлять элементами через Snap.svg.
Перед экспортом важно правильно организовать документ:
button, icon_play,
background)Snap.svg позволяет обращаться к элементам через CSS-селекторы, поэтому корректные имена существенно ускоряют разработку.
Illustrator позволяет задать ID каждому объекту:
После экспорта это имя станет значением атрибута id в
SVG:
<rect id="button" x="10" y="10" width="100" height="50" />
В Snap.svg:
var button = Snap.select("#button");
Группы (<g>) позволяют управлять несколькими
объектами как единым целым:
<g id="icon">
<circle cx="50" cy="50" r="40" />
<polygon points="40,30 70,50 40,70" />
</g>
В Snap.svg:
var icon = Snap.select("#icon");
icon.attr({ opacity: 0.5 });
При сохранении файла (File → Export → Export As → SVG)
важно обратить внимание на настройки:
Presentation Attributes
(чтобы стили были в атрибутах, а не в CSS)Convert to Outlines (избегает
проблем с шрифтами)EmbedLayer Names (сохраняет
имена, заданные в слоях)Illustrator часто добавляет избыточные данные:
metadatasodipodi или inkscape-подобные
атрибутыtransformРекомендуется:
<svg id="scene"></svg>
var s = Snap("#scene");
Snap.load("image.svg", function(fragment) {
s.append(fragment);
});
Если SVG встроен в HTML:
<svg id="scene">
<rect id="box" x="10" y="10" width="100" height="100" />
</svg>
var box = Snap.select("#box");
box.attr({ fill: "blue" });
var circle = Snap.select("#circle");
circle.attr({
fill: "red",
stroke: "#000",
strokeWidth: 2
});
circle.animate(
{ r: 80 },
1000,
mina.easeinout
);
var group = Snap.select("#group");
group.animate(
{ transform: "translate(100,0)" },
500
);
Illustrator часто экспортирует элементы с transform. Это
влияет на поведение в Snap.svg.
<rect transform="translate(50,50)" />
В Snap.svg:
element.transform("translate(100,0)");
Важно учитывать, что трансформации могут накладываться, а не заменяться.
Path)<g> для логической структурыIllustrator активно использует <path>. Snap.svg
позволяет управлять ими:
var path = Snap.select("#line");
path.animate({
d: "M10 10 L200 200"
}, 1000);
Illustrator поддерживает:
После экспорта:
<clipPath id="clip">
<circle cx="50" cy="50" r="40" />
</clipPath>
В Snap.svg:
var rect = Snap.select("#rect");
rect.attr({
clipPath: "url(#clip)"
});
Illustrator может экспортировать стили:
<style>
.cls-1 { fill: red; }
</style>
<rect fill="red" />
Snap.svg лучше работает с атрибутами:
element.attr({ fill: "green" });
Текст в Illustrator:
<text>path)var text = s.text(50, 50, "Hello");
var button = Snap.select("#button");
button.click(function() {
this.animate({ transform: "scale(1.2)" }, 200);
});
button.hover(
function() {
this.attr({ fill: "orange" });
},
function() {
this.attr({ fill: "blue" });
}
);
Причина: неверные настройки экспорта Решение: использовать
Layer Names
Причина: сложные преобразования в Illustrator Решение: упрощать объекты перед экспортом
Причины:
Решение:
Illustrator поддерживает символы, но при экспорте они могут
превращаться в <use>:
<use xlink:href="#symbol1" />
Snap.svg:
var use = Snap.select("use");
var original = Snap.select("#shape");
var clone = original.clone();
clone.attr({ transform: "translate(100,0)" });
SVG можно разбивать на модули:
Snap.load("icon.svg", function(f) {
s.append(f);
});