Изображения
Элемент
<img>вставляет изображение в документ. Атрибутыsrcset,sizesи элемент<picture>обеспечивают адаптивность.
Зачем нужно
Изображения -- важная часть контента. Правильное использование <img> влияет на скорость загрузки (Core Web Vitals), SEO (alt-текст), доступность (screen readers) и адаптивность (мобильные устройства).
Где используется
- Контентные изображения (фото, иллюстрации, диаграммы)
- Аватары и логотипы
- Товарные карточки
- Галереи
Предпосылки
Базовый <img>
<img src="photo.jpg" alt="Закат над морем" width="800" height="600">
Обязательные атрибуты
| Атрибут | Назначение |
|---|---|
src |
Путь к изображению (обязателен) |
alt |
Альтернативный текст (обязателен для a11y) |
Рекомендуемые атрибуты
| Атрибут | Назначение |
|---|---|
width |
Ширина в px (предотвращает CLS) |
height |
Высота в px (предотвращает CLS) |
loading |
"lazy" / "eager" -- отложенная загрузка |
decoding |
"async" / "sync" / "auto" -- декодирование |
fetchpriority |
"high" / "low" / "auto" -- приоритет загрузки |
Атрибут alt -- правила
<!-- Контентное изображение: описывай ЧТО на картинке -->
<img src="chart.png" alt="График роста продаж: с 10 до 50 млн за 2025 год">
<!-- Ссылка-изображение: описывай КУДА ведёт -->
<a href="/profile">
<img src="avatar.jpg" alt="Профиль Ивана Петрова">
</a>
<!-- Декоративное изображение: пустой alt -->
<img src="decorative-line.svg" alt="">
<!-- Изображение с текстом: воспроизведи текст -->
<img src="banner.jpg" alt="Скидка 50% на все товары до конца апреля">
<!-- Иконка рядом с текстом: пустой alt (текст уже есть) -->
<button>
<img src="icon-save.svg" alt=""> Сохранить
</button>
Правила alt-текста:
- Не начинай с "Изображение..." или "Картинка..." -- screen reader и так объявит "image"
- Описывай содержание, а не файл ("Котёнок спит на подушке", а не "photo123.jpg")
- Для декоративных -- пустой
alt=""(не пропускай атрибут!) - Длина: до 125 символов (рекомендация)
width и height -- борьба с CLS
CLS (Cumulative Layout Shift) -- метрика сдвига контента при загрузке. Без width/height браузер не знает размеры картинки до загрузки, и контент "прыгает".
<!-- ПЛОХО: нет размеров -- CLS -->
<img src="photo.jpg" alt="Фото">
<!-- ХОРОШО: браузер резервирует место -->
<img src="photo.jpg" alt="Фото" width="800" height="600">
/* Чтобы картинка была адаптивной, но сохраняла пропорции */
img {
max-width: 100%;
height: auto;
}
Браузер использует width и height для расчёта aspect ratio ещё до загрузки изображения.
srcset и sizes -- адаптивные изображения
Разные размеры для разных экранов
<img
src="photo-800.jpg"
srcset="
photo-400.jpg 400w,
photo-800.jpg 800w,
photo-1200.jpg 1200w,
photo-1600.jpg 1600w
"
sizes="
(max-width: 600px) 100vw,
(max-width: 1200px) 50vw,
33vw
"
alt="Пейзаж"
width="800"
height="600"
>
srcset-- список изображений с их реальной шириной (w-дескриптор)sizes-- какую ширину изображение займёт при каждом размере viewport- Браузер сам выбирает оптимальное изображение с учётом DPR
Для Retina (DPR)
<img
src="logo.png"
srcset="
logo.png 1x,
logo@2x.png 2x,
logo@3x.png 3x
"
alt="Логотип"
width="200"
height="50"
>
<figure> и <figcaption>
Группирует изображение с подписью:
<figure>
<img src="diagram.png" alt="Схема HTTP-запроса: клиент отправляет запрос серверу" width="600" height="400">
<figcaption>Рис. 1: Схема HTTP-запроса от клиента к серверу</figcaption>
</figure>
<figure> может содержать не только изображения, но и код, таблицы, цитаты -- всё, что является иллюстрацией.
Lazy loading -- отложенная загрузка
<!-- Изображения ниже viewport загрузятся когда пользователь проскроллит -->
<img src="photo.jpg" alt="Фото" width="800" height="600" loading="lazy">
<!-- Главное изображение (LCP) -- загрузить сразу -->
<img src="hero.jpg" alt="Баннер" width="1200" height="600"
loading="eager" fetchpriority="high">
Правило: loading="lazy" только для изображений ниже viewport (below the fold). Для hero-баннера и LCP-изображений используй loading="eager" + fetchpriority="high".
Подробнее -- в loading lazy.
Форматы изображений
| Формат | Для чего | Поддержка |
|---|---|---|
| JPEG | Фотографии | Везде |
| PNG | Прозрачность, скриншоты | Везде |
| WebP | Фото + прозрачность, ~30% меньше JPEG | 97%+ |
| AVIF | Лучшее сжатие, ~50% меньше JPEG | 92%+ |
| SVG | Иконки, логотипы, схемы (векторный) | Везде |
| GIF | Простые анимации | Везде (лучше видео) |
Fallback через <picture>
<picture>
<source srcset="photo.avif" type="image/avif">
<source srcset="photo.webp" type="image/webp">
<img src="photo.jpg" alt="Фото" width="800" height="600">
</picture>
Подробнее -- в picture и srcset.
Частые ошибки
| Ошибка | Почему плохо | Как правильно |
|---|---|---|
Нет alt |
Screen reader пропустит или прочитает имя файла | Всегда добавляй alt |
alt = имя файла |
"IMG_20260406.jpg" бесполезен | Описание содержимого |
Нет width/height |
CLS -- контент прыгает | Указывай реальные размеры |
loading="lazy" на hero |
LCP (Largest Contentful Paint) замедлится | loading="eager" для первого экрана |
| Огромные JPEG без оптимизации | Медленная загрузка | Сжимай и используй WebP/AVIF |
Декоративная картинка без alt="" |
Screen reader читает src | alt="" для декоративных |
Практика
- Вставь изображение с правильным
alt,width,height - Добавь
srcsetс 3 размерами иsizes-- проверь в DevTools Network, какой файл загружается при разных размерах окна - Создай
<figure>с<figcaption> - Добавь
loading="lazy"к изображениям ниже первого экрана - Используй
<picture>с AVIF → WebP → JPEG fallback
Связанные темы
- picture и srcset -- подробно об адаптивных изображениях
- loading lazy -- отложенная загрузка
- Семантика для screen readers -- alt-текст и доступность