Медиа · Урок 32

Мультимедиа: canvas и SVG

Графика не обязана быть картинкой: её можно рисовать кодом. Canvas — пиксели и игры, SVG — векториконки и диаграммы, а видео встраивается без единого плагина.

Canvas: рисуем пиксели

Canvas — растровое полотно. Оно пустое; рисует его JavaScript: от простых фигур до анимаций и игр.

<canvas id="c" width="400" height="300"></canvas>

<script>
const ctx = document.getElementById("c").getContext("2d");

ctx.fillStyle = "#38bdf8";
ctx.fillRect(20, 20, 120, 80);       // прямоугольник

ctx.beginPath();
ctx.arc(240, 80, 50, 0, Math.PI * 2); // круг
ctx.fillStyle = "#818cf8";
ctx.fill();
</script>

SVG: графика, которая живет в разметке

SVG — вектор, хранится как XML, масштабируется без потери качества и стилизуется CSS. Идеал для иконок, логотипов и диаграмм.

<svg viewBox="0 0 100 100" width="120">
  <circle cx="30" cy="50" r="20" fill="var(--accent)"/>
  <rect x="55" y="30" width="30" height="40" rx="6" fill="#f472b6"/>
</svg>

ℹ️
Canvas = пиксели, перерисовываются кодом, отлично для эффектов и игр. SVG = фигуры в DOM, доступны скринридерам и CSS, лучший выбор для иконок и схем.

Анимация на canvas

Главный цикл рисует кадр за кадром. requestAnimationFrame согласует отрисовку с частотой обновления монитора (60 FPS) и экономит батарею.

let x = 0;
function step() {
  ctx.clearRect(0, 0, 400, 300);
  ctx.fillStyle = "#facc15";
  ctx.fillRect(x, 100, 40, 40);
  x += 2;
  requestAnimationFrame(step); // следующий кадр
}
requestAnimationFrame(step);
⚠️
setInterval для анимации не лучший: он не учитывает нагрузку и может «рвать» кадры. Плюс соблюдайте prefers-reduced-motion — анимации не для всех пользователей обязательны (урок 13).

Видео без плагинов

Тег <video> — почти всё. Форматы: MP4 (H.264) — максимум совместимости, WebM — полегче.

<video controls poster="preview.jpg" width="640">
  <source src="movie.mp4" type="video/mp4">
  <source src="movie.webm" type="video/webm">
  Ваш браузер не умеет показывать видео.
</video>

<!-- атрибуты: autoplay, loop, muted, playsinline (мобильные) -->
💡
Хочешь без хостинга и веса — YouTube/Vimeo через <iframe>. Но для учебного проекта научите и мой вариант: <video>, источники и запасной текст.