Як створити крос-браузерний сайт: поради та інструменти
Вступ: чому браузери досі "не домовились між собою"
Здавалося б, 2024 рік. Веб-стандарти існують десятиліттями. W3C публікує специфікації, браузери мають їх дотримуватись. Чому ж тоді сайт, що виглядає ідеально в Chrome, може "розвалитись" у Safari або показувати артефакти в Firefox?
Відповідь — у природі веб-розробки. Кожен браузер — це окремий продукт зі своїм рушієм рендерингу, своєю командою розробників і своїм темпом впровадження нових стандартів. Chrome використовує Blink, Firefox — Gecko, Safari — WebKit. Навіть Microsoft Edge, який нині базується на Chromium (тобто теоретично той самий рушій, що і Chrome), час від часу поводиться інакше.
Додайте до цього мобільні браузери (Safari на iOS, Samsung Internet, вбудовані WebView), корпоративні середовища де й досі трапляються старі версії IE або Edge Legacy, і картина стає ще строкатішою.
За даними Statcounter, на квітень 2026 року розподіл браузерів виглядає приблизно так: Chrome — близько 65%, Safari — 19%, Edge — 5%, Firefox — 3%, інші — 8%. Але це глобальна статистика. Для вашого конкретного сайту вона може відрізнятись — тому перший крок до крос-браузерної розробки завжди починається з аналізу вашої аудиторії.
У цій статті — системний підхід до крос-браузерної сумісності: від розуміння проблеми до конкретних інструментів тестування та технічних рішень, які забезпечують однакову роботу сайту в усіх середовищах.
Частина 1: Розуміння проблеми — чому сайти ламаються в різних браузерах
Різні рушії рендерингу
Рушій рендерингу — це серце браузера, відповідальне за перетворення HTML, CSS і JavaScript на те, що бачить користувач на екрані.
Blink (Chrome, Edge, Opera, Samsung Internet, більшість Android-браузерів) — найпоширеніший рушій. Розробляється Google. Відносно швидко впроваджує нові CSS та Web API.
WebKit (Safari на macOS та iOS, всі браузери на iOS) — і це ключовий момент: Apple вимагає, щоб всі браузери на iOS використовували WebKit. Тобто Chrome на iPhone — це насправді WebKit із Chrome-інтерфейсом. Firefox на iPad — WebKit під капотом. Це означає, що тестування "в Chrome на мобільному" не замінює тестування в реальному Safari на iOS.
Gecko (Firefox) — розробляється Mozilla. Відомий суворішим дотриманням стандартів і певними специфічними поведінками у CSS.
Різні темпи підтримки функцій
Нові CSS-властивості та JavaScript API спочатку з'являються в одних браузерах, і лише згодом — в інших. Наприклад:
- CSS Container Queries з'явились у Chrome 105 (серпень 2022), Safari 16 (вересень 2022), Firefox 110 (лютий 2023).
-
CSS
subgrid— Safari реалізував раніше за Chrome. -
scroll-behavior: smooth— довго не підтримувався Safari без поліфілу. - WebP-зображення — Safari підтримує лише з версії 14 (2020).
Тобто між виходом специфікації та повноцінною підтримкою у всіх браузерах може минути від кількох місяців до кількох років.
Різна обробка помилок і граничних випадків
Браузери по-різному реагують на "неправильний" або неоднозначний код. Chrome може "виправити" помилку і відобразити так, як ви задумали. Firefox може відобразити інакше. Safari — зовсім по-третьому. Це особливо стосується:
- Margin collapsing у CSS (коли і як відступи "зливаються");
- Flexbox і Grid при граничних значеннях;
- Відображення шрифтів і підрядкові метрики;
- Обробка дат і часових зон у JavaScript;
- Поведінка форм і типів інпутів.
Мобільні vs Десктопні браузери
Мобільні браузери мають додаткові специфіки:
-
iOS Safari — власна адресна панель, яка "ховається" при скролі, впливає на реальну висоту viewport. Відома проблема з
100vh— він не відповідає видимій висоті екрана. - Масштабування — деякі мобільні браузери автоматично масштабують контент або текст.
-
Touch-події — різна поведінка
touchstart,touchmove,click(затримка 300 мс у старих браузерах). - Keyboard — поява екранної клавіатури змінює розміри viewport, що може "ламати" fixed-елементи.
Частина 2: Стратегія крос-браузерної розробки
Визначте цільові браузери
Перше і найважливіше: не намагайтесь підтримувати всі браузери однаково. Це неможливо, непрактично і дорого. Натомість — визначте конкретний список браузерів на основі даних.
Де взяти дані:
Google Analytics (або будь-яка інша аналітика) показує, якими браузерами і пристроями користуються відвідувачі вашого сайту. Це має бути основним джерелом рішень.
Якщо сайт новий і даних ще немає — орієнтуйтесь на галузеву статистику для вашої географії та аудиторії. Для України та країн СНД частка мобільного Safari (iOS) традиційно висока через популярність iPhone серед платоспроможної аудиторії.
Практичний підхід: три рівні підтримки
Рівень A (повна підтримка): сайт виглядає і працює ідеально. Всі функції доступні. Регулярне тестування.
Рівень B (функціональна підтримка): сайт виглядає прийнятно, всі ключові функції працюють, але дрібні візуальні відмінності допустимі. Тестування перед релізом.
Рівень C (базова підтримка): контент доступний і читаємий, основні дії можливі, але візуальна відповідність не гарантується. Тестування по запиту.
Progressive Enhancement vs Graceful Degradation
Два підходи до роботи з браузерною сумісністю, які часто плутають.
Progressive Enhancement (прогресивне покращення) — починаєте з базової версії, що працює скрізь, і додаєте покращення для більш сучасних браузерів. Основа — семантичний HTML, базовий CSS. Поверх — покращення для браузерів, що підтримують нові функції.
Приклад: базова навігація — прості посилання, що працюють без JavaScript. Покращення — анімована мобільна навігація для браузерів із підтримкою CSS animations і JS.
Graceful Degradation (граціозна деградація) — починаєте з повнофункціональної "ідеальної" версії і забезпечуєте, щоб у старих браузерах все одно щось показувалось. Тобто — від кращого до гіршого.
Що краще? Для більшості сучасних проектів — Progressive Enhancement. Він природно призводить до більш стійкого коду: якщо щось не підтримується, сайт просто не показує цю функцію, а не "ламається". Але на практиці в сучасних командах часто поєднують обидва підходи залежно від конкретного компонента.
Feature Detection замість Browser Detection
Стара шкільна практика: перевіряти, який браузер відкрив сторінку (if (navigator.userAgent.includes('Safari'))), і на цій основі застосовувати різний код. Це — погана практика.
Причини:
- User-agent рядки легко підробляються;
- Нові версії браузерів можуть підтримувати функцію, яку ви "заблокували" для цього браузера;
- Код стає крихким і важко підтримуваним.
Правильний підхід: Feature Detection — перевіряти не браузер, а наявність конкретної функції.
CSS Feature Detection через @supports:
/* Базовий варіант для всіх */
.container {
display: flex;
}
/* Покращений варіант для браузерів із підтримкою Grid */
@supports (display: grid) {
.container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
}
}
JavaScript Feature Detection:
// Перевірка підтримки Intersection Observer
if ('IntersectionObserver' in window) {
// Використовуємо сучасний API
const observer = new IntersectionObserver(callback);
} else {
// Fallback — простіша реалізація без lazy loading
loadAllImages();
}
Modernizr — бібліотека, що автоматично перевіряє підтримку десятків функцій і додає відповідні класи до
. Хоча в 2024–2025 роках потреба в ній зменшилась (браузери стали сучасніші), для проектів із широкою підтримкою старих браузерів вона ще актуальна.
Частина 3: CSS — найпоширеніше джерело крос-браузерних проблем
CSS Reset та Normalize
Різні браузери мають різні стилі за замовчуванням (user agent styles).
в Chrome і Safari може мати різний margin.
Placeholder: колір placeholder-тексту стилізується через нестандартні псевдоелементи:
::placeholder {
color: #9e9e9e;
opacity: 1; /* Firefox додає opacity: 0.54 за замовчуванням */
}
Focus Styles — доступність та крос-браузерністьoutline: none — класична помилка, яка псує як доступність, так і крос-браузерну поведінку. Замість видалення outline — стилізуйте його:
/* Сучасний підхід із focus-visible */
:focus {
outline: none; /* Прибираємо для mouse-кліків */
}
:focus-visible {
outline: 3px solid #6200ea;
outline-offset: 2px;
}
:focus-visible показує стиль фокусу тільки при навігації клавіатурою, але не при кліку мишею. Підтримується всіма сучасними браузерами.
Частина 7: Медіа та зображення між браузерами
елемент для крос-браузерних зображень
Браузер бере перший , який він підтримує. Цей підхід забезпечує оптимальний формат для кожного браузера без JavaScript.
SVG: крос-браузерні особливостіSVG загалом добре підтримується, але є нюанси: та external references: посилання на зовнішній SVG-файл через має проблеми в Edge Legacy та Safari старших версій. Альтернатива — inline SVG або SVG sprite вбудований у HTML.viewBox та preserveAspectRatio: деякі браузери по-різному трактують preserveAspectRatio, що може призводити до різного масштабування SVG.Фільтри та ефекти: filter: drop-shadow() на SVG-елементах може рендеритись по-різному.
Відео та медіа
Частина 8: Інструменти тестування та налагодження
Локальне тестуванняBrowserStack — хмарна платформа для тестування на реальних пристроях і браузерах. Понад 3000 комбінацій браузер/ОС/пристрій. Є live-тестування (підключення до реального пристрою) і автоматизоване (Selenium/Cypress тести). Платна, але є безкоштовний trial.Sauce Labs — аналог BrowserStack, популярний для CI/CD інтеграції.LambdaTest — дещо дешевша альтернатива з хорошим набором браузерів.VirtualBox або Parallels з Windows VM — для тестування Edge і Chrome на Windows. Microsoft безкоштовно надає образи Windows VM для розробників.Xcode Simulator — якщо у вас Mac, Xcode включає симулятор iOS/iPadOS з Safari. Не замінює тестування на реальному пристрої, але добре для швидких перевірок.
Chrome DevTools для налагодженняDevice Mode — симуляція різних розмірів екранів і дотикових пристроїв. Не замінює реальне тестування, але корисний для швидкого виявлення layout-проблем.Coverage Tab — показує, який відсоток вашого CSS і JS справді використовується. Незамінний для виявлення зайвого коду.Rendering Tab — дозволяє симулювати різні умови рендерингу:
Emulate CSS media features (prefers-color-scheme, prefers-reduced-motion);Показувати layout shift regions;Показувати paint flashing.Accessibility Tree — перевірка доступності, яка часто корелює з крос-браузерними проблемами.
Firefox Developer ToolsFirefox має деякі унікальні DevTools-функції:Grid Inspector — найкращий інструмент для відладки CSS Grid. Візуально показує всі grid-лінії, зони, gaps.Flexbox Inspector — аналогічно для Flexbox.Shape Path Editor — для редагування clip-path та shape-outside прямо в браузері.Font Inspector — детальна інформація про шрифти, застосовані до елементів.
Автоматизоване тестуванняPlaywright — сучасний інструмент від Microsoft для end-to-end тестування. Нативно підтримує Chrome, Firefox і WebKit (Safari). Дозволяє запускати однакові тести в трьох різних рушіях — ідеально для крос-браузерного тестування.
// playwright.config.js
const { defineConfig, devices } = require('@playwright/test');
module.exports = defineConfig({
projects: [
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
{ name: 'firefox', use: { ...devices['Desktop Firefox'] } },
{ name: 'webkit', use: { ...devices['Desktop Safari'] } },
{ name: 'Mobile Chrome', use: { ...devices['Pixel 5'] } },
{ name: 'Mobile Safari', use: { ...devices['iPhone 13'] } },
],
});
Cypress — популярний e2e фреймворк, але підтримує тільки Chrome-подібні браузери (і Firefox). Для WebKit — потрібен Playwright.Visual Regression Testing — автоматичне порівняння скриншотів між браузерами. Інструменти: Percy, Chromatic, Applitools, або Playwright з вбудованим screenshot comparison.
// Playwright visual comparison
test('Homepage looks correct', async ({ page }) => {
await page.goto('/');
await expect(page).toHaveScreenshot('homepage.png');
});
Частина 9: Build Tools та конфігурація для крос-браузерності
Browserslist — єдина конфігурація для всіх інструментівBrowserslist — стандарт конфігурації цільових браузерів, який використовується Autoprefixer, Babel, ESLint, PostCSS та іншими інструментами.
# .browserslistrc
> 0.5% # Браузери з часткою ринку понад 0.5%
last 2 versions # Останні 2 версії кожного браузера
not dead # Виключити браузери без офіційної підтримки
iOS >= 12 # iOS Safari 12 і новіше
Перевіряйте, які браузери покриває ваша конфігурація: npx browserslist.
PostCSS — потужна обробка CSSPostCSS — інструмент для трансформації CSS через плагіни:Autoprefixer — автоматичне додавання вендорних префіксів.postcss-preset-env — дозволяє використовувати майбутні CSS-функції вже сьогодні, автоматично додаючи поліфіли та fallback. Аналог Babel для CSS.
// postcss.config.js
module.exports = {
plugins: [
require('autoprefixer'),
require('postcss-preset-env')({
stage: 2,
features: {
'nesting-rules': true,
'custom-properties': true
}
})
]
};
Vite та Webpack: конфігурація для сумісностіVite (сучасний стандарт):
// vite.config.js
import legacy from '@vitejs/plugin-legacy'
export default {
plugins: [
legacy({
targets: ['defaults', 'not IE 11'],
additionalLegacyPolyfills: ['regenerator-runtime/runtime']
})
]
}
@vitejs/plugin-legacy автоматично генерує два бандли: сучасний (ESM) для нових браузерів і legacy (CommonJS + поліфіли) для старих. Браузери самі вибирають потрібний через
У каталозі 1700+ діджитал-агентств, які готові допомогти в реалізації ваших завдань. Вибирайте та економте до 30% свого часу та бюджету! Це безкоштовно та займе менше 3-х хвилин.