SVG в вёрстке

Векторная графика на странице: инлайн-SVG, фигуры и path, спрайты, currentColor, градиенты, маски и анимации иконок.

Уровень: средний 12 разделов 1,5 часа

1. Зачем SVG

SVG — векторный формат: картинка описывается фигурами и линиями, а не пикселями. Она масштабируется до любого размера без потери чёткости, весит байты и может быть стилизована и анимирована прямо в HTML. Иконки, логотипы, диаграммы, иллюстрации и маски — его родная территория.

2. Как встроить SVG

Способ встраивания определяет, что вы можете с SVG делать. Иконки и анимации обычно подключают инлайн (код прямо в HTML); повторяющиеся элементы — как отдельный файл через img или фоновую картинку CSS.

СпособСтилизация/анимацияКогда
Инлайн (<svg> в HTML)да, CSS из страницыиконки, маски, интерактив
<img src="icon.svg">нет (только внутри файла)повторяющиеся статичные картинки
background: url()нет (внутри файла)фоновые иллюстрации
<object>/<iframe>да, но изолированноредкий случай, обычно не нужен
SVG через <img> не получает стили снаружи файла: цвет из CSS страницы туда не попадёт. Если нужен переключаемый цвет иконки в теме — копируйте код инлайн или используйте currentColor внутри внешнего файла.

3. Внутри: viewBox и фигуры

SVG-холст описывается атрибутом viewBox: четыре числа «x y ширина высота» задают систему координат, в которой рисуют фигуры. Меняется размер SVG — масштаб содержимого сохраняется; меняется viewBox — меняется кадр.

<svg width="200" height="100" viewBox="0 0 200 100">
  <rect x="10" y="10" width="80" height="30" fill="#2563eb"/>
  <circle cx="150" cy="40" r="25" fill="#f59e0b"/>
  <path d="M10 80 L190 60" stroke="#16a34a" stroke-width="4"/>
</svg>
ФигураПараметрыСмысл
rectx y width height rxпрямоугольник (rx — скругление)
circlecx cy rокружность
ellipsecx cy rx ryэллипс
linex1 y1 x2 y2отрезок
polygonpoints="x,y …"замкнутый многоугольник
pathd="M…"произвольная форма (главный рабочий конь)
path описывает контур командами: M — перемещение, L — линия, C — кривая Безье, A — дуга, Z — замкнуть. Готовые иконки обычно дают уже готовый path из библиотек и дизайн-макетов.

4. Градиенты и заливки

