Николай Марченко

Оптимизация графики на фронтенде
Зачем это всё?

Привет!
Frontend-developer @


Собираю монеты
...и плоты из пластиковых бутылок
Images: 1,8 Mb

Total: 3,4 Mb
≈ 53%
2017


Без сжатия
10%
≈ 92 kb
≈ 18 kb

10/10
сюжет изображения
Факторы восприятия
размер
расстояние
размер экрана
физиологические ограничения
разрешение и плотность пикселей
В чем проблема?

Google PageSpeed


Performance Audit (Chrome)


Формат
Загрузка
Оптимизации
JPEG
полноцветные изображения, фотографии

PNG
прозрачность, сжатие без потерь (мелкие детали)

SVG
простые изображения без мелких деталей, вектор
GIF
мелкие изображения (иконки), мало цветов

Не для анимаций → mpeg4, webm
хотя... https://gif.ski/

Как выбрать?

Ничего не забыл?
JPEG 2000
только сафари – 13 %
JPEG XR
только IE 9+ и Edge – 5%
WEBP
только на Blink: Chrome, Opera, UC, Samsung – 73%


Отличное сжатие: 25-34%
С потерями и без потерь
Прозрачность
Можно анимировать!


JPEG
≈ 92 kb
≈ 92 kb

JPEG

JPEG
≈ 92 kb
≈ 35 kb
WEBP

Приоритетность загрузки

Как влиять?
Lazy load
Resource Hints: Preload/prefetch
async="on"

Lazy Load

Preload/prefetch
<link rel="preload" as="image" href="logo.jpg"/>

<link rel="prefetch" as="image" href="logo.jpg"/>
Preload/prefetch


Preload – 60%
Prefetch – 73%
async

<!-- загрузка изображения не блокирует остальной рендер страницы -->
<img async=on src="logo.png" />
<!-- приоритетная загрузка -->
<img async=off src="logo.png" />
<!-- браузер сам решает -->
<img src="logo.png" />
Оптимизации

Безопасные
Выбирайте правильный формат
Автоматизируйте компрессию
Я использую ImageOptim + SVGO
Используйте адаптивные изображения
<picture>
<source srcset="small.webp 384w,
medium.webp 768w,
large.webp 1152w"
type="image/webp">
<source srcset="small.jpg 384w,
medium.jpg 768w,
large.jpg 1152w"
type="image/jpeg">
<img src="small.jpg" alt="Descriptive alt text!">
</picture>
Относительно безопасные
Квантификация: уменьшение количества цветов
Используйте JPEG:
- sRGB
- прогрессивные
- качеством <100%

Относительно безопасные

Мои эксперименты
Относительно безопасные
Упрощение кривых в SVG

Относительно безопасные
Полупрозрачный png? JPEG в SVG!
Относительно безопасные


Относительно безопасные
Загрузка 200 b превью (base64)
Относительно безопасные


Относительно безопасные
загрузка SVG фолбека
Относительно безопасные


Относительно безопасные
градиент на основе изображения


Относительно безопасные
средний цвет
Относительно безопасные

Экстримальные


5-15%
Уголки!
Экстримальные

Экстримальные


Экстримальные


Размытие
500 kb
105 kb
Экстримальные

Не используйте изображения вообще
И еще
logo.png → logo-opt.png
все декоративные картинки – в бекграунд
все значимые – на странице, img, figure или svg
автоматизируй, но проверяй
меньше — лучше
Доступность
Никогда не делайте текст картинкой
Не забывайте про alt=""
Если SVG или DIV — добавьте ему
role="img" aria-label="alt text"
Скрывайте декоративные картинки от скринридеров
aria-hidden="true"
Финал
используйте подходящий формат картинок
используйте безопасную оптимизацию
используйте экстримальную оптимизацию там где можно
не забывайте про доступность
Спасибо!

Оптимизация графики на фронтенде
By Nickolay Marchenko
Оптимизация графики на фронтенде
Оптимизация графики на фронтенде
- 358