Хотите добавить интерактивные элементы на сайт? Начните с canvas – он позволяет манипулировать каждым пикселем. Задаете координаты, применяете фильтры – и обычный квадрат превращается в динамичную анимацию. Попробуйте изменить прозрачность или добавить градиент: результат виден сразу.
Для четких контуров и масштабирования без потерь подойдет SVG. В отличие от растровых изображений, здесь все строится на математических формулах. Рисуете кривые Безье, задаете параметры заливки – и получаете идеально гладкие линии при любом размере. Хитрость: используйте группы элементов для сложных сцен.
Рендеринг на canvas требует оптимизации. Слишком много операций с пикселями? Вешайте обработку на WebGL. Нужна плавная анимация? Задействуйте requestAnimationFrame вместо setInterval. Проверено: такой подход снижает нагрузку на процессор в 2-3 раза.
Создание и управление визуальными элементами с помощью SVG и Canvas
Хотите добавить интерактивную диаграмму или плавную анимацию на страницу? Вот как это сделать без лишней сложности:
1. Рисуем с точностью: координаты и трансформации
- SVG – идеален для чётких контуров. Задавайте точки через атрибуты
x
,y
илиpath
. - Canvas требует ручного расчёта позиций. Используйте
moveTo()
иlineTo()
, чтобы избежать «дрожания» линий. - Поворот, масштаб и смещение делаются через
transform
в SVG илиsetTransform()
в Canvas. Пример: поворот фигуры на 45° вокруг центра.
2. Фильтры и эффекты: от тени до размытия
Добавьте глубины элементам:
- В SVG применяйте
<filter>
с эффектами типаfeGaussianBlur
илиfeDropShadow
. - В Canvas используйте
shadowBlur
и комбинируйте с глобальным составлением (globalCompositeOperation
).
Попробуйте такой код для SVG-фильтра, имитирующего свечение:
<filter id="glow">
<feGaussianBlur stdDeviation="5" result="blur"/>
<feComposite in="SourceGraphic" in2="blur" operator="over"/>
</filter>
3. Анимация: оживляем объекты
- Для плавного перемещения в SVG подойдёт
<animateTransform>
. Например, движение по кругу с изменением прозрачности. - В Canvas рисуйте кадры через
requestAnimationFrame
, обновляя позиции в цикле.
Важно: для сложных сцен рендеринг в Canvas оптимизируйте – очищайте область (clearRect
) и минимизируйте перерисовку.
Теперь вы знаете, как превратить статичные элементы в динамичные. Какие эффекты попробуете первыми?
Рисование на Canvas: базовые фигуры и заливка
Чтобы нарисовать прямоугольник на холсте, вызовите fillRect(x, y, width, height)
– координаты (x, y) задают верхний левый угол, а не центр. Для прозрачной обводки используйте strokeRect()
с предварительно заданным lineWidth
.
Окружность строится через arc(centerX, centerY, radius, startAngle, endAngle)
. Углы в радианах: полный круг – 0
и Math.PI * 2
. Не забудьте beginPath()
, иначе рендеринг «сольёт» фигуры в одну линию.
Заливка градиентом: создайте объект LinearGradient
, добавьте цвета через addColorStop(позиция, цвет)
(0 – начало, 1 – конец), затем примените как fillStyle
. Для радиального варианта – createRadialGradient()
.
Трансформации вроде масштабирования или поворота работают через translate()
, rotate()
, scale()
. Важно: они влияют на все последующие операции. Сбросить матрицу преобразований поможет setTransform(1, 0, 0, 1, 0, 0)
.
Пиксели можно обрабатывать напрямую через getImageData()
– массив данных RGBA позволит менять цвета программно. Но учтите: такой подход медленнее, чем отрисовка примитивов.
Создание SVG-элементов динамически через JavaScript
Добавьте SVG-контейнер в DOM перед рендерингом элементов:
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svg.setAttribute("width", "500");
svg.setAttribute("height", "300");
document.body.appendChild(svg);
Генерация фигур с точными координатами
Для рисования прямоугольника с фильтром тени:
const rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
rect.setAttribute("x", "50");
rect.setAttribute("y", "20");
rect.setAttribute("width", "150");
rect.setAttribute("height", "100");
rect.setAttribute("filter", "url(#dropShadow)");
svg.appendChild(rect);
Анимация и трансформации
Заставьте круг двигаться по траектории:
const circle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
circle.setAttribute("cx", "100");
circle.setAttribute("cy", "100");
circle.setAttribute("r", "30");
circle.innerHTML = `
<animateMotion
path="M0,0 L100,100 Z"
dur="3s"
repeatCount="indefinite"/>
`;
svg.appendChild(circle);
Конвертируйте пиксели в проценты для адаптивности:
path.setAttribute("d", "M10%,20% L80%,75%");
Анимация векторных объектов с помощью requestAnimationFrame
Чтобы плавно перемещать элементы SVG, обновляйте их координаты внутри requestAnimationFrame
. Например:
let x = 0;
function animate() {
x += 1;
element.setAttribute('transform', `translate(${x}, 0)`);
requestAnimationFrame(animate);
}
animate();
Оптимизация рендеринга
Фильтры и сложные трансформации снижают производительность. Для динамичных сцен:
- Кэшируйте статичные части в группах (
<g>
) - Заменяйте тени на заранее отрисованные пиксели
- Используйте
will-change: transform
для элементов с частыми изменениями
Рисование с точностью
При анимации кривых Безье контролируйте шаг изменения контрольных точек. Для равномерного движения:
const step = 0.01;
let t = 0;
function drawCurve() {
const point = getQuadraticBezierPoint(t, p0, p1, p2);
dot.setAttribute('cx', point.x);
dot.setAttribute('cy', point.y);
t = (t + step) % 1;
requestAnimationFrame(drawCurve);
}
Фильтры и эффекты для растровой графики в браузере
Используйте CSS-фильтры для быстрого добавления эффектов к изображениям. Например, filter: blur(5px)
размывает пиксели, а filter: contrast(200%)
усиливает резкость. Это работает без сложного кода – просто добавьте свойство в стили.
Хотите больше контроля? Подключите SVG-фильтры через тег <filter>
. Они позволяют манипулировать цветами, смешивать слои и даже создавать эффекты типа «воды» или «металла». Вот пример:
<svg>
<filter id="shadow">
<feGaussianBlur stdDeviation="3"/>
</filter>
</svg>>
Примените его к элементу через filter: url(#shadow)
. Так можно управлять каждым этапом рендеринга – от смешения пикселей до наложения градиентов.
Анимация фильтров оживит статичные элементы. Комбинируйте CSS-переходы с изменением параметров:
img:hover {
filter: hue-rotate(90deg);
transition: filter 0.3s;
}
Координаты помогают точечно менять эффекты. Например, в SVG-фильтрах используйте <fePointLight>
для создания объемного свечения вокруг указанных точек.
Нужны сложные трансформации? Рисование через Canvas даст полный доступ к пикселям. Разбирайте изображение в массив данных, меняйте значения RGB – и возвращайте обратно. Так делают кастомные шейдеры или имитацию старых пленок.
Оптимизация производительности при работе с тяжелой графикой
Сокращайте количество сложных SVG-фильтров
Разгружайте Canvas: рисуйте умнее
При отрисовке на Canvas избегайте частых очисток всего полотна. Вместо clearRect()
стирайте только измененные области. Для статичных элементов – рисуйте их один раз в буферный Canvas, затем копируйте на основной. Это сократит количество операций с пикселями.
Пример: анимация 500 частиц без оптимизации вызывает лаги. Решение – группировать их в один Path2D и обновлять координаты через трансформации матрицы, а не перерисовывать каждую.
Для сложных сцен с трансформациями (масштабирование, повороты) откажитесь от CSS-анимаций в пользу WebGL. Three.js или PixiJS справятся с рендерингом быстрее, чем встроенные механизмы браузеров.
Хочешь купить статьи дешево для сайта и блога? Перейти в магазин статей