Заливка задаётся fill, обводка — stroke с шириной и формой концов. Градиент объявляют внутри defs и ссылаются на него из фигур как url(#grad).

<svg viewBox="0 0 200 80">
  <defs>
    <linearGradient id="grad" x1="0" y1="0" x2="1" y2="1">
      <stop offset="0%" stop-color="#2563eb"/>
      <stop offset="100%" stop-color="#7c3aed"/>
    </linearGradient>
  </defs>
  <rect x="10" y="10" width="150" height="50" rx="12"
        fill="url(#grad)"/>
  <circle cx="180" cy="35" r="18"
          fill="none" stroke="#2563eb" stroke-width="4"/>
</svg>

5. currentColor и «одна иконка на все темы»

Специальное значение currentColor заставляет заливку принимать текущий CSS-цвет текста. Это самый удобный способ сделать одну SVG-иконку, которая перекрашивается в тему, в состояние и в цвет кнопки без копий кода.

<!-- в HTML -->
<button class="btn-search">
  <svg class="icon" viewBox="0 0 24 24">
    <circle cx="11" cy="11" r="7" fill="none" stroke="currentColor" stroke-width="2"/>
    <path d="M16 16l5 5" stroke="currentColor" stroke-width="2"/>
  </svg>
  Найти
</button>

/* в CSS — цвет иконки следует за цветом текста */
.icon { width: 20px; height: 20px; }
.btn-search:hover { color: #2563eb; }
.btn-search:hover .icon { /* уже изменился через currentColor */ }
currentColor — главный приём библиотек иконок (Lucide, Phosphor): одна разметка, любой цвет. Пользуйтесь им по умолчанию для «моноколорных» иконок.

6. Спрайты и

Когда на странице десятки одинаковых иконок, каждый инлайн-код — дублирование. SVG-спрайт собирает все иконки в один скрытый символ <symbol>, а страница обращается к ним через <use>.

<svg style="display:none" width="0" height="0">
  <symbol id="icon-heart" viewBox="0 0 24 24">
    <path d="M12 21s-8-4.8-8-11a4 4 0 0 1 7-2.8A4 4 0 0 1 18 10c0 5.2-6 11-6 11z"/>
  </symbol>
</svg>

<!-- использовать можно бесконечно -->
<svg class="icon"><use href="#icon-heart"/></svg>
<svg class="icon icon--active"><use href="#icon-heart"/></svg>

7. Адаптивность и aspect-ratio

SVG, у которого задан только viewBox, по умолчанию растёт на всю доступную ширину. Управляет поведением preserveAspectRatio: большинство случаев покрывается значениями xMidYMid meet (вписать) и slice (обрезать, как cover в CSS).

<svg viewBox="0 0 400 200" preserveAspectRatio="xMidYMid meet">
  <!-- meet: вписать целиком, по остатку — отступы -->
</svg>

<svg viewBox="0 0 400 200" preserveAspectRatio="xMidYMid slice">
  <!-- slice: заполнить область, обрезав по краю -->
</svg>

8. Маски и clip-path

Обрезка по форме и прозрачные маски — две близкие, но разные вещи. clip-path физически отрезает, mask показывает сквозь SVG-градиент. В CSS clip-path работает и для любых блоков, не только SVG.

<img src="photo.jpg" alt="Фото"
     style="clip-path: url(#avatar)">

<svg width="0" height="0">
  <defs>
    <clipPath id="avatar">
      <circle cx="50" cy="50" r="50"/>
    </clipPath>
  </defs>
</svg>

/* и без SVG: clip-path на простых фигурах */
.avatar-thumb {
  clip-path: circle(50% at 50% 50%);
}

9. Текст в SVG

Текст внутри SVG — вектор, его можно искривлять по пути, растягивать и разворачивать. Но базовая типографика страницы делается HTML-текстом: SVG-текст не индексируется так же, хуже редактируется и не переносится по словам.

<svg viewBox="0 0 200 60">
  <rect x="5" y="5" width="190" height="50" rx="10" fill="#fef3c7"/>
  <text x="100" y="35" text-anchor="middle" font-size="16">Лендинг готов</text>
</svg>
Не верстайте абзацы страницы в SVG: правки текста, SEO и адаптивный перенос превратятся в боль. SVG-текст уместен для бейджей, «водяных знаков» и декоративных надписей.

10. Стилизация и интерактив

Инлайн-SVG наследует все возможности CSS: псевдоклассы hover, transition, transform и даже @keyframes для анимации. Части иконки — это просто элементы со стилями.

<svg class="bell" viewBox="0 0 24 24">
  <path d="M6 8a6 6 0 0 1 12 0c0 4 1.5 5 1.5 5H4.5S6 12 6 8z" fill="currentColor"/>
  <path class="bell-cap" d="M4 16.5h16" stroke="currentColor" stroke-width="2"/>
</svg>

.bell { width: 24px; height: 24px; color: #374151; }
.bell:hover { color: #2563eb; }
.bell:hover .bell-cap { transform: rotate(-12deg); transform-origin: 50% 16px; }

11. Оптимизация SVG

Редакторы и генераторы оставляют в SVG мусор: комментарии, лишние атрибуты, неверные координаты, раздутые префиксы. Библиотеки (svgo, интернет-оптимизаторы) сжимают файл до минимума без потери вида.

# svgo — сжатие при сборке
npx svgo icon.svg
# исходник: 1200 байт  →  сжатый: 180 байт

# ключевое, что принесёт пользу руками:
# единый viewBox и fill/color на верхнем уровне, а не внутри каждой фигуры

12. Чек-лист SVG на странице

Короткий контроль перед публикацией векторного декора.

Начните паттерн «иконка-спрайт + currentColor» — он закрывает 90% задач пользовательского интерфейса: темы, hover, размеры и вес.

Что дальше

Курс завершён.

← Вернуться к курсам