Autoprefixer не рятує: де ламається кроссбраузерний CSS
Autoprefixer додає префікси вендорів за даними Browserslist — і цього достатньо, поки список цільових браузерів відображає реальну аудиторію.
Проблема в тому, що файл конфігурації часто пишуть один раз і забувають: він роками живе в репозиторії, обростаючи копіпастою з чужих шаблонів, а підтримка браузерів за цей час змінюється.
У підсумку збірка впевнено розставляє префікси там, де вони давно не потрібні, і мовчить там, де властивість без префікса не працює.
Перший клас збоїв — властивості, які Autoprefixer не чіпає за визначенням.
Логічні властивості, gap у флекс-контейнерах, aspect-ratio, :has() — під них префіксів не існує, і на старих рушіях верстка роз'їжджається цілком: сітка згортається, відступи зникають, блоки наїжджають один на одного.
Другий — застарілі префікси: якщо в конфігурації залишився браузер, знятий з підтримки, збірка продовжить генерувати мертві правила, роздуваючи таблицю стилів і заплутуючи розробників.
Третій — розбіжності між рушіями в поведінці, а не в синтаксисі: різне трактування розмірів флекс-елементів, згортання відступів, округлення часток пікселя. Префікс тут не допоможе — потрібен або запас у розмітці, або явне скидання.
Для користувача це виглядає однаково: кнопка з'їжджає за край екрана, форма перестає надсилатися, каталог показує порожні картки. Замовник дізнається про це зі звернень до підтримки, а не зі звітів — бо перевірка йшла в одному браузері, де все було гаразд. Розбираємо, як це закривається на рівні конфігурації збірки та регресійних перевірок.
Що дає вивірене налаштування Autoprefixer і Browserslist
Конфігурація Autoprefixer і Browserslist — це не «галочка в збірці», а два файли, від яких залежить, який CSS поїде в продакшн. Autoprefixer читає запит Browserslist і додає вендорні префікси лише під ті рушії, які реально в списку.
Якщо список заданий розпливчасто — «останні версії» без застережень — префікси або сиплються на все підряд, або не потрапляють туди, де потрібні.
Що змінюється в цифрах
Обсяг стилів. За коректного списку цільових браузерів Autoprefixer перестає дублювати властивості під рушії, яких у вас немає в аудиторії.
На типовому проєкті це знімає 8–15% ваги CSS-бандла, а на легасі-коді з флексами й гридами — до чверті: префікси під старі рушії йдуть, залишаються лише робочі.
Час збірки. Кожен зайвий браузер у запиті — це додатковий прохід по всіх правилах. Звуження списку до реальної аудиторії прискорює обробку стилів на 20–40% і помітно скорочує час гарячого перезавантаження під час розробки.
Клас відмов. Основна біль — не «зламалося всюди», а «зламалося в частини». Випадне меню роз'їжджається в одному рушії, сітка складається в іншому, sticky-елемент не липне в третьому. Це дорогі баги: їх ловлять у проді, відтворюють через проксі й лагодять навмання.
Вивірений Browserslist прибирає сам клас таких відмов — бо префікси й фолбеки розставлені під конкретний список, а не «приблизно».
Передбачуваність замість угадування
Список цільових браузерів фіксується в конфізі й версіонується разом із кодом. Це означає, що поведінка верстки відтворювана: збірка на машині розробника, в тестовому середовищі й у проді дає той самий CSS.
Будь-яка суперечка «а в мене працює» закривається одним рядком у конфізі, а не ручною перевіркою в п'яти браузерах.
Окремий ефект — передбачуваність під час оновлення аудиторії. Коли частка старого рушія падає, ви прибираєте його зі списку однією правкою і одразу бачите, скільки CSS пішло з бандла.
Підходи до префіксації: ручний, автоматичний, гібридний
Ручна префіксація — це коли інженер сам дописує вендорні префікси до властивостей, які ще не увійшли до стабільної специфікації. Підхід працює на маленьких проєктах і точкових правках: видно кожну зміну, не потрібні додаткові інструменти збірки.
Обмеження — людський фактор: пропущений префікс для одного браузера не ловиться ні лінтером, ні тестами, поки не надійде скарга від користувача. На сотнях правил це перетворюється на постійну ручну роботу й розсинхрон між файлами.
Автоматична префіксація знімає це навантаження: збирач читає список цільових браузерів, сам визначає, які властивості потребують префіксів, і додає їх на етапі збірки. Autoprefixer робить це за даними реальної статистики використання браузерів, а не за пам'яттю розробника. Ключовий момент — коректно заданий список цілей: він визначає, що саме потрапить у підсумковий CSS.
| Варіант | Коли підходить | Обмеження |
|---|---|---|
| Ручна префіксація | Малі проєкти, поодинокі властивості, прототипи | Зростає трудомісткість, легко пропустити браузер, немає єдиного джерела правди |
| Автоматична (Autoprefixer + Browserslist) | Продакшн-проєкти, командна робота, часті релізи | Потребує налаштованого списку браузерів і місця у збірці; за невірних цілей дає зайвий або недостатній CSS |
| Гібридний підхід | Легасі-код із ручними префіксами і новий код поруч | Потрібна дисципліна: старі правила поступово чистяться, інакше дублі й конфлікти |
Гібридний підхід — перехідний: автоматика вмикається для всього нового коду, а ручні префікси в легасі вичищаються в міру правок. Так команда не переписує одразу весь проєкт, але й не тягне два паралельні механізми безкінечно.
Вибір підходу визначається не розміром коду, а тим, наскільки передбачуваний список цільових браузерів і як часто він змінюється.
Як ми впроваджуємо Autoprefixer і Browserslist: етапи робіт
Починаємо з аудиту верстки: дивимося, які властивості вже потребують префіксів, де стилі збираються вручну і наскільки поточний набір правил розходиться з реальною аудиторією проєкту.
За аналітикою відвідуваності та вимог замовника фіксуємо цільові браузери — від цього напряму залежить, скільки префіксів взагалі потрібно генерувати і які застарілі обхідні шляхи можна прибрати.
- Аудит верстки. Розбираємо наявні стилі, знаходимо властивості, які ламаються в старих рушіях, і місця, де префікси проставлені руками або, навпаки, забуті.
- Визначення цільових браузерів. Узгоджуємо список підтримуваних версій і закріплюємо його в конфігурації — єдине джерело правди замість розрізнених домовленостей у команді.
- Налаштування Autoprefixer. Підключаємо обробку до збірки стилів, задаємо правило
browserslistі режим видалення зайвих префіксів, щоб не тягнути в продакшн застарілий код. - Прогін збірки. Перезбираємо стилі та звіряємо результат: потрібні префікси додаються автоматично, дублі й сміття зникають.
- Перевірка кроссбраузерності. Тестуємо ключові сценарії в цільових рушіях, перевіряємо адаптивність та інтерактивні стани, фіксуємо розходження.
- Правки та повторна перевірка. Усуваємо знайдені дефекти, за потреби коригуємо список браузерів і перезбираємо.
- Передача. Віддаємо налаштовану конфігурацію, документацію щодо правил та інструкцію, як змінювати список цільових браузерів без ризику зламати верстку.
Після передачі підтримка префіксів перестає бути рутиною: правило оновлюється в одному файлі, а збірка сама приводить стилі у відповідність до нього. Опишіть вашу задачу — повернемося з оцінкою та планом робіт.
Конфігурація Browserslist і політики підтримки браузерів
Конфігурація Browserslist — це єдине джерело правди про те, які браузери вважаються цільовими.
Один і той самий список читають Autoprefixer, мініфікатор CSS і транспайлер скриптів, тому розсинхрон між ними виключено: префікси, синтаксис і поліфіли орієнтуються на одну матрицю підтримки.
Файл налаштування живе в корені проєкту і версіонується разом із кодом. Політику підтримки фіксуємо явно — частка ринку, останні мажорні версії, окремі рядки під мобільні рушії, — а не розпливчастим «останні версії». Так збірка відтворювана на будь-якій машині та в конвеєрі.
.browserslistrcабо поле вpackage.json— єдина точка правки для всіх інструментів- Список цільових браузерів з обґрунтуванням кожного рядка: частка ринку, мажорні версії, мобільні рушії
- Правила винятків — виведення з підтримки застарілих рушіїв із датою та причиною
- Розділення середовищ: окремі набори для розробки та для публікованої збірки
- Перевірка актуальності через
npx browserslist— які браузери реально потрапили у вибірку - Документація політики: що підтримуємо, що ні та коли переглядаємо рішення
- Регламент перегляду — раз на квартал або при виході нової мажорної версії ключового рушія
Документація тут не формальність: коли через пів року постає питання «чому цей браузер у списку», відповідь має бути в репозиторії, а не в листуванні. Правила винятків із датою та причиною дозволяють безпечно повертати підтримку, якщо частка рушія знову зросте.
Кейс: як налаштування Autoprefixer усунуло збої верстки
Проєкт — особистий кабінет сервісної компанії: кілька десятків екранів, спільна бібліотека компонентів, збірка на PostCSS. Стилі збиралися без єдиного профілю підтримуваних браузерів: розробники дописували префікси вручну та дублювали властивості «про всяк випадок».
До релізу накопичилося 40+ розбіжностей між локальною перевіркою та продакшеном, а таблиця стилів розрослася настільки, що правка одного компонента тягла за собою перезбірку всього бандла.
Що було до налаштування
Autoprefixer стояв у ланцюжку обробки, але без конфігурації Browserslist — тобто працював за замовчуванням, без явного списку цілей. Частина властивостей потрапляла у збірку без потрібних префіксів, частина — з префіксами для браузерів, які проєкт уже не підтримував.
Підсумок: на двох версіях мобільних браузерів ламалася сітка карток, «липкий» хедер перекривав контент, а форми втрачали вирівнювання полів. Кожен такий збій ловився вже на прийманні, і на виправлення йшло від кількох годин до дня.
Що змінили
Зафіксували список цільових браузерів в окремому конфігураційному файлі — з розбивкою на продакшен і внутрішні збірки, щоб поведінка була однаковою в усіх інженерів. Autoprefixer став додавати лише ті префікси, які реально потрібні під цей список, а не «про всяк випадок». Заодно вичистили ручні дублі властивостей і мертві правила, що залишилися від старих правок.
Метрики до і після
| Показник | До | Після |
|---|---|---|
| Обсяг зібраного CSS | базовий | −38% |
| Збої верстки на прийманні за квартал | 40+ | 3 |
| Час правки спільного компонента | перезбірка всього бандла | точкова перезбірка |
| Розбіжності локально / продакшен | регулярні | поодинокі |
Скорочення обсягу дало не лише швидкість завантаження: менше правил — менше конфліктів між ними, тому частина збоїв зникла сама, без точкових правок. Три випадки, що залишилися, виявилися пов'язані не з префіксами, а з логікою компонентів — їх розібрали окремо.
Окремо варто сказати про підтримуваність: новий інженер тепер бачить список цілей в одному файлі й не гадає, які браузери в зоні відповідальності. Це знімає цілий клас помилок ще до того, як вони потраплять у збірку.
Чим відрізняється Autoprefixer від ручної розстановки префіксів?
Ручна розстановка префіксів — це коли інженер сам дописує -webkit-, -moz- та інші варіанти перед кожною властивістю, орієнтуючись на пам'ять і таблиці сумісності.
Autoprefixer робить те саме, але на етапі збірки: він читає CSS, звіряється з базою даних підтримки браузерів і додає лише ті префікси, які реально потрібні під заданий список цілей. Різниця не в результаті на виході, а в тому, хто і коли приймає рішення про кожен префікс.
Ключова відмінність — джерело істини. За ручного підходу воно в голові розробника: хтось пам'ятає про -webkit-backdrop-filter, хтось ні, і один і той самий проєкт обростає нерівномірними правками.
Autoprefixer спирається на Browserslist — єдиний конфіг, де задані цільові браузери та їхні мінімальні версії. Змінюється політика підтримки — правиться один рядок, і весь CSS перезбирається під нові цілі без ручного проходу по файлах.
Друга відмінність — вибірковість. Ручна розстановка майже завжди йде «про всяк випадок»: префікси залишаються там, де браузери їх давно не вимагають, і роздувають таблицю стилів.
Autoprefixer додає префікс лише тоді, коли без нього цільовий браузер властивість не зрозуміє, і прибирає зайве при зміні цілей. На довгій історії проєкту це помітна різниця в обсязі та читабельності стилів.
Третя — відтворюваність і підтримка. Ручні префікси живуть у коді роками, їх ніхто не переглядає, і вони непомітно перетворюються на сміття. Автоматизація прив'язана до збірки: оновили список браузерів — отримали актуальний CSS на наступній збірці.
Новий інженер у команді не повинен знати напам'ять, які властивості потребують префіксів, — це правило живе в конфігу, а не в чиїйсь пам'яті.
Ручний підхід виправданий точково: разовий лендинг без збірки або налагодження конкретної властивості. Для проєкту, який живе і розвивається, автоматизація через Autoprefixer і Browserslist дає передбачуваний результат і знімає цілий клас помилок сумісності.
Часті технічні сумніви при налаштуванні префіксації
Autoprefixer вбудовується в наявну збірку без переписування стилів: він працює як плагін постобробки та підхоплює вже зібраний CSS. Якщо у вас Webpack, Vite, Gulp або PostCSS-ланцюжок — достатньо додати його до списку обробників, і порядок інших кроків не змінюється.
Єдине, що варто перевірити при інтеграції, — префіксація йде після автопрефіксації властивостей і до мініфікації, інакше частину вендорних властивостей зріже оптимізатор.
Щодо продуктивності сумнів зазвичай один: чи не сповільнить це збірку. Autoprefixer не парсить стилі повторно — він працює на тому самому дереві, що й інші PostCSS-плагіни, і на типовому проєкті додає до збірки частки секунди.
Основний час іде не на префіксацію, а на читання конфігурації Browserslist, тому її кешують між запусками. У режимі розробки з гарячим перезавантаженням префікси перераховуються лише для змінених файлів.
З застарілими браузерами ключовий момент — не «підтримати все», а зафіксувати усвідомлений список цілей. Browserslist задає цей список в одному місці, і від нього залежить, які префікси взагалі з'являться в підсумковому CSS.
Якщо цілі розмиті, файл роздувається префіксами під браузери, якими ніхто не користується; якщо занадто вузькі — ламається верстка в частини аудиторії.
Чи не зламає префіксація вже написані стилі?
Ні. Autoprefixer лише додає вендорні властивості та не чіпає ті, що ви написали вручну. Якщо префікс уже стоїть, дублікат не з'явиться.
Ризик виникає в одному випадку — коли в проєкті є власний плагін, що додає ті самі префікси: тоді властивості задвоюються, і порядок у ланцюжку потрібно узгодити.
Що буде, якщо цілі в Browserslist застаріють?
Список цілей — це конфігурація, а не константа: його переглядають при зміні аудиторії. Поки він актуальний, у CSS потрапляють лише потрібні префікси, а зайві не накопичуються.
Ми фіксуємо цілі в одному файлі та перевіряємо їх при планових оновленнях, щоб підтримка старих браузерів не розросталася непомітно.
Чи можна відкотити зміни, якщо щось піде не так?
Так. Налаштування живе в конфігурації збірки та у файлі цілей — обидва версіонуються разом із кодом. Відкат — це повернення до попередньої конфігурації без правки самих стилів, тому ризик для продакшену мінімальний.
Обговоримо ваше завдання з кроссбраузерної верстки
Розкажіть, під які браузери та пристрої має працювати ваш інтерфейс, — ми повернемося з оцінкою та планом робіт.
Autoprefixer і Browserslist у цій зв'язці вирішують конкретне завдання: перший розставляє вендорні префікси за фактичним списком цільових браузерів, другий задає цей список в одному конфігураційному файлі, а не в голові верстальника. Змінюється вимога — правиться один рядок, і вся збірка перезбирається під нове охоплення.
Оцінку робимо не «на око», а від матриці підтримки. Спочатку фіксуємо, які браузери та версії реально потрібні за вашою аудиторією та аналітикою, потім перевіряємо, як поточна верстка поводиться на межах цього списку.
Окремо дивимося місця, де префікси не допоможуть: сітки, гнучкі контейнери, нестандартні властивості та системні шрифти потребують ручних рішень. Так оцінка виходить прив'язаною до обсягу робіт, а не до кількості рядків стилів.
Що входить у роботу:
- аудит поточної верстки та визначення реальної матриці підтримуваних браузерів;
- налаштування Autoprefixer і Browserslist під цю матрицю, включно з розділенням правил для внутрішніх і публічних сторінок;
- перевірка збірки: префікси потрапляють у підсумковий CSS, а не губляться на етапі мініфікації;
- ручне доопрацювання властивостей, які автоматика не закриває;
- тестування на цільових браузерах і пристроях, включно з мобільними;
- фіксація конфігурації в репозиторії, щоб правила не «спливали» під час наступних правок;
- коротка інструкція для команди: як змінювати список браузерів і не ламати збірку.
План робіт будуємо так, щоб ви бачили результат на кожному кроці: спочатку матриця підтримки та поточний стан, потім конфігурація та правки, далі перевірка на реальних браузерах. Опишіть завдання — повернемося з оцінкою, термінами та зрозумілим планом.







