Иконки

Большинство изображений являются частью вашего контента, но иконки — частью вашего пользовательского интерфейса. Они должны масштабироваться и адаптироваться так же, как и текст в вашем пользовательском интерфейсе.

Масштабируемая векторная графика

Что касается фотографических изображений, существует множество вариантов форматов: JPG, WebP и AVIF. Для нефотографических изображений можно выбрать формат Portable Network Graphics (PNG) или Scalable Vector Graphics (SVG).

И PNG, и SVG хорошо подходят для работы с однотонными областями, и оба формата позволяют создавать изображения с прозрачным фоном. При использовании PNG вам, вероятно, потребуется создать несколько версий изображения разных размеров и использовать атрибут srcset для элемента img , чтобы сделать изображение адаптивным . При использовании SVG изображение адаптивно по умолчанию.

PNG (а также JPG, WebP и AVIF) — это растровые изображения. Растровые изображения хранят информацию в пикселях. В SVG информация хранится в виде инструкций для рисования. Когда браузер считывает файл SVG, инструкции преобразуются в пиксели. И самое главное, эти инструкции являются относительными. Независимо от размеров, используемых для описания линий и фигур, всё отображается с нужной чёткостью. Вместо создания нескольких SVG-файлов разных размеров вы можете создать один SVG-файл, который будет работать со всеми размерами. Нет необходимости использовать атрибут srcset .

<img src="image.svg" alt="A description of the image." width="25" height="25">
<img src="image.svg" alt="A description of the image." width="250" height="250">

XML используется для записи инструкций в SVG-файл. Это язык разметки, похожий на HTML.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="-21 -21 42 42" width="100" height="100">
  <title>Smiling face</title>
  <circle r="20" fill="yellow" stroke="black"/>
  <ellipse rx="2.5" ry="4" cx="-6" cy="-7" fill="black"/>
  <ellipse rx="2.5" ry="4" cx="6" cy="-7" fill="black"/>
  <path stroke="black" d="M -12,5 A 13.5,13.5,0 0,0 12,5 A 13,13,0 0,1 -12,5"/>
</svg>

Желтый смайлик, который увеличивается в размерах без пикселизации.

Вы даже можете вставлять SVG-файлы в HTML.

<figure>
  <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="-21 -21 42 42" width="100" height="100">
    <title>Smiling face</title>
    <circle r="20" fill="yellow" stroke="black"/>
    <ellipse rx="2.5" ry="4" cx="-6" cy="-7" fill="black"/>
    <ellipse rx="2.5" ry="4" cx="6" cy="-7" fill="black"/>
    <path stroke="black" d="M -12,5 A 13.5,13.5,0 0,0 12,5 A 13,13,0 0,1 -12,5"/>
  </svg>
  <figcaption>
  A description of the image.
  </figcaption>
</figure>

Если вы встроите SVG-файл таким образом, это на один запрос меньше для браузера. Не будет ожидания загрузки изображения, потому что оно поступает вместе с HTML-кодом… прямо в HTML! Кроме того, как вы скоро узнаете, встраивание SVG-файлов таким образом дает вам больше контроля над их оформлением.

Иконки и текст

Изображения иконок часто представляют собой простые фигуры на прозрачном фоне. Формат SVG идеально подходит для иконок.

Если у вас есть кнопка или ссылка с текстом и иконкой внутри, то иконка является презентационной. Важен сам текст. При использовании элемента img пустой атрибут alt указывает на то, что изображение является презентационным.

<button>
<img src="hamburger.svg" alt="" width="16" height="16">
Menu
</button>

Поскольку CSS предназначен для оформления, вы можете использовать иконку в качестве фонового изображения в своих CSS-кодах.

<button class="menu">
Menu
</button>
.menu {
  background-image: url(hamburger.svg);
  background-position: 0.5em;
  background-repeat: no-repeat;
  background-size: 1em;
  padding-inline-start: 2em;
}

Если вы разместили SVG-изображение внутри HTML-кода, используйте атрибут aria-hidden , чтобы скрыть его от вспомогательных технологий.

<button class="menu">
  <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 80" width="16" height="16">
    <rect width="100" height="20" />
    <rect y="30" width="100" height="20"/>
    <rect y="60" width="100" height="20"/>
  </svg>
  Menu
</button>

Автономные значки

Используйте текст внутри кнопок и ссылок, если хотите, чтобы их назначение было понятным. Вы можете использовать иконку без текста, но не предполагайте, что все понимают значение той или иной иконки. В случае сомнений, протестируйте с реальными пользователями.

Если вы решите использовать иконку без сопровождающего текста, она перестанет быть презентабельной. Фоновое изображение в CSS — неподходящий способ отображения иконки. Иконке необходимо присвоить доступное имя в HTML.

Если используется элемент img , имя значка, доступное для его отображения, определяется атрибутом alt .

<button>
<img src="hamburger.svg" alt="Menu" width="16" height="16">
</button>

Другой вариант — указать доступное имя непосредственно в ссылке или кнопке и обозначить изображение как презентационное. Для указания доступного имени используйте атрибут aria-label .

<button aria-label="Menu">
<img src="hamburger.svg" alt="" width="16" height="16">
</button>

Если вы вставляете SVG-файл в HTML-код, используйте атрибут aria-label для ссылки или кнопки, чтобы присвоить им доступное имя, и атрибут aria-hidden для значка.

<button aria-label="Menu">
  <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 80" width="16" height="16">
    <rect width="100" height="20" />
    <rect y="30" width="100" height="20"/>
    <rect y="60" width="100" height="20"/>
  </svg>
</button>

Иконки стиля

Если вы встраиваете SVG-иконки непосредственно в HTML-код, вы можете стилизовать их отдельные части так же, как и любой другой элемент на странице. Это невозможно сделать, если вы используете элемент img для отображения иконок.

В следующем примере элементы rect внутри SVG имеют значение fill blue , соответствующее стилю текста кнопки.

button {
 color: blue;
}
button rect {
  fill: blue;
}

Вы также можете применять стили hover и focus .

button:hover,
button:focus {
  color: red;
}
button:hover rect,
button:focus rect {
  fill: red;
}

Ресурсы

Иконки — важная часть фирменного стиля вашего сайта. Далее вы узнаете, как сделать другие элементы вашего фирменного стиля адаптивными с помощью тем оформления .

Проверьте свое понимание

Проверьте свои знания иконок.

SVG позволяет обрабатывать любую плотность пикселей с помощью одного файла или блока кода <svg> .

Истинный
SVG включает в себя инструкции по рисованию фигур и линий с любой плотностью пикселей, масштабом или увеличением.
ЛОЖЬ
В отличие от .png или .jpg , для SVG не требуется атрибут srcset или элемент <picture> .

Какие преимущества имеет SVG-код, встроенный непосредственно в HTML?

Настраивается через CSS
Подбирайте формы SVG-иконок в соответствии с кнопками и фирменными цветами.
Загрузка не требуется.
Все инструкции на месте.
Загрузка по умолчанию осуществляется отложенным способом.
Не нужно ничего скачивать, чтобы не лениться.
Меньше нагрузки на процессор.
Я это выдумал.
Светлая или темная тема оформления без добавления новых элементов.
Медиа-запросы могут изменять встроенные стили SVG!