Тяжёлые картинки: оптимизация без потери качества
WebP, AVIF, lazy loading, responsive images. Как сжать в 5-10 раз без видимой потери.
Симптом
- Картинки загружаются медленно, особенно на мобильных устройствах.
- Время полной загрузки страницы превышает 3 с.
- В панели «Network» DevTools виден большой размер файлов (мегабайты).
- На мобильных сетях страница «падает» из‑за медленной загрузки изображений.
- Пользователи жалуются на «плохое качество» после сжатия.
Причина
- Форматы без потерь (JPEG, PNG) сохраняют исходные данные, что приводит к большим файлам.
- Отсутствие адаптивных изображений – одна большая картинка подставляется в все места, даже если экран маленький.
- Неправильная настройка lazy loading – изображения загружаются сразу, даже если находятся ниже fold.
- Отсутствие современных форматов (WebP, AVIF) – которые дают 30‑50 % меньший размер при сохранении качества.
Как проверить
-
Проверка размеров
bash curl -I https://example.com/image.jpgВ заголовкеContent-Lengthвиден размер. -
Проверка формата
bash file image.jpgВывод покажетJPEG image dataилиPNG image data. -
Проверка поддержки WebP/AVIF
В DevTools → Network → фильтр поimage/webpиimage/avif.
Если их нет – сервер не отдаёт эти форматы. -
Проверка lazy loading
Откройте DevTools → Elements → найдите<img>без атрибутаloading="lazy". -
Проверка адаптивных изображений
В HTML ищите<img srcset="...">и<picture>.
Решение
1. Переключить на WebP/AVIF
# Установить libwebp и libavif
sudo apt-get install libwebp-dev libavif-dev
# Пример конвертации
cwebp -q 80 input.jpg -o output.webp
avifenc -q 50 input.jpg -o output.avif
Nginx – отдавать в зависимости от Accept:
location ~* \.(jpe?g|png)$ {
add_header Vary Accept;
if ($http_accept ~* "image/webp") {
rewrite ^/(.*)\.(jpe?g|png)$ /$1.webp break;
}
if ($http_accept ~* "image/avif") {
rewrite ^/(.*)\.(jpe?g|png)$ /$1.avif break;
}
try_files $uri $uri/ =404;
}
2. Использовать <picture> и srcset
<picture>
<source srcset="/images/photo.avif" type="image/avif">
<source srcset="/images/photo.webp" type="image/webp">
<img src="/images/photo.jpg" alt="Описание">
</picture>
Небольшие изображения (мобильные) можно задать через srcset:
<img src="/images/photo-400.jpg"
srcset="/images/photo-400.jpg 400w,
/images/photo-800.jpg 800w,
/images/photo-1200.jpg 1200w"
sizes="(max-width: 600px) 100vw, 50vw"
loading="lazy"
alt="Описание">
3. Включить lazy loading
<img src="..." loading="lazy" alt="...">
Для старых браузеров можно добавить полифилл:
<script src="https://cdn.jsdelivr.net/npm/lazysizes@5.3.2/lazysizes.min.js" async></script>
4. Сжать изображения без видимой потери
# Для JPEG
jpegoptim --max=80 --strip-all input.jpg -d output/
# Для PNG
pngquant --quality=65-80 input.png --output output.png
# Для WebP
cwebp -q 80 input.jpg -o output.webp
Параметр -q (0‑100) регулирует качество. Для WebP 80‑85 обычно выглядит как оригинал.
5. Автоматизировать через сборщик
Gulp пример:
const gulp = require('gulp');
const imagemin = require('gulp-imagemin');
const webp = require('gulp-webp');
gulp.task('images', () =>
gulp.src('src/images/**/*.{jpg,png}')
.pipe(imagemin([
imagemin.mozjpeg({ quality: 80, progressive: true }),
imagemin.optipng({ optimizationLevel: 5 })
]))
.pipe(gulp.dest('dist/images'))
.pipe(webp({ quality: 80 }))
.pipe(gulp.dest('dist/images'))
);
6. Проверить результат
- В Chrome DevTools → Coverage → убедитесь, что размер изображений уменьшился.
- Сравните визуально в Photoshop/Preview.
Связанные
Не хотите разбираться сами?
Запустите технический аудит сайта за 5 минут — получите PDF-отчёт с разбором всех 64 параметров и конкретными точками роста. Или закажите комплексное SEO-продвижение сайта — починим всё это и возьмём на себя дальнейшую оптимизацию.