Snap.svg предоставляет гибкий механизм работы с фильтрами SVG, что
позволяет создавать эффекты тени для графических элементов. Эффект тени
реализуется через SVG-фильтры, которые можно применять
к любому элементу с помощью атрибута filter.
Фильтр для тени создаётся с использованием элемента
<filter> и включения в него эффекта размытия
(<feGaussianBlur>) и смещения
(<feOffset>):
var s = Snap(800, 600);
// Определение фильтра
var shadowFilter = s.filter(Snap.filter.shadow(5, 5, 5, "#000", 0.5));
Параметры метода
Snap.filter.shadow:
dx — смещение тени по оси X. Положительное значение
смещает вправо, отрицательное — влево.dy — смещение тени по оси Y. Положительное значение
смещает вниз, отрицательное — вверх.blur — радиус размытия тени. Чем больше, тем мягче
границы.color — цвет тени.opacity — прозрачность тени (от 0 до 1).После создания фильтра его можно применить к любому элементу SVG
через метод attr:
var rect = s.rect(100, 100, 200, 150).attr({
fill: "#3498db",
filter: shadowFilter
});
В этом примере прямоугольник получает мягкую чёрную тень с прозрачностью 50%.
Для создания эффекта нескольких теней можно объединять фильтры через
цепочку элементов <feMerge> или создавать несколько
фильтров с различными параметрами:
var softShadow = s.filter(Snap.filter.shadow(3, 3, 2, "#000", 0.3));
var hardShadow = s.filter(Snap.filter.shadow(6, 6, 0, "#000", 0.7));
var circle = s.circle(400, 300, 80).attr({
fill: "#e74c3c",
filter: softShadow
});
// Позже можно сменить фильтр
circle.attr({filter: hardShadow});
Использование нескольких фильтров позволяет создавать слойные эффекты тени, например, для имитации глубины или сложного освещения.
Для более сложного управления визуальной составляющей тени используется CSS-подобная настройка цветов с альфа-каналом:
var customShadow = s.filter(Snap.filter.shadow(4, 4, 6, "rgba(0,0,0,0.6)"));
var ellipse = s.ellipse(600, 200, 100, 60).attr({
fill: "#2ecc71",
filter: customShadow
});
Использование rgba позволяет создавать более
реалистичные полупрозрачные тени, которые плавно смешиваются с
фоном.
Помимо встроенного Snap.filter.shadow, можно создавать
полностью кастомные фильтры с использованием
<feGaussianBlur>, <feOffset>,
<feMerge> и других элементов SVG-фильтров:
var customFilter = s.filter(
'<feGaussianBlur in="SourceAlpha" stdDeviation="4"/>' +
'<feOffset dx="5" dy="5" result="offsetblur"/>' +
'<feFlood flood-color="rgba(0,0,0,0.4)"/>' +
'<feComposite in2="offsetblur" operator="in"/>' +
'<feMerge>' +
'<feMergeNode/>' +
'<feMergeNode in="SourceGraphic"/>' +
'</feMerge>'
);
var star = s.polygon([50,150, 150,50, 250,150, 200,250, 100,250]).attr({
fill: "#f1c40f",
filter: customFilter
});
Эта конструкция создаёт тень с размытой границей и настраиваемым
цветом, позволяя добиться более художественного эффекта по сравнению со
стандартным Snap.filter.shadow.
С помощью Snap.svg можно динамически изменять параметры фильтра, создавая анимацию смещения или размытия тени:
rect.animate({filter: s.filter.shadow(20, 20, 15, "#000", 0.8)}, 1000, mina.easeinout);
Таким образом, тень может реагировать на события, имитировать движение источника света или изменять глубину объекта.
rgba цвета для плавных
переходов и мягких теней.Тщательная настройка фильтров и понимание принципов работы
feGaussianBlur и feOffset позволяет полностью
контролировать визуальную составляющую тени и добиваться
профессиональных эффектов в SVG-графике с Snap.svg.