SVG.js предоставляет мощные инструменты для создания визуальных эффектов с помощью фильтров SVG, таких как тени и размытие. Эти эффекты позволяют добавлять глубину, объем и динамичность графике, оставаясь полностью векторными и масштабируемыми.
Тень создается с помощью фильтра filter в SVG. В SVG.js
это реализуется через метод .filter() и встроенные фильтры,
такие как shadow().
const draw = SVG().addTo('body').size(400, 400);
const rect = draw.rect(150, 100).fill('#3498db');
// Создание тени
rect.filterWith(function(add) {
add.shadow({ x: 5, y: 5, blur: 10, color: '#2c3e50' });
});
Ключевые параметры метода shadow:
x и y — смещение тени по горизонтали и
вертикали.blur — радиус размытия тени.color — цвет тени.Можно применять тень к любому элементу SVG, включая круги, эллипсы, линии и группы элементов.
const circle = draw.circle(100).fill('#e74c3c');
circle.filterWith(f => f.shadow({ x: 8, y: 8, blur: 15, color: 'rgba(0,0,0,0.5)' }));
Размытие позволяет создавать мягкие границы и эффекты свечения. В
SVG.js размытие реализуется через метод .filter() с
фильтром blur().
const ellipse = draw.ellipse(200, 100).fill('#2ecc71');
// Применение размытия
ellipse.filterWith(f => f.blur(5));
Особенности:
blur задает радиус размытия.SVG.js позволяет накладывать несколько фильтров на один объект для создания сложных эффектов.
const star = draw.polygon('50,0 61,35 98,35 68,57 79,91 50,70 21,91 32,57 2,35 39,35').fill('#f1c40f');
star.filterWith(f => {
f.shadow({ x: 4, y: 4, blur: 10, color: 'rgba(0,0,0,0.6)' });
f.blur(3);
});
В этом примере сначала добавляется тень, затем размытие всего объекта, что создает эффект объемного свечения.
Для применения эффекта к нескольким элементам одновременно, их можно
объединить в group().
const group = draw.group();
group.rect(80, 80).fill('#1abc9c').move(20, 20);
group.circle(60).fill('#e67e22').move(60, 40);
// Применяем тень ко всей группе
group.filterWith(f => f.shadow({ x: 6, y: 6, blur: 12, color: '#34495e' }));
Все элементы внутри группы будут получать один и тот же фильтр, что упрощает работу с комплексной композицией.
SVG.js поддерживает плавную анимацию фильтров через
.animate().
const animatedRect = draw.rect(100, 100).fill('#9b59b6').move(50, 50);
animatedRect.filterWith(f => f.shadow({ x: 0, y: 0, blur: 5, color: 'rgba(0,0,0,0.5)' }));
// Анимация смещения тени
animatedRect.animate(2000, '<>').during((pos, morph, eased) => {
animatedRect.filterWith(f => f.shadow({ x: 20 * eased, y: 20 * eased, blur: 10, color: 'rgba(0,0,0,0.5)' }));
}).loop();
Особенности анимации:
during() позволяет обновлять параметры фильтра на
каждом кадре.eased отвечает за плавность перехода.SVG.js позволяет создавать собственные фильтры, комбинируя несколько эффектов. Например, тень + размытие + цветовое смещение.
const customCircle = draw.circle(120).fill('#e74c3c');
customCircle.filterWith(f => {
const shadow = f.shadow({ x: 6, y: 6, blur: 8, color: 'rgba(0,0,0,0.5)' });
const blur = f.blur(2);
// Можно комбинировать через merge
f.merge([shadow, blur]);
});
Метод merge() позволяет объединить несколько фильтров в
один для оптимизации рендеринга.
Тени и размытие в SVG.js — это гибкий инструмент, который позволяет создавать графику, близкую к профессиональной визуализации, полностью векторной и легко масштабируемой.