vyvchy
    Теми розділу

    03 · Веб і мережі для AQA

    Кросбраузерність і адаптивна верстка

    Зміст

    «У мене все працює» — фраза, після якої тікет закривають неправильно. Сайт, що бездоганно поводиться на робочому ноутбуці, не доводить нічого про телефон користувача, про корпоративний браузер із режимом сумісності чи про людину, яка читає сторінку читачем екрана. Другий бік тієї самої монети — звіт «на мобільному все поїхало» без жодної деталі, з якого неможливо зробити навіть перший крок.

    Ця глава — повний виклад теми на сайті: інші глави посилаються сюди по матрицю браузерів, й . Мета — два вміння: назвати, що входить у периметр підтримки, і за хвилину відрізнити «браузери різні, тому й поведінка різна» від «це дефект застосунку».

    Периметр: три різні речі під одним словом

    Кросбраузерне тестування (cross-browser testing) — практика перевірки, що сайт працює в різних браузерах і на різних пристроях. Периметр ширший, ніж здається, бо в нього входять три різні речі:

    • старіші браузери, які не підтримують найновіших можливостей JS і CSS;
    • різні класи пристроїв — від настільних компʼютерів і ноутбуків до планшетів, смартфонів і смарт-ТВ із дуже різними апаратними можливостями;
    • люди з інвалідністю, які покладаються на допоміжні технології — читачі екрана — або користуються самою лише клавіатурою.

    Установка, з якої варто починати, сформульована в матеріалах MDN як гасло: ти — не твій користувач. Те, що сайт працює на машині розробника чи тестувальника, не доводить нічого.

    Найдорожча помилка тут — вважати критерієм піксельну ідентичність. Сайт не мусить давати однаковий досвід у всіх браузерах, доки базова функціональність доступна в якийсь спосіб: у сучасному браузері може бути анімований тривимірний елемент, у старішому — плаский графічний із тією самою інформацією, і обидва варіанти прийнятні. Тому «у Safari тінь на два пікселі інша» — здебільшого не дефект, а «у Safari не працює кнопка оплати» — дефект безумовний: базова функціональність недоступна.

    Покрити геть усі браузери й пристрої практично неможливо, тому діапазон підтримки має бути домовленістю з власником продукту — між трьома стратегіями: вирівняти поведінку в усіх цільових браузерах (зокрема поліфілами — polyfill); свідомо дати спрощений, але прийнятний варіант; або відмовитися від підтримки старих браузерів за згодою замовника чи користувацької бази.

    Третій периметр тут лишається саме периметром: доступність — частина тієї самої матриці , а її предмет (семантика розмітки, критерії, читачі екрана, автоматичні перевірки) розбирає глава «Семантичний HTML і доступність (a11y)».

    Чому цей клас дефектів мовчить

    Причин кросбраузерних розбіжностей MDN називає три, і тримати їх окремо корисно, бо лікуються вони по-різному. Перша — вади й розбіжності реалізацій: браузери іноді мають баги або реалізують ту саму можливість по-різному. Друга — різний рівень підтримки можливостей: неминуче, коли йдеться про найновіші можливості або про давно заморожені браузери. Третя — обмеження самого пристрою: малий екран, слабкий процесор.

    Типові проблеми HTML і CSS зводяться до двох областей — брак підтримки нових можливостей і проблеми розкладки. А головна властивість цього класу дефектів — тиша. Якщо браузер не розуміє CSS-оголошення чи правило, він просто пропускає його: без застосування й без помилки. Те саме з медіазапитами, @font-face і блоками @supports. Нерозпізнані HTML-елементи браузер трактує як анонімні рядкові — без семантичного значення, як span.

    Пастка

    «У консолі чисто» тут не доводить нічого: симптом «у Chrome є, у Safari немає» майже ніколи не супроводжується червоним рядком. Дивитися треба на вигляд і поведінку, а не на журнал помилок.

    Далі — каталог, у якому впізнається більшість реальних тікетів:

    • Один невалідний селектор вимикає цілий блок. У списку через кому помилковий селектор просто ні до чого не підійде, а невалідний — вимкне весь список разом зі стильовим блоком. Симптом кросбраузерний: у браузері, який один із селекторів списку не розпізнає, зникає цілий блок стилів, а там, де розпізнає, усе на місці.
    • Самотній -webkit-. Префікси вендорів (-moz- — Firefox, -webkit- — Chrome, Edge, Opera, Safari; у старому коді ще -ms- та -o-) призначалися для експериментальних реалізацій. Найпоширеніший дефект — узяти лише -webkit--версію властивості; це траплялося настільки часто, що інші вендори самі реалізували -webkit--префіксовані версії кількох властивостей.
    • Префікси в продакшені взагалі. Їх можуть змінити чи прибрати без попередження, вони бʼють по продуктивності старих версій і самі є джерелом кросбраузерних проблем. Правильний шлях — детекція можливостей через @supports.
    • Конфлікт імен зі стороннім кодом. Клас із CSS-фреймворка або з розмітки, яку генерує стороннє API (наприклад, рекламний банер), збігається з вашим — і верстка їде.
    • Помилки розмітки, яких не видно. У DevTools помилки HTML майже не спливають: браузер сам «лагодить» криву розмітку, тож шукати їх треба валідатором W3C — це окремий крок. Незастосовані CSS-оголошення інспектор натомість показує перекресленими з трикутником-попередженням.
    • Адаптивність і роздільна здатність. Сайт гарний на десктопі й нестерпний на мобільному (дрібний вміст, важкі анімації); мобільним не потрібні важкі зображення, але дрібні картинки на щільних екранах виглядають пікселізовано.

    Три довідники, які MDN називає основними для питання «а це взагалі підтримується»: сам MDN, stackoverflow.com і caniuse.com.

    Рядок матриці — це рушій, а не логотип

    (rendering engine) — частина браузера, яка перетворює HTML, CSS та інші ресурси сторінки на візуальне подання на екрані. Термінологічна деталь, на якій плутаються: «рушій рендерингу» і «рушій браузера» (browser engine) — назви одного поняття, а не двох підсистем; MDN уживає browser engine, rendering engine і layout engine як синоніми.

    MDN називає поширеними чотири:

    Рушій рендерингуХто на ньому
    BlinkChromium, а отже й Chrome; починався як форк бібліотеки WebCore із WebKit
    GeckoFirefox — рушій розкладки від Mozilla Project
    WebKitSafari від Apple, а також багато мобільних браузерів
    Tridentрушій Internet Explorer; його ж вмикає режим IE (IE mode) в Edge

    Це перелік рушіїв, а не браузерів, — і саме тому матриця має менше по-справжньому різних рядків, ніж логотипів:

    Chrome

    Blink

    Edge

    Opera

    Firefox

    Gecko

    Safari

    WebKit

    Мобільні браузери
    на WebKit

    Рядок матриці

    Рядок матриці

    Рядок матриці

    Chrome

    Blink

    Edge

    Opera

    Firefox

    Gecko

    Safari

    WebKit

    Мобільні браузери
    на WebKit

    Рядок матриці

    Рядок матриці

    Рядок матриці

    MDN кладе Chrome, Edge й Opera в один пункт прикладу матриці саме тому, що Edge й Opera стоять на тому самому рушії рендерингу, що й Chrome; Microsoft, зі свого боку, називає Chromium рушієм, на якому побудований Edge, а рушій рендерингу Chromium — Blink. Safari стоїть на WebKit — окремий рядок, який перевіркою в Chrome не закривається.

    Trident при цьому не суто історичний рядок: його вмикає режим IE в Edge, і оновлення безпеки для нього тривають до 2029 року. Тобто корпоративний Edge із увімкненим режимом IE рендерить сторінку не Blink-ом — це конкретний сценарій матриці, а не археологія.

    І нюанс, який рятує від хибної класифікації: рушій — це не лише «малювання». Gecko, наприклад, містить ще й мережевий стек, графічний стек і віртуальну машину JavaScript, тож кросбраузерна різниця може виявитися не розкладкою, а поведінкою мережі чи JS-середовища. (Архітектура браузера як цілого й конвеєр рендерингу — глава «Архітектура браузера й рендеринг»; як окреме поняття — глава «Виконання JavaScript та event loop»; поширеність версій протоколу — глава «HTTP/2 і HTTP/3: еволюція протоколу».)

    Наша практика (не канон). Далі — правило, яким користуються команди; окремого стандарту під нього немає. Один рушій рендерингу — один рядок матриці: дефект розкладки, знайдений у Chrome, з високою ймовірністю відтвориться в Edge, а перевірка в Chrome не заміняє перевірки в Safari. Джерела кладуть браузери зі спільним рушієм в один пункт матриці, але про ймовірність відтворення конкретного дефекту не говорить жодне з них.

    Звідки беруться рядки матриці

    Матриця — не список улюблених браузерів команди, а зріз аудиторії. Коли зрозуміло, які можливості потрібні продукту, наступний крок — дослідити, якими браузерами й пристроями користуються люди, для яких сайт роблять. Часто такі дані вже є у замовника: з попередніх досліджень, з інших його сайтів або з попередньої версії цього самого.

    Типовий приклад із MDN: сайт електронної комерції для Північної Америки має повністю працювати в останніх кількох версіях найпопулярніших десктопних і мобільних браузерів — Chrome (разом з Edge й Opera, бо вони на тому самому рушії рендерингу), Firefox і Safari — і додатково відповідати WCAG рівня AA (самі критерії й рівні — предмет глави про доступність).

    Якщо даних про аудиторію ще немає, є готовий мінімальний кістяк — базовий набір браузерів Baseline: Chrome (десктоп і Android), Edge, Firefox (десктоп і Android), Safari (macOS та iOS). Комбінаторику, яка з цього виростає (браузер × версія × операційна система), звужують конфігурацій — це техніка тест-дизайну, і її канон живе в розділі про тест-дизайн, не тут.

    Baseline: чи можна вже користуватися цією можливістю

    Baseline — спільна для індустрії позначка «наскільки безпечно вже користуватися цією можливістю вебплатформи»: замість ручного зіставлення версій браузерів вона дає одну відповідь про рівень сумісності. Позначку започаткувала команда Chrome, а нині її визначає спільнотна група WebDX — тобто це не мітка одного вендора.

    Стадій у Baseline дві, і одразу варто зняти найпоширенішу плутанину: Limited availability — не третій рівень, а стан до Baseline.

    СтанЩо означає
    Limited availability (поза Baseline)можливість ще не підтримана в усіх браузерах базового набору
    Newly available (стадія 1)підтримують усі браузери базового набору, тобто можливість сумісна
    Widely available (стадія 2)від дати сумісності минуло 30 місяців — більшість сайтів може користуватися, не переймаючись підтримкою

    Для тестувальника це обʼєктивний аргумент у суперечці «це баг чи просто не підтримується»: якщо можливість має стан Limited availability, вона ще не підтримана всюди, тож різна поведінка в частині браузерів матриці очікувана. Але й Newly available не означає «можна всюди»: сумісність зафіксовано щойно, а обіцянку «не перейматися підтримкою» джерело дає лише на другій стадії, через 30 місяців.

    Наша практика (не канон). Причину 30-місячного відступу джерело не пояснює — воно дає лише число. Ми читаємо його так: на пристроях зі старішими версіями браузерів можливості ще немає, і саме на це закладено запас.

    Адаптивність — це поведінка розкладки

    Адаптивний вебдизайн (responsive web design) — підхід, за якого сторінка коректно відображається на всіх розмірах екрана й роздільностях зі збереженням зручності користування. Ключове слово — підхід: це не окрема технологія, а набір практик, тому «перевірити адаптивність» означає перевірити поведінку розкладки, а не наявність конкретної бібліотеки. Термін увів Ітан Маркотт у 2010 році, описавши тріаду: гумові сітки, гумові зображення й медіазапити.

    Контрінтуїтивний факт, з якого варто починати: сам HTML адаптивний за природою — сторінка без CSS переливає текст під розмір області перегляду при зміні вікна. Ламає адаптивність уже CSS із фіксованими розмірами: фіксована ширина дає горизонтальну прокрутку на вузьких екранах і надлишок порожнечі на широких. Flexbox і CSS Grid адаптивні за замовчуванням: елементи стискаються й розтягуються за наявним місцем, тож цілитися пікселедосконало в кожен розмір пристрою не потрібно.

    Медіазапит (media query) — набір перевірок (наприклад, чи ширший екран за певне значення), за якими вибірково застосовують CSS. Точку, у якій медіазапит спрацьовує й розкладка змінюється, називають брейкпоінтом (breakpoint). Поширений підхід — mobile first: проста одноколонкова розкладка для вузьких екранів, а багатоколонкова додається, коли ширини вистачає. Окрема рекомендація, яку ігнорують найчастіше: брейкпоінти задають у відносних одиницях, а не за розмірами конкретного пристрою. Медіазапити при цьому взагалі не обовʼязкові — гнучкі сітки, відносні одиниці та мінімальні й максимальні значення дають адаптивність і без них.

    Пастка

    «Перевірили на iPhone 14, iPad і ноутбуку» — це не план тестування адаптивності. Пристрої змінюються, а брейкпоінти — властивість вашої сторінки: перевіряти треба їх, а вже потім конкретні пристрої з матриці.

    Звідки беруться числа брейкпоінтів

    Питання «на яких саме ширинах перевіряти» звучить на кожному проєкті, і чесна відповідь дратує: канонічного списку «типових» значень немає, і це позиція джерел, а не прогалина в документації. Брейкпоінти не визначають за класами пристроїв, продуктами, брендами чи операційними системами — такий код важко підтримувати, і замість цього розкладку диктує сам вміст.

    Метод підбору описаний прямо — від малого вгору: спершу зробити вміст придатним для вузького екрана, потім розширювати, доки черговий брейкпоінт не стане потрібним. Так їх виходить мінімальна кількість, і всі під вміст. Критерій «пора ставити точку» визнано субʼєктивним: у прикладі web.dev вирішують, що понад 600px порожнечі між елементами вже забагато, і саме під це число роблять два медіазапити — @media (max-width: 600px) і @media (min-width: 601px). Тобто 600px тут — результат розгляду конкретного компонента, а не значення зі списку «популярних розмірів». Другий приклад числа з вмісту: класична теорія читабельності радить 70–80 символів (приблизно 8–10 англійських слів) на рядок, тож брейкпоінт варто ставити, коли блок тексту переростає приблизно 10 слів у рядку.

    Звідси два висновки для тестувальника. Перший: значення брейкпоінтів дізнаються з коду або з DevTools, а не з памʼяті. Другий: крім великих брейкпоінтів, де змінюється розкладка, бувають малі — між ними правлять відступи чи розмір шрифту. Візуальних змін більше, ніж «перемикань колонок», і частина дефектів живе саме там.

    Базовий прийом проти горизонтальної прокрутки — не давати медіа вилазити за : img, picture, video { max-width: 100% }. Адаптивна типографіка робиться так само просто — зміною розмірів шрифту в медіазапитах або через одиниці області перегляду.

    Область перегляду: чому адаптив «не працює на мобільному»

    Це місце, де ламається найбільше верстки, і діагностується воно за секунди.

    Область перегляду (viewport) — видима частина вікна, у якій показується вебконтент. Її розмір обчислюється до розкладки сторінки й задає, у скільки місця (насамперед по горизонталі) має вміститися вміст; що не вміщається — те браузер віддає на прокрутку.

    Проблема в тому, що мобільні браузери схильні брехати про ширину своєї області перегляду. Частина мобільних пристроїв і вузьких екранів рендерить сторінку у віртуальній області перегляду, ширшій за екран, а потім стискає результат: при екрані 640px сторінка може рендеритися у віртуальній області 980px і масштабуватися вниз. Наслідок катастрофічний: якщо віртуальна область — 980px, медіазапити на 640px, 480px і менше не спрацюють ніколи. Адаптив написано, він коректний, і його ніхто не побачить.

    немає

    є

    Сторінка на мобільному

    Метатег viewport
    width=device-width?

    Віртуальна область перегляду
    ширша за екран, напр. 980px

    Медіазапити на 480px
    не спрацьовують ніколи

    Область перегляду =
    ширина екрана

    Медіазапити спрацьовують,
    адаптив видно

    немає

    є

    Сторінка на мобільному

    Метатег viewport
    width=device-width?

    Віртуальна область перегляду
    ширша за екран, напр. 980px

    Медіазапити на 480px
    не спрацьовують ніколи

    Область перегляду =
    ширина екрана

    Медіазапити спрацьовують,
    адаптив видно

    Ліки — метатег viewport. Це не стиль і не скрипт, а підказка браузеру про те, яким має бути розмір області перегляду; поведінка задається парами «ключ=значення» в атрибуті content:

    <meta name="viewport" content="width=device-width, initial-scale=1" />

    width задає (мінімальну) ширину області перегляду — ціле число пікселів від 1 до 10000 або спеціальне значення device-width, тобто фізичну ширину екрана в CSS-пікселях; саме від неї рахується одиниця vw. initial-scale — співвідношення між шириною пристрою й розміром області перегляду, тобто початковий масштаб.

    Пастка

    Перший чек за звітом «на мобільному все поїхало» — не верстка, а head: чи є там метатег viewport і чи стоїть у ньому width=device-width. Без нього медіазапити на вузькі екрани не спрацюють узагалі, і шукати помилку в CSS марно.

    Масштабування, щільність екрана й клавіатура

    Ключ user-scalable дозволяє або забороняє користувачеві масштабувати сторінку. Браузер має право це проігнорувати — iOS від 10-ї версії ігнорує , — але сама спроба вже проблемна: вимкнення масштабування заважає людям із порушеннями зору читати й розуміти вміст. Це один із найдешевших чеків доступності в адаптивному тестуванні; сам предмет — у главі «Семантичний HTML і доступність (a11y)».

    Друге, що плутають: CSS-піксель — не апаратний піксель. Роздільності виросли настільки, що окремі пікселі око не розрізняє, тому браузери малюють один CSS-піксель кількома апаратними. Наслідок: текст лишається чітким, а растрові зображення можуть не використати повну роздільність екрана — тобто виглядають нечітко, якщо не дати версію більшої роздільності. Кількість фізичних пікселів на один CSS-піксель називають співвідношенням пікселів пристрою (device pixel ratio, DPR); типове значення залежить від щільності екрана — 1.0 при щільності менше 200dpi, 1.5 при 200–300dpi і ціла частина density/150dpi при понад 300dpi, причому лише за масштабу області перегляду, що дорівнює 1.

    Третє — інтерактивні віджети, насамперед віртуальна клавіатура. Їхній вплив задає ключ interactive-widget; за замовчуванням діє resizes-visual, і тут важливо не переказати джерело навпаки: за дефолтом клавіатура змінює лише візуальну область перегляду й розкладку сторінки не зачіпає. Щоб розкладка адаптувалася до клавіатури, значення треба явно поставити в resizes-content (є ще overlays-content, за яким не змінюється жодна з областей). Тож «верстка стрибає, коли відкривається клавіатура» — не очікуваний ефект дефолту: спершу перевірте, чи не стоїть у метатезі resizes-content, і лише потім заводьте дефект.

    Режим пристрою в DevTools і де проходить його межа

    Режим пристрою (device mode) — набір можливостей Chrome DevTools для симуляції мобільних пристроїв: симуляція мобільної області перегляду, обмеження ЦП і мережі, а через панель Sensors — геолокація, орієнтація, примусовий дотик і стан бездіяльності.

    Найкорисніша для адаптивності функція — показ брейкпоінтів. Панель стартує в режимі Responsive: ширину тягнуть маркерами або вводять числом. Смуги над областю перегляду показують реальні брейкпоінти сторінки: синя — точки max-width, помаранчева — min-width; клацання між ними перемикає ширину так, щоб потрібна точка спрацювала, а через контекстне меню відкривається відповідне оголошення @media у вихідному коді. Тобто брейкпоінти не вгадують — їх бачать. Тут же виставляють DPR вручну й знімають екран цілою сторінкою, а не лише видимою частиною.

    Друга важлива деталь: тип пристрою впливає не лише на вигляд. Він визначає, чи рендериться сторінка як мобільна чи як десктопна, який курсор показується і які події породжує взаємодія — сенсорні (touch) чи кліки. Тому баг «на мобільному не працює свайп» відтворюється саме перемиканням типу пристрою, а не звуженням вікна.

    Обмеження мережі й ЦП зібрані в пресети: Mid-tier mobile — швидкий 3G і вчетверо повільніший ЦП, Low-end mobile — повільний 3G і вшестеро повільніший. Застереження, без якого з цього роблять хибний : сповільнення відносне до потужності вашої машини, тож цифри не переносяться між компʼютерами один в один. (Сама панель Network — глава «DevTools: вкладка Network і дебаг».)

    Пастка

    Головне обмеження названо в документації прямо: режим пристрою — «наближення першого порядку» того, як сторінка виглядає й почувається на мобільному. Код виконується не на пристрої, а на вашому компʼютері, і частину аспектів — наприклад, архітектуру мобільних ЦП, яка суттєво відрізняється від настільної, — DevTools не змоделює ніколи. Саме тут проходить межа між «перевірив адаптивність» і «перевірив на мобільному».

    Реальні пристрої: лабораторія, ферми й порядок процесу

    Процес MDN описує чотирма фазами — планування, розробка, тестування й виявлення, виправлення та ітерації — і одразу пояснює, чому це не «етап наприкінці»: якщо лишити все тестування на кінець проєкту, знайдені баги коштуватимуть значно дорожче й довше, ніж якби їх ловили дорогою.

    Мінімальний ручний обхід теж названий: сучасні десктопні браузери — Firefox, Chrome, Opera, Edge й Safari, в ідеалі на macOS, Windows і Linux — плюс поширені мобільні: Safari на iPhone та iPad, Chrome і Firefox на iPhone, iPad та Android. Корисно перевіряти й передрелізні збірки, щоб зловити зміну поведінки до того, як вона доїде до користувачів. Зі зростанням проєкту ручний обхід матриці стає надто довгим — звідси аудит-інструменти, автоматизація й порівняння знімків екрана між браузерами (візуальна як інструмент — предмет розділу про інструменти автоматизації).

    Реальний пристрій із потрібним браузером дає найбільшу точність щодо поведінки й загального досвіду користувача, тому мінімальна лабораторія пристроїв () починається з фізичного заліза: Mac, Windows-ПК, телефон і планшет на Android, телефон і планшет на iOS — кожен із потрібними браузерами. Окремим пунктом іде порада, яку зазвичай ігнорують: тримати ще й пару слабких мобільних пристроїв, щоб перевіряти продуктивність (наприклад, анімації) на слабких процесорах. Інакше «гальмує в користувачів» не відтвориться ніколи — на флагмані все плавно.

    Далі — питання грошей. Великі компанії тримають лабораторії з дуже великим набором апаратів і ловлять дефекти на конкретних комбінаціях «браузер + пристрій»; менші команди обходяться меншими наборами, емуляторами (програмами, що відтворюють пристрій або його умови), віртуальними машинами й комерційними сервісами. Із комерційних ферм MDN називає Sauce Labs і Browser Stack; альтернатива — власна система автоматизації (популярний вибір — Selenium), яка вимагає налаштування, але окупається. Існують і публічні лабораторії пристроїв (Open Device Labs). Віртуальні машини лишаються потрібними там, де дві версії того самого браузера поруч не ставляться (класика — IE та Edge на Windows): під кожну версію тримають окремий .

    Пастка

    Ферма пристроїв — рядок бюджету, який має випливати з матриці, а не навпаки. Спочатку матриця браузерів і пристроїв, потім рішення: що з неї закриває емулятор, що — власне залізо, а що доводиться орендувати. «Перевірили на своєму телефоні» не закриває ані слабкого заліза, ані рушія, якого у вас немає.

    Локалізація кросбраузерного дефекту

    Тут головна навичка — звузити, а не описати. Порядок простий: спершу зібрати конфігурацію — платформу, пристрій і версію браузера від репортера; потім перевірити схожі конфігурації — ту саму версію браузера на різних платформах або кілька різних версій того самого браузера на одній платформі, щоб зрозуміти, наскільки широко дефект відтворюється; і третє, про що забувають, — припустити, що це може бути не ваша вина: дефект може бути в самому браузері, і тоді його заводять вендору, а в продукті шукають обхідний шлях.

    Звідси й вимога до звіту: «на мобільному зʼїхала кнопка» без пристрою, платформи й версії браузера непридатний до роботи.

    Типові помилки

    • Виглядає як «у консолі чисто, отже CSS у порядку», а насправді нерозпізнане оголошення браузер пропускає мовчки — без застосування й без помилки.
    • Виглядає як «сайт має виглядати однаково скрізь», а насправді критерій приймання — доступність базової функціональності, а різниця у вигляді часто є свідомим спрощенням.
    • Виглядає як «перевірили Chrome, Firefox, Edge, Opera — чотири браузери», а насправді це два рушії рендерингу: Edge і Opera закриваються тим самим рядком, що й Chrome, а Safari — ні.
    • Виглядає як «дефект розкладки в CSS», а насправді на мобільному немає метатегу viewport, і жоден медіазапит на вузькі екрани просто не вмикається.
    • Виглядає як «перевірили на iPhone 14 і iPad — адаптивність готова», а насправді перевірено дві ширини, а брейкпоінти сторінки ніхто не подивився.
    • Виглядає як «у режимі пристрою все добре, отже на мобільному працює», а насправді код виконався на вашому компʼютері: сенсорні події симульовані, а мобільний процесор не змодельований узагалі.
    • Виглядає як баг верстки, а насправді можливість має стан Limited availability і в частині браузерів матриці ще не підтримана — очікувана різниця.

    Підсумок

    1. Периметр — не «браузери», а три речі: старіші браузери, класи пристроїв і люди з інвалідністю; діапазон підтримки — домовленість із власником продукту, а не «тестуємо все».
    2. Критерій приймання — доступність базової функціональності, а не піксельна ідентичність; пріоритет дефекту рахується від функції, а не від різниці у вигляді.
    3. Цей клас дефектів мовчить: нерозпізнаний CSS ігнорується без помилки, тож чиста не є доказом, а помилки розмітки шукають валідатором.
    4. Рядок матриці — це рушій рендерингу, а не логотип: Blink, Gecko й WebKit дають менше різних відповідей, ніж назв браузерів.
    5. Адаптивність перевіряють у брейкпоінтах конкретної сторінки й лише за наявності метатегу viewport; режим пристрою закриває адаптивність, але не заміняє реального пристрою.

    Можливі питання

    • «Що входить у кросбраузерне тестування?» Перевіряють ширину картини світу. Слабка відповідь — «перевірити сайт у Chrome, Firefox і Safari»; сильна називає три периметри й додає, що діапазон підтримки узгоджують із власником продукту.
    • «Сайт у Safari виглядає інакше, ніж у Chrome. Це дефект?» Питання про критерій приймання. Очікують: залежить від того, чи доступна базова функціональність, — і приклад, коли різниця у вигляді прийнятна, а коли ні.
    • «Скільки браузерів треба в матриці й звідки взяти список?» Дивляться, чи не почнете перелічувати улюблені браузери. Сильна відповідь: із даних про аудиторію, а рядки групуються за рушієм рендерингу; базовий набір Baseline — стартовий кістяк, коли даних ще немає.
    • «Верстка не адаптується на мобільному. Ваші дії?» Міні-кейс, у якому слухають порядок: спершу метатег viewport, потім брейкпоінти сторінки в DevTools, і лише тоді сам CSS.
    • «Чим режим пристрою в DevTools відрізняється від реального пристрою?» Перевіряють, чи розумієте межу інструмента. Очікують: код виконується на вашій машині, ширина й сенсорні події симульовані, обмеження ЦП відносне до вашого заліза, а мобільна архітектура не моделюється.
    • «Як ви локалізуєте кросбраузерний баг?» Слухають метод звуження: конфігурація від репортера, схожі конфігурації (та сама версія на різних платформах і різні версії на одній), і допущення, що дефект може бути в самому браузері.

    Джерела

    Периметр: три різні речі під одним словом

    • MDN — Introduction to cross-browser testing — периметр і означення, гасло «ти — не твій користувач», критерій «не піксельна ідентичність», діапазон підтримки як домовленість, три стратегії.

    Чому цей клас дефектів мовчить

    Рядок матриці — це рушій, а не логотип

    Звідки беруться рядки матриці

    Адаптивність — це поведінка розкладки

    • MDN — Responsive web design — адаптивність як підхід, тріада Маркотта, гумовий за природою HTML, медіазапити й брейкпоінти, mobile first, відносні одиниці, обмеження медіа контейнером, адаптивна типографіка.
    • web.dev — Responsive web design basics — відсутність канонічного списку значень, підбір від малого вгору, субʼєктивність критерію з прикладом 600px, великі й малі брейкпоінти, довжина рядка 70–80 символів.

    Область перегляду: чому адаптив «не працює на мобільному»

    • MDN — <meta name="viewport"> (viewport meta element) — область перегляду й метатег як підказка, віртуальна область 980px і зрив медіазапитів, width=device-width та initial-scale, user-scalable, CSS-піксель проти апаратного й таблиця DPR, значення interactive-widget.
    • MDN — Responsive web design — «мобільні браузери схильні брехати про ширину області перегляду» і метатег як перший чек за звітом про поїхану мобільну верстку.

    Режим пристрою в DevTools і де проходить його межа

    • Chrome DevTools — Simulate mobile devices with device mode — склад режиму пристрою, смуги брейкпоінтів і перехід до @media, ручний DPR і знімок повної сторінки, вплив типу пристрою на події, пресети обмежень та їхня відносність, наближення першого порядку.

    Реальні пристрої: лабораторія, ферми й порядок процесу

    • MDN — Introduction to cross-browser testing — чотири фази процесу й ціна відкладеного тестування, мінімальний набір браузерів, передрелізні збірки, пріоритет реальних пристроїв, перехід до автоматизації.
    • MDN — Strategies for carrying out testing — точність реального пристрою, склад лабораторії, слабкі пристрої, емулятори й віртуальні машини, комерційні ферми, Open Device Labs.
    • Chrome DevTools — Simulate mobile devices with device mode — межа симуляції: за сумнівів перевіряють на реальному пристрої.

    Локалізація кросбраузерного дефекту

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.