Мы часто сталкиваемся с ситуацией: сайт выглядит отлично на обычном мониторе, но на MacBook Pro или iPhone логотипы размыты, иконки «плывут», а скриншоты продукта теряют детализацию. Причина — экраны с плотностью пикселей 2x и выше (retina). Наш опыт показывает, что системная вёрстка retina-ready графики решает эту проблему без ущерба для производительности. Команда TrueTech гарантирует чёткость на любых устройствах. Такой подход не только устраняет размытость, но и оптимизирует трафик, экономя бюджет клиента: экономия на хостинге и CDN может составлять до 50% от предыдущих расходов.
За время работы мы помогли более чем 100 проектам адаптировать графику для ретина-дисплеев, сократив жалобы клиентов на некачественное отображение до нуля. Один из проектов — интернет-магазин с каталогом из 5000 товаров. После замены всех иконок на SVG и добавления srcset к изображениям, средний LCP уменьшился на 1.2 секунды, а объём передаваемых данных сократился на 35%. Клиент сообщил о снижении отказов на 12%.
Методы подготовки графики для retina-дисплеев
Обычный растровый PNG 100×100 px на дисплее с devicePixelRatio: 2 растягивается до 200 физических пикселей. Браузер интерполирует — отсюда размытость. Решений несколько, и каждое применяется в своём контексте. Мы используем следующие техники в зависимости от типа контента:
| Метод | Когда применять | Размер файла (пример) |
|---|---|---|
srcset + sizes для <img> |
Контентные изображения | Умеренный, 2x-версия тяжелее на 30-50% |
CSS image-set() |
Фоновые изображения | Зависит от количества версий |
| SVG | Иконки, логотипы, иллюстрации | Очень маленький, 0.5-2 КБ |
<picture> + <source> |
Art direction (разные кадры) | Выше из-за множества источников |
| CSS-спрайты 2x | Устаревшие проекты с IE11 | Средний, но не рекомендуем |
Почему SVG лучше растровых иконок?
Для интерфейсных элементов SVG — единственно верный подход. Векторная графика масштабируется без потерь на любом DPI. Иконки через <use xlink:href> или компонентизация через React:
// Icon.tsx — системная иконка через SVG sprite import { FC } from 'react'; interface IconProps { name: string; size?: number; className?: string; } const Icon: FC<IconProps> = ({ name, size = 24, className }) => ( <svg width={size} height={size} className={className} aria-hidden="true"> <use href={`/sprites/icons.svg#${name}`} /> </svg> ); Сравните: средняя SVG-иконка весит 0.5–2 КБ, тогда как PNG 2x того же размера — 10–30 КБ. Экономия трафика на 30-50% — не редкость. Более того, SVG поддерживает анимацию и динамическое изменение цвета через CSS, что упрощает создание тем оформления.
Как настроить srcset для контентных изображений?
Отметим: когда SVG недоступен — фотографии, скриншоты, сложные иллюстрации — используем srcset. Пример:
<img src="hero-800.jpg" srcset="hero-800.jpg 1x, hero-1600.jpg 2x, hero-2400.jpg 3x" width="800" height="450" alt="Главный экран приложения с retina-ready графикой" loading="lazy" decoding="async" /> Для адаптивных случаев с разными кадрами применяем <picture>:
<picture> <source media="(min-width: 1024px)" srcset="hero-desktop-1x.webp 1x, hero-desktop-2x.webp 2x" type="image/webp" /> <source media="(min-width: 1024px)" srcset="hero-desktop-1x.jpg 1x, hero-desktop-2x.jpg 2x" /> <source srcset="hero-mobile-1x.webp 1x, hero-mobile-2x.webp 2x" type="image/webp" /> <img src="hero-mobile-1x.jpg" srcset="hero-mobile-1x.jpg 1x, hero-mobile-2x.jpg 2x" width="390" height="260" alt="Главный экран" /> </picture> Подробнее об атрибуте srcset читайте в MDN Web Docs.
Как подготовить фоновые изображения через CSS image-set?
.hero-banner { background-image: image-set( url('/img/banner-1x.webp') 1x, url('/img/banner-2x.webp') 2x ); background-size: cover; } /* Fallback для старых браузеров */ @supports not (background-image: image-set(url('') 1x)) { .hero-banner { background-image: url('/img/banner-2x.webp'); } } Инструментальная цепочка подготовки графики
Оптимизация изображений — неотъемлемая часть retina-адаптации. Мы используем современные форматы WebP и AVIF, а также инструменты вроде Sharp и SVGO для автоматической генерации всех версий. В production-пайплайне сборщик генерирует все размеры из одного исходника. Пример скрипта для Sharp и SVGO:
// scripts/build-assets.mjs import sharp from 'sharp'; import { optimize } from 'svgo'; import { glob } from 'glob'; import fs from 'fs/promises'; import path from 'path'; const SOURCE_IMAGES = 'src/assets/images'; const SOURCE_ICONS = 'src/assets/icons'; const OUTPUT = 'public'; // растровые изображения const imageFiles = await glob(`${SOURCE_IMAGES}/**/*.{png,jpg}`); for (const file of imageFiles) { const name = path.basename(file, path.extname(file)); const outDir = path.dirname(file).replace(SOURCE_IMAGES, `${OUTPUT}/img`); await sharp(file).resize({ width: 800 }).webp({ quality: 82 }) .toFile(`${outDir}/${name}-1x.webp`); await sharp(file).resize({ width: 1600 }).webp({ quality: 78 }) .toFile(`${outDir}/${name}-2x.webp`); } // SVG спрайт const iconFiles = await glob(`${SOURCE_ICONS}/*.svg`); let symbols = ''; for (const file of iconFiles) { const id = path.basename(file, '.svg'); const raw = await fs.readFile(file, 'utf8'); const { data } = optimize(raw, { plugins: ['preset-default', { name: 'removeViewBox', active: false }], }); const symbol = data .replace(/<svg([^>]*)>/, `<symbol id="${id}"$1>`) .replace('</svg>', '</symbol>'); symbols += symbol; } const sprite = `<svg xmlns="http://www.w3.org/2000/svg" style="display:none">${symbols}</svg>`; await fs.writeFile(`${OUTPUT}/sprites/icons.svg`, sprite); Дополнительные инструменты
- Vite-imagetools: автоматическая генерация srcset в Vite-проектах. - next/image: встроенная оптимизация в Next.js. - WebP Express: плагин для работы с WebP на сервере.Как мы решаем задачу: пошаговый процесс
- Аудит текущих изображений и иконок на сайте. Определяем, какие элементы требуют замены.
- Замена растровых иконок на SVG-спрайт. Генерируем один спрайт-файл со всеми иконками.
- Добавление srcset ко всем контентным изображениям. Для каждого изображения создаём версии 1x, 2x и опционально 3x.
- Подготовка фоновых изображений через CSS image-set(). Обрабатываем все background-image.
- Настройка pipeline автоматической генерации размеров с помощью Sharp, Vite-imagetools или аналогов.
- Тестирование на реальных устройствах: iPhone, MacBook, Galaxy.
- Документация процесса и передача исходных файлов заказчику.
Что входит в работу
После завершения вы получаете:
- SVG-спрайт со всеми иконками.
- Набор контентных изображений с srcset-версиями.
- CSS-стили с image-set() для фоновых изображений.
- Pipeline автоматической генерации размеров (конфигурация Sharp/SVGO).
- Документацию по процессу и доступы к ресурсам.
- Обучение вашей команды работе с адаптивной графикой.
- 12-месячную гарантию на все выполненные работы.
Тестирование на retina-дисплеях
Инструменты:
- Chrome DevTools → Sensors → Device pixel ratio: установите 2 или 3.
- Firefox:
about:config→layout.css.devPixelsPerPx. - Реальные устройства: iPhone 13+, MacBook Pro M1+, Samsung Galaxy S22+.
Чеклист перед сдачей:
| Элемент | Требование | Статус |
|---|---|---|
| Иконки | SVG или 2x-версия | ☐ |
| Логотип | SVG-формат | ☐ |
| Контентные изображения | srcset с 2x | ☐ |
| Фоновые изображения | image-set() | ☐ |
| Шрифты | Системные или web fonts | ☐ |
| CSS-background-image | Нет одиночных 1x без fallback | ☐ |
Сроки выполнения
Базовая retina-адаптация существующей вёрстки (замена иконок на SVG, добавление srcset): от 1 до 2 дней. Полная retina-ready вёрстка нового проекта включается в общий timeline. Стоимость рассчитывается индивидуально — оценим ваш проект бесплатно. Закажите retina-ready адаптацию и забудьте о размытой графике. Свяжитесь с нами для консультации и точного расчёта.







