Ми часто стикаємося з ситуацією: сайт виглядає чудово на звичайному моніторі, але на MacBook Pro або iPhone логотипи розмиті, іконки «пливуть», а скріншоти продукту втрачають деталізацію. Причина — екрани з щільністю пікселів 2x і вище (retina). Наш досвід показує, що системна верстка retina-ready графіки вирішує цю проблему без шкоди для продуктивності. Наша команда гарантує чіткість на будь-яких пристроях. Такий підхід не лише усуває розмитість, але й оптимізує трафік, економлячи бюджет клієнта: економія на хостингу та 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 адаптацію і забудьте про розмиту графіку. Зв'яжіться з нами для консультації та точного розрахунку.







