Добро пожаловать в захватывающий мир SVG-графики! Сегодня мы погрузимся в создание динамичных и интерактивных кругов с помощью SVG и JavaScript, которые оживят ваш веб-сайт и привлекут внимание посетителей.
SVG (Scalable Vector Graphics) – это формат векторной графики, который позволяет создавать масштабируемые и четкие изображения, независимо от размера экрана. В отличие от растровых изображений, SVG-графика основана на математических формулах, что обеспечивает ее высокую четкость при масштабировании.
В этом примере мы создадим анимацию, где круги будут появляться и исчезать, создавая эффект движения и глубины. Давайте разберемся, как это работает.
Начнем с HTML-разметки:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Живые SVG-круги</title>
<style>
body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
overflow: hidden;
background-color: #000;
transition: background-color 0.5s;
}
svg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
fill: blue;
stroke-width: 5;
stroke-dasharray: 20;
transition: fill 0.5s;
}
path {
cursor: pointer;
}
</style>
</head>
<body>
<svg></svg>
</body>
</html>
Здесь мы создаем базовую структуру с тегом <svg>
внутри <body>
. CSS-стили устанавливают фон страницы, позиционируют SVG и определяют переход цвета.
JavaScript-анимация
Теперь перейдем к JavaScript-части, которая добавляет анимацию и интерактивность:
function create(type) {
return document.createElementNS("http://www.w3.org/2000/svg", type);
}
let w, h, diag, time = 0;
const init = Date.now();
const svg = create("svg");
let count = 5;
document.body.appendChild(svg);
function createCircle(cx, cy, r) {
return `M ${cx} ${cy} m ${-r} 0 a ${r},${r} 0 1,1 ${r * 2},0 a ${r},${r} 0 1,1 ${-r * 2},0`;
}
const path = create('path');
path.setAttribute('fill-rule', 'evenodd');
svg.appendChild(path);
const radius = 100;
function draw() {
const circles = [];
for (let i = 0; i < count; i++) {
const ii = i / count + time / count * 2 / 3;
const ang = ii * Math.PI * 2;
const cos = Math.cos(ang) * 2;
const sin = Math.sin(ang) * 2;
const c = 1 / Math.tan(ang / 2);
const x = cos * radius;
const y = sin * radius;
circles.push([w / 2 + x, h / 2 + y, 30 * c]);
}
path.setAttribute("d", circles.map(c => createCircle(...c)).join(' '));
}
function loop() {
time = (Date.now() - init) / 1000;
draw();
window.requestAnimationFrame(loop);
}
function resize() {
w = window.innerWidth;
h = window.innerHeight;
diag = Math.hypot(w, h);
draw();
}
window.addEventListener('resize', resize);
resize();
loop();
В этом коде мы используем функцию create
для создания SVG-элементов, а затем создаем круги с помощью функции createCircle
. Функция draw
обновляет положение кругов, а loop
обеспечивает плавную анимацию с помощью requestAnimationFrame
.
Чтобы сделать нашу анимацию еще более интересной, добавим интерактивность:
window.addEventListener('wheel', e => {
e.preventDefault();
count = Math.max(1, count + Math.sign(e.deltaY));
draw();
});
path.addEventListener('click', e => {
e.stopPropagation();
svg.style.fill = `hsl(${Math.random() * 360}, 100%, ${Math.random() * 20 + 30}%)`;
});
document.body.addEventListener('click', e => {
e.stopPropagation();
document.body.style.backgroundColor = `hsl(${Math.random() * 360}, 100%, ${Math.random() * 20}%)`;
});
Теперь, при прокрутке колесика мыши, количество кругов будет изменяться. При клике на круги или фон, цвет SVG и фона будет случайным образом меняться, создавая уникальный визуальный эффект.
Используя SVG и JavaScript, мы создали захватывающую анимацию кругов, которая привносит динамику и интерактивность на ваш веб-сайт. Экспериментируйте с кодом, изменяйте цвета, размеры и добавляйте новые эффекты, чтобы создать уникальный дизайн. Живые SVG-круги – это отличный способ привлечь внимание пользователей и сделать ваш сайт запоминающимся!