Як створити крос-браузерний сайт: поради та інструменти

Як створити крос-браузерний сайт: поради та інструменти

 

Вступ: чому браузери досі "не домовились між собою"

Здавалося б, 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 Tools

Firefox має деякі унікальні 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 — потужна обробка CSS

PostCSS — інструмент для трансформації 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 + поліфіли) для старих. Браузери самі вибирають потрібний через

 

Поділитися
У пошуках підрядника з розробки сайту?
Заходьте до нашого online каталогу Веб-студій та вибирайте партнера за рядом критеріїв: бал, портфоліо, відгуки, кейси та статті. Або організуйте тендер в даному каталозі, вибравши компанії, що вам сподобалися.
Більше не потрібно шукати та обдзвонювати діджитал-агентства!
Створіть тендер та отримайте пропозиції від найкращих веб-студій України.
У каталозі 1700+ діджитал-агентств, які готові допомогти в реалізації ваших завдань. Вибирайте та економте до 30% свого часу та бюджету! Це безкоштовно та займе менше 3-х хвилин.
Створити тендер
Bug