Библиотека Snap.svg распространяется в виде одного JavaScript-файла, который подключается к HTML-документу. Минимальная структура проекта включает три основных компонента:
Пример базовой структуры каталогов:
project/
│
├── index.html
├── js/
│ └── app.js
├── css/
│ └── styles.css
└── libs/
└── snap.svg-min.js
Размещение библиотеки в отдельной директории libs
упрощает поддержку и обновление зависимостей.
В основе работы Snap.svg лежит взаимодействие с SVG-контейнером. Он может быть объявлен непосредственно в HTML:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Snap.svg Project</title>
<link rel="stylesheet" href="css/styles.css">
</head>
<body>
<svg id="canvas" width="600" height="400"></svg>
<script src="libs/snap.svg-min.js"></script>
<script src="js/app.js"></script>
</body>
</html>
Ключевые моменты:
id используется для привязки Snap.svgВ JavaScript создаётся объект, связанный с SVG-контейнером:
var s = Snap("#canvas");
Альтернативный вариант — создание SVG динамически:
var s = Snap(600, 400);
document.body.appendChild(s.node);
Основные особенности:
Snap(selector) — выбирает существующий SVGSnap(width, height) — создаёт новый SVGs.node — доступ к DOM-элементуДля крупных проектов важно избегать монолитных файлов. Логика разбивается на отдельные модули:
js/
├── app.js
├── shapes.js
├── animations.js
└── utils.js
Пример структуры:
app.js
var s = Snap("#canvas");
initScene(s);
drawShapes(s);
shapes.js
function drawShapes(s) {
s.circle(100, 100, 50);
}
Такой подход обеспечивает:
Snap.svg предоставляет обёртки над SVG-элементами. Каждый созданный элемент — это объект с методами:
var circle = s.circle(150, 150, 50);
circle.attr({
fill: "#3498db",
stroke: "#2c3e50",
strokeWidth: 5
});
Особенности:
.attr() — основной способ задания атрибутовДля организации сложных сцен используются группы:
var group = s.group();
var rect = s.rect(10, 10, 100, 50);
var circle = s.circle(60, 60, 30);
group.add(rect, circle);
Преимущества:
Snap.svg поддерживает загрузку внешних SVG:
Snap.load("assets/image.svg", function(data) {
s.append(data);
});
Рекомендации по структуре:
assets/
├── icons/
│ └── icon.svg
└── illustrations/
└── scene.svg
Преимущества:
Стили могут задаваться тремя способами:
.attr()CSS-пример:
svg {
background: #f5f5f5;
}
.circle {
fill: red;
}
JS:
var c = s.circle(50, 50, 40);
c.addClass("circle");
Часто используется функция начальной настройки:
function initScene(s) {
s.attr({
viewBox: "0 0 600 400"
});
}
Использование viewBox:
Snap.svg интегрируется с DOM-событиями:
var rect = s.rect(100, 100, 200, 100);
rect.click(function() {
this.attr({ fill: "#e74c3c" });
});
Доступные события:
clickmouseovermouseoutmousedown, mouseupАнимации часто выделяются в отдельный модуль:
function animateCircle(circle) {
circle.animate({ r: 80 }, 1000);
}
Snap.svg использует встроенный механизм:
element.animate(attrs, duration, easing, callback);
index.html
<svg id="canvas"></svg>
<script src="snap.svg-min.js"></script>
<script src="app.js"></script>
app.js
var s = Snap("#canvas");
var circle = s.circle(100, 100, 50);
circle.attr({ fill: "blue" });
При развитии проекта добавляются:
Пример более сложной структуры:
js/
├── core/
│ ├── scene.js
│ ├── renderer.js
│
├── components/
│ ├── button.js
│ ├── icon.js
│
├── animations/
│ ├── fade.js
│ ├── scale.js
│
└── main.js
Такая организация позволяет эффективно масштабировать проекты на Snap.svg, поддерживать чистоту кода и упрощать дальнейшее развитие графических интерфейсов.