Найдорожчі баги SEO, які я бачив, були не через хитрі оновлення алгоритмів. Вони виникали через нудні фронтенд-рішення:
кнопка, яка не є кнопкою, меню, що працює лише мишкою, сторінка, чий «контент» здебільшого живе в div-ах і надії.
Google не виходить у гнівний режим як користувач, але він тихо індексує менше, розуміє менше і ранжує вас відповідно.
Робота з доступністю (A11y) зазвичай продається як відповідність нормам, емпатія або «правильна річ». Це правда, і також:
це жорсткий спосіб усунути неоднозначність у вашому DOM. Пошукові системи люблять однозначність. Так само і спеціалісти з інцидентів.
Чому доступність і SEO перетинаються (і де ні)
Пошукові системи не є скрінрідерами, але вони поділяють базову залежність: ваш сайт має пояснювати себе в машинозчитуваній структурі.
Якщо ваш інтерфейс покладається на візуальні підказки («те, що там» ) або на неявну поведінку (обробники кліків на div), ви створили інтерфейс тільки для людей.
Люди чудові, але вони не запускають індексацію в масштабі.
Перетин: структура, ясність і стійкість
-
Семантичний HTML дає як допоміжним технологіям, так і краулерам карту. Заголовки, списки, лендмарки, кнопки
та елементи форм зменшують здогадки. Здогадки не ранжуються. -
Зрозумілі текстові альтернативи (alt, текст посилань, aria-label де потрібно) покращують сприйняття,
коли зображення не завантажуються, JS ламається або краулер вирішує сьогодні не рендерити ваш додаток. -
Продуктивність і стабільність — спільні залежності. Якщо сторінка підвисає, зміщується або ніколи не має стабільного стану,
клавіатурні користувачі страждають, і Core Web Vitals також погіршуються. Останнє — фактор ранжування; перше — джерело судових позовів. - Навігація без миші зазвичай є навігацією, яка передбачувана в DOM, що зазвичай означає, що її легше парсити і вона менш крихка на різних пристроях і ботах.
Що не перетинається: ARIA — не хак для ранжування
Будьмо точними: додавання атрибутів ARIA не чарівно піднімає SEO. Іноді ARIA необхідна; часто це пластир на відсутню семантику.
Використовуйте нативні елементи перш за все. ARIA — другий крок. Якщо ваша SEO-стратегія включає «ми додамо aria-label скрізь»,
ваша стратегія — «ми витратимо гроші і все одно будемо в замішанні».
Тут діє одна операційна правда: надійність слідує за дефолтами. За замовчуванням браузери для нативних елементів дивовижно хороші.
Дефолти для кастомної div-маси… креативні.
Парафраз ідеї Річарда Кука (системна безпека): успіх приховує роботу, яка запобігає невдачам, поки невелика зміна її не оголить
.
A11y і SEO — обидва місця, де цю роботу або роблять наперед — або за неї платять під час інциденту.
Цікаві факти та історія, що пояснюють сучасний безлад
A11y і SEO не «зблизилися» через комітет. Вони збіглися, бо обидва дбають про інтерпретовану структуру,
передбачувану поведінку і вміст, що виживає в складних умовах: повільні мережі, зламаний JS, старі пристрої та люди,
які не користуються інтерфейсом так, як ваш дизайнер.
-
Термін «доступність» передує сучасним веб-додаткам. Ранні допоміжні технології існували задовго до
React; веб успадкував десятиліття очікувань щодо використання клавіатури та текстових альтернатив. - WCAG 1.0 вийшов 1999 року. Це старіше за більшість пайплайнів збірки, що нині тримають ваш фронтенд у заручниках.
- ADA прийнято 1990 року. Багато «сучасних» компаній дізналися про це, коли прийшов лист-претензія, а не коли вони проєктували навігацію.
-
HTML5 ввів семантичні елементи, як-от <nav>, <main>, <article> у 2014 році.
Вони не були винайдені для SEO, але допомагають краулерам і допоміжним технологіям погодитися щодо того, що таке сторінка. -
Google почав використовувати Core Web Vitals у системах ранжування у 2021 році. CLS і INP/LCP не є «метриками a11y»,
але ті самі погані патерни UI схильні ламати обидва. -
ARIA 1.0 стала рекомендацією W3C у 2014 році. Вона з’явилася тому, що автори продовжували створювати кастомні контроли
без афордансів, які надають нативні елементи. -
Скрінрідери парсять дерево семантики, а не ваш CSS. Якщо ваша «кнопка» — це div з обробником кліку,
вона невидима для того семантичного шару, якщо ви не відтворите те, що браузер зробив би безкоштовно. -
Пошукові системи можуть не виконувати ваш JS так, як ви. Рендеринг може затримуватися, бути обмеженим або пропущеним.
Семантичний, доступний HTML підвищує шанси, що ваше значення переживе частковий рендеринг. -
CAPTCHA створені, щоб зупиняти ботів; вони часто зупиняють і людей. Коли ваш конверсійний шлях блокує реальних користувачів,
жодна SEO-кампанія не врятує графік доходів від фізики.
Жарт №1: Ми продовжуємо винаходити нові фронтенд-фреймворки, щоб уникнути написання HTML, а потім тижнями заново винаходити те, що HTML уже робив.
Плейбук швидкої діагностики: знайти вузьке місце за 15 хвилин
Коли SEO падає або залучення користувачів тане, команди часто панікують і «випускають більше контенту». Якщо фронтенд семантично зламаний,
більше контенту — це як додавати книги в бібліотеку, чий каталог палає.
Перше: підтвердіть режим відмови (індексація vs розуміння vs досвід)
- Проблема індексації: сторінки відсутні в пошуку, раптові помилки краулінгу, плутанина з каноніками, директиви robots.
- Проблема розуміння: неправильні снипети, нерелевантні запити, погані позиції попри індексацію.
- Проблема досвіду: стрибки показника відмов, падіння конверсій, регрес Core Web Vitals, проблеми на мобільних.
Друге: перевірте правду DOM, а не наміри дизайну
- Чи є саме один
<h1>і чи відповідає він темі сторінки? - Чи використовують навігація та основні дії нативні
<a>і<button>? - Чи описані зображення, що несуть зміст, зрозумілим
alt? - Чи мають форми
<label>і повідомлення про помилки, які оголошуються?
Третє: протестуйте реальність «без JS» і «повільний JS»
- Отримайте сирий HTML. Чи є основний контент, або там «Loading…»?
- Симулюйте повільний 3G + обмеження CPU. Чи зсувається макет? Чи стають меню непридатними?
- Запустіть Lighthouse і axe для того ж URL на тій же збірці. Відстежуйте зміни.
Четверте: вирішіть, що виправляти першим
Виправляйте те, що блокує і людей, і краулерів:
семантичні заголовки, зламані посилання, недоступна навігація, відсутні мітки та катастрофічні регресії продуктивності.
«Ідеальні ознаки фокусу пікселів» можуть почекати, поки ваш сайт не стане знайденим і керованим.
Виправлення доступності, які також покращують SEO (практичний список)
1) Використовуйте реальні заголовки, у порядку, для справжньої структури
Заголовки — це ваша структура документа. Для користувачів скрінрідерів вони є основним способом навігації. Для пошукових систем
вони допомагають вивести тему та ієрархію.
Робіть так:
- Рівно один
<h1>на сторінку, що описує унікальну тему сторінки. - Використовуйте
<h2>для основних розділів,<h3>для підрозділів. Не пропускайте рівні, щоб «зробити текст меншим». - Не використовуйте заголовки для стилізації. Якщо потрібен великий текст, застосуйте CSS до
<p>або<div>і збережіть семантику.
Уникайте:
кількох <h1> як декоративного тексту у хедері або заголовків всередині повторюваних компонентів, що перетворюють кожну картку на <h2>.
Це створює сторінку з 47 «головними темами». Краулери не розуміють, яку саме ви маєте на увазі; користувачі теж.
2) Текст посилань, що пояснює сам себе (і не повторює «клікніть тут»)
Скрінрідери часто перелічують посилання без контексту. Пошукові системи також аналізують текст анкора, щоб зрозуміти зв’язки.
«Детальніше» повторюване 20 разів — не зв’язок; це знехтування.
- Використовуйте описовий текст посилання: «Тарифи для корпоративних планів», а не «Дізнатися більше».
- Якщо ви мусите використовувати «Читати далі», додайте візуально прихований контекст: «Читати далі про реагування на інциденти».
- Кнопки виконують дії; посилання ведуть. Не плутайте їх через «бо так працює».
3) Alt-текст: це не слот для SEO, а контракт контенту
Хороший alt-текст покращує пошук зображень, допомагає невізуальним користувачам і виручає, коли зображення не завантажуються.
Він також робить ваш контент переносним у різних контекстах (reader mode, синдикація, низька пропускна здатність).
- Функціональні зображення (іконки, що діють як кнопки/посилання) потребують alt, який описує дію: «Пошук», «Відкрити меню».
- Інформаційні зображення потребують alt, що коротко передає інформацію.
- Декоративні зображення повинні мати порожній alt (
alt=""), щоб допоміжні технології могли їх пропустити.
Уникайте наповнення ключовими словами. Якщо ви впишете «найкраща доступна корпоративна хмарна платформа зберігання» в alt для фото вашого офісного собаки,
ви заслуговуєте на відповідне ранжування.
4) Лендмарки: зробіть сторінку навігабельною в один натиск клавіші
Використовуйте <header>, <nav>, <main>, <footer> та регіональні мітки, де потрібно.
Це прямо не «ранжує», але зменшує плутанину, що знижує зруйновані шляхи користувачів, покращує сигнали користувачів і конверсії.
І це робить аудити простішими.
- Один
<main>на сторінку. - Якщо у вас кілька навігацій (верхня + сайдбар), позначте їх (наприклад,
aria-label="Primary"). - Додайте посилання «Перейти до контенту» як перший фокусований елемент.
5) Форми: мітки, помилки та autocomplete — не опція
Форма, яку не можна заповнити, — це баг конверсії. SEO приводить трафік; доступність вирішує, чи цей трафік може платити вам.
Також пошукові системи дедалі більше винагороджують сайти, що не нагадують пастки.
- Кожному полю введення потрібна програмна мітка:
<label for>абоaria-labelledby, якщо інше неможливе. - Повідомлення про помилки мають бути пов’язані через
aria-describedbyі оголошуватися через live-регіони при появі. - Використовуйте токени
autocomplete. Це зменшує тертя і допомагає допоміжним технологіям. - Не використовуйте placeholder як мітку. Плейсхолдери зникають; користувачі — ні.
6) Підтримка клавіатури: сайт має працювати в режимі «без миші»
Робота з клавіатурою — це базова доступність, і одночасно лакмусовий папір для порядку в DOM. Якщо порядок табуляції хаотичний,
ваша розмітка хаотична. Хаотична розмітка породжує хаотичний рендер і крихкі скрипти, що стає боргом для SEO й надійності.
- Переконайтеся, що всі інтерактивні елементи досяжні й керовані з клавіатури.
- Видимі стилі фокусу. Не «тонкі». Видимі.
- Не блокувати фокус у модальних вікнах; повертайте фокус до елементу, що викликав модал.
7) Меню навігації: припиніть будувати їх як ігри
Мегаменю і складні навігації часто відправляються як досвід тільки для вказівника миші. Потім команда латкає їх ARIA-ролями
і обробниками клавіш, і половина все одно ламається в Safari з VoiceOver. Використовуйте нативні патерни, якщо немає сильної причини інакше.
- Використовуйте
<button>для переключачів,<a>для місць призначення. - Переконайтеся, що стан розгортання відображається (наприклад,
aria-expanded). - Тримайте HTML навігації в початковій відповіді там, де це можливо; не ховайте IA за JS.
8) Не ховайте контент у недоступних вкладках/акордеонах
Згортаємий UI — це нормально. Згортаємий UI, що видаляє контент з дерева доступності, ламає фокус або залежить від hover — ні.
Для SEO: якщо контент існує лише після крихкої клієнтської взаємодії, деякі краулери пропустять його.
9) Структуровані дані: узгодьте їх із видимим та доступним контентом
Структуровані дані — не фічa a11y, але дисципліна перетинається: сторінка має говорити те саме людям,
допоміжним технологіям і машинам. Якщо ваша схема заявляє п’ятизіркові відгуки, а видимий контент їх не показує, ви створюєте сигнали недовіри.
Краулери і користувачі це ненавидять.
10) Продуктивність — це доступність, а продуктивність — це SEO
Повільний сайт — це недоступний сайт для користувачів з обмеженою пропускною здатністю, старим обладнанням або когнітивною втомою.
Це також сайт, що втрачає позиції і конверсії. Найбільші порушники:
- Великі хедер-зображення без адаптивних розмірів.
- Клієнтське рендеринг, що затримує контент і заголовки.
- Зсуви макета через пізнє завантаження шрифтів, реклами та зображень без розмірів.
- Гідратація та сторонні скрипти, що блокують інтерактивність.
11) Не ламайте сторінки «тільки з безкінечним скролом»
Безкінечний скрол може бути доступним, якщо реалізований обережно, але часто його випускають без правильної семантики пагінації.
Для SEO пагінація досі працює. Для доступності передбачувана навігація — базова ввічливість.
12) Мова і метадані: встановіть базові речі правильно
Встановіть lang у документі. Переконайтеся, що заголовки унікальні і відповідають заголовку сторінки. Використовуйте метаописання,
яке описує контент, а не брендове маніфестування. Це допомагає скрінрідерам вибирати правила вимови і допомагає снипетам пошуку відповідати наміру.
Жарт №2: Нічого так не говорить «преміальний досвід бренду», як модал, який не можна закрити без миші.
Три корпоративні міні-історії з поля бою
Історія 1: Інцидент через хибне припущення («Google рендерить усе як Chrome, правда?»)
Середня SaaS-компанія перебудувала маркетинговий сайт як single-page app. Він виглядав фантастично. Анімації, переходи,
вишукані градієнти. CTO сподобався — зазвичай це або добрий знак, або початок інциденту.
Припущення було просте: «Пошукові системи виконують JavaScript як звичайний браузер». На етапі розробки вони тестували на
сучасному Chrome на швидких ноутбуках. У продакшені вони відправили клієнтське рендерення для більшої частини контенту, зі скелетоном
та API-запитами для наповнення секцій, включно з H1 і основним текстом.
За кілька тижнів органічний трафік почав сповзати вниз. Не обвал, але повільна течія. Першими поскаржилися продажі.
SEO-команда звинуватила контент. Інженери — «зміни алгоритму». У службі підтримки були тікети про порожні сторінки в готельному Wi‑Fi.
Ніхто не пов’язав це, бо сайт «працює на моїй машині», що є найстарішою брехнею в операціях.
Виправлення не було екзотичним. Вони додали серверний рендеринг для ключового контенту, переконалися, що HTML-відповідь містить H1 і
основний текст, і зробили навігаційні посилання реальними анкорами. Потім провели аудит заголовків і прибрали дубльовані H1,
які з’явилися через спільний hero-компонент. Рейтинги стабілізувалися. Конверсії покращилися. Анімації залишилися, бо світ несправедливий.
Урок: якщо ваш основний контент не в початковому HTML, ви робите ставку на бюджети рендерингу, які ви не контролюєте.
A11y-фахівці попереджали про це роками. SEO-фахівці тепер приносять підтвердження.
Історія 2: Оптимізація, що обернулася проти («Ми прибрали обводки і трохи покращили CLS»)
Команда великого ecommerce мала завдання: покращити Core Web Vitals. Вони серйозно взялися. Зменшили CSS, оптимізували зображення
і працювали зі зсувами макета. Прогрес був реальний — поки вони не «оптимізували» стилі фокусу.
Мотив був естетичний і хибний: контури фокусу «виглядають некрасиво» і «викликають візуальний сіп». Хтось також повірив,
що прибирання обвідок зменшить зсув макета. Не зменшило. Просто прибрало єдиний видимий індикатор клавіатурного фокусу.
Далі стало передбачувано: користувачі з клавіатурою не розуміли, де вони. Зросла кількість звернень у підтримку про проблеми з оформленням замовлень,
які виглядали як помилки користувачів, але ними не були. Тим часом записи сесій показували rage clicks і багато повторного табування.
Показник відмов виріс таким чином, який аналітика не завжди могла чітко пояснити, бо фрикція клавіатури не завжди дає чисті крапки воронки.
Потім підключилася команда відповідності. Виправлення було простим: відновити стилі фокусу, переконатися, що вони не викликають зсуву макета,
використовуючи outline (що не впливає на макет) замість border, і протестувати в режимі лише клавіатури як блокер релізу.
Урок: «оптимізація», яка зменшує видимі афорданси — це не оптимізація. Це саботаж з тікетом продуктивності.
Якщо хочете знизити CLS — резервуйте місце для зображень і шрифтів. Не сліпіть користувача.
Історія 3: Нудна, але правильна практика, що врятувала день (релізні гейти + бюджети регресій)
Фінтех-компанія мала щотижневий цикл релізів і звичку випускати невеликі UI-експерименти. Експерименти — це добре.
Невимірені експерименти — це шлях до Франкенштейн-інтерфейсу.
Вони запровадили нудну практику: кожен PR, що впливав на фронтенд-шаблони, запускав дві автоматичні перевірки в CI:
Lighthouse (продуктивність + базова доступність) і axe-core для правил доступності. Порушення порогів блокували злиття.
Без винятків, без «тільки цього разу», без «але сьогодні п’ятниця».
Одного тижня розробник додав «прості» компоненти: сітку карток, де кожна картка була клікабельною. Він реалізував це як
<div onClick> з вкладеними посиланнями. Воно працювало мишкою. Воно також створило некоректне вкладення інтерактивних елементів,
зламало клавіатурну навігацію і спантеличило допоміжні технології.
CI-перевірки відпали негайно: відсутня семантика кнопки, дубльовані цілі посилань і зламаний порядок табуляції. Розробник
переробив картку на реальне посилання з розумною клікабельною зоною і прибрав вкладені інтерактивні елементи. Реліз відбувся.
Ніхто не святкував. У цьому і є суть.
Урок: найбільш цінна робота з A11y і SEO — це запобігання регресіям. Ваше майбутнє «я» ніколи не скаже гучно дякую, але спатиме спокійно.
Поширені помилки: симптом → корінна причина → виправлення
1) Симптом: «Ми проіндексовані, але позиції погані і снипети неправильні»
- Корінна причина: заголовки декоративні; контур сторінки — маячня; кілька H1; ключовий контент прихований за JS.
- Виправлення: забезпечити ієрархію заголовків, рендерити ключовий контент на сервері або пререндерити, переконатися, що title і H1 відповідають темі.
2) Симптом: «Користувачі відскакують на мобільних; CWV регресували; підтримка каже „сайт глючить“»
- Корінна причина: зсуви макета через зображення без розмірів, пізнє завантаження шрифтів або інжекцію банерів/модалів після завантаження.
- Виправлення: встановити width/height або aspect-ratio, відповідально preload критичні шрифти, резервувати місце для динамічного UI, відкласти некритичні скрипти.
3) Симптом: «Користувачі з клавіатурою не можуть користуватися меню / формами»
- Корінна причина: клікабельні div, відсутнє управління фокусом, взаємодії тільки на hover, видалені стилі фокусу.
- Виправлення: використовувати нативні елементи, реалізувати правильну фокусну логіку/повернення, додати видимий фокус через outline, протестувати порядок табуляції.
4) Симптом: «Трафік з пошуку зображень низький; зображення товарів погано відображаються»
- Корінна причина: відсутній або сміттєвий alt-текст, декоративним зображенням присвоєно шумний alt, lazy-loading застосований без розбору.
- Виправлення: писати осмислений alt для інформаційних зображень, використовувати alt=”” для декоративних, уникати lazy-loading для героїв, що над «the fold».
5) Симптом: «Бюджет краулінгу витрачається даремно; багато майже-дубльованого контенту»
- Корінна причина: фасетована навігація створює нескінченні варіанти URL; canonical-теги неправильні; пагінація прихована в JS.
- Виправлення: обмежити фасети, правильно встановити canonical, надати краулену пагінацію, використовувати robots-директиви свідомо.
6) Симптом: «Ми додали ARIA скрізь; перевірки все одно провалюються»
- Корінна причина: ARIA використовується замість нативної семантики; ролі конфліктують з елементами; мітки дублюються або відсутні.
- Виправлення: видалити зайву ARIA, використовувати нативні контролі, застосовувати ARIA лише при створенні повністю кастомних компонентів з повною підтримкою клавіатури.
7) Симптом: «Модальні попапи руйнують конверсії і час на сайті»
- Корінна причина: відсутній фокус-треп, кнопка закриття недоступна, ESC не обробляється, фон прокручується неконтрольовано.
- Виправлення: шаблон доступного модалу: фокус переміщується всередину, ловиться, повертається до тригера, підтримує ESC, кнопка закриття — першосортна.
8) Симптом: «Внутрішній пошук працює, але зовнішній не знаходить глибокий контент»
- Корінна причина: контент рендериться лише після клієнтських API-викликів; глибокі сторінки не зв’язані або доступні лише через скрипти.
- Виправлення: забезпечити крауленими посиланнями, серверно-рендерити ключові сторінки, згенерувати sitemap, уникати закриття навігації за обробниками кліків.
Практичні завдання з командами: що запускати, що це означає, що робити
Ці завдання призначені для робочого підходу: перевірити командою, інтерпретувати вивід, а потім ухвалити рішення.
Більшість з них можна запускати з CI-раннера або хоста для налагодження. Вони не виправлять ваш DOM за вас, але перестануть вас відточувати на суперечках.
Завдання 1: Отримайте сирий HTML і перевірте, чи існує основний контент без JS
cr0x@server:~$ curl -sS -L -A "Mozilla/5.0 (compatible; DebugBot/1.0)" https://www.example.com/product/widget | sed -n '1,80p'
<!doctype html>
<html lang="en">
<head>
<title>Widget - Example</title>
...
</head>
<body>
<main>
<h1>Widget</h1>
<p>Our Widget helps you...</p>
Що означає вивід: Ви бачите <main>, <h1> і реальний текст у початковій відповіді.
Це добре як для краулерів, так і для користувачів у поганих мережах.
Рішення: Якщо ви бачите лише скелетон («Loading…») і скрипти, пріоритезуйте SSR/пререндеринг або принаймні статичний HTML для ключового контенту.
Завдання 2: Перевірте заголовки canonical і robots у заголовках відповіді
cr0x@server:~$ curl -sSI https://www.example.com/blog/post | egrep -i 'x-robots-tag|cache-control|content-type'
content-type: text/html; charset=utf-8
cache-control: max-age=0, must-revalidate
Що означає вивід: Тут немає заголовка X-Robots-Tag. Це нормально.
Рішення: Якщо ви бачите X-Robots-Tag: noindex на сторінках, які хочете індексувати, зупиніть усе і виправте заголовок на рівні CDN/додатку.
Завдання 3: Перевірте meta robots і canonical в HTML
cr0x@server:~$ curl -sS https://www.example.com/blog/post | egrep -i 'rel="canonical"|name="robots"' | head
<link rel="canonical" href="https://www.example.com/blog/post">
<meta name="robots" content="index,follow">
Що означає вивід: Canonical вказує на себе; robots дозволяють індексацію.
Рішення: Якщо canonical ненавмисно вказує на іншу сторінку (часто через помилкове видалення UTM), виправте шаблони та переіндексуйте.
Завдання 4: Швидка перевірка кількості заголовків (груба, але корисна)
cr0x@server:~$ curl -sS https://www.example.com/product/widget | pup 'h1,h2,h3 text{}' | nl | sed -n '1,30p'
1 Widget
2 Features
3 Reliability
4 Pricing
5 FAQ
Що означає вивід: Ви отримали чистий витяг контуру. Це перевірка здорового глузду, що DOM має справжню структуру.
Рішення: Якщо вивід показує повторювані заголовки з карток («Learn more» як H2 скрізь), рефакторіть компоненти і зніміть статус заголовків.
Завдання 5: Запустіть Lighthouse у CI-режимі для accessibility і performance
cr0x@server:~$ lighthouse https://www.example.com/ --only-categories=accessibility,performance --output=json --output-path=./lh.json --chrome-flags="--headless=new"
Lighthouse CLI v12.0.0
✔ Generated report to ./lh.json
Що означає вивід: Існує JSON-звіт; ви можете дифити його між комітами та витягувати бали категорій і аудити.
Рішення: Встановіть бюджети. Якщо продуктивність або a11y падають за поріг, фейлити збірку і виправляти перед релізом.
Завдання 6: Витяг ключових аудитів Lighthouse (LCP/CLS плюс a11y-сигнали)
cr0x@server:~$ jq -r '.categories.accessibility.score, .categories.performance.score, .audits["largest-contentful-paint"].displayValue, .audits["cumulative-layout-shift"].displayValue' lh.json
0.92
0.74
3.8 s
0.21
Що означає вивід: Доступність непогана; продуктивність слабка; LCP і CLS поза «добрим» діапазоном.
Рішення: Розглядайте CLS > 0.1 і LCP > 2.5s як інцидент продуктивності/a11y для ключових посадкових сторінок. Досліджуйте зсуви макета і блокуючу роботу рендеру.
Завдання 7: Запустіть axe-core через CLI на URL
cr0x@server:~$ npx axe https://www.example.com/ --exit
✔ 0 violations found!
Що означає вивід: Базові автоматичні перевірки пройдено. Це не «повна доступність», але хороший регресійний охоронний бар’єр.
Рішення: Якщо з’являються порушення, підключіть це до CI і блокуйте злиття при нових порушеннях. Не перетворюйте backlog на смітник.
Завдання 8: Швидко ідентифікуйте відсутні атрибути alt
cr0x@server:~$ curl -sS https://www.example.com/ | pup 'img attr{alt}' | head
Summer campaign banner
Product photo: Widget in use
Що означає вивід: Принаймні деякі зображення мають alt. Ця команда не показує відсутні alt напряму — проблема в відсутності.
Рішення: Якщо підозрюєте відсутні alt, шукайте в шаблонах теги <img без alt і впровадьте lint-правила (наприклад, eslint-plugin-jsx-a11y).
Завдання 9: Підтвердіть gzip/brotli і підказки щодо розміру відповіді
cr0x@server:~$ curl -sSI -H 'Accept-Encoding: br,gzip' https://www.example.com/ | egrep -i 'content-encoding|content-length|vary'
vary: Accept-Encoding
content-encoding: br
Що означає вивід: Brotli-компресія активна; відповідь варіюється за кодуванням. Добра базова практика для продуктивності і доступності на повільних лінках.
Рішення: Якщо немає стиснення, виправте конфігурацію CDN/вебсерверу. Потім повторно перевірте Lighthouse.
Завдання 10: Перевірте, чи критичний CSS/JS кешується (стабільність продуктивності)
cr0x@server:~$ curl -sSI https://www.example.com/assets/app.9c1f3d2.js | egrep -i 'cache-control|etag|last-modified'
cache-control: public, max-age=31536000, immutable
etag: "a1b2c3d4"
Що означає вивід: Файли з fingerprint-ом кешуються агресивно. Це зменшує затримки при повторних відвідинах і допомагає користувачам, які переходять між сторінками.
Рішення: Якщо активи мають no-cache, ви змушуєте зайві завантаження і підвищуєте ймовірність повільного, зламаного досвіду.
Завдання 11: Помітити важкі сторонні скрипти (a11y + CWV-порушник)
cr0x@server:~$ curl -sS https://www.example.com/ | egrep -o '<script[^>]+src="[^"]+"' | sed 's/.*src="//;s/"$//' | head
https://cdn.example.com/assets/app.9c1f3d2.js
https://thirdparty.example.net/tracker.js
https://chat.example.org/widget.js
Що означає вивід: Ви бачите сторонні скрипти. Вони часто шкодять INP, додають зсуви макета і створюють проблеми з фокусом.
Рішення: Проаудитіть необхідність. Відкладіть, lazy-load або видаліть. Якщо скрипт додає модал, змусьте його відповідати вимогам клавіатури і фокусу.
Завдання 12: Швидко перевірити robots.txt на випадкові блоки
cr0x@server:~$ curl -sS https://www.example.com/robots.txt | sed -n '1,80p'
User-agent: *
Disallow: /admin/
Disallow: /internal/
Sitemap: https://www.example.com/sitemap.xml
Що означає вивід: Розумні заборони, sitemap вказано.
Рішення: Якщо в продакшені ви бачите Disallow: /, ставте це як Sev-1. Відкочуйте або робіть хотфікс негайно.
Завдання 13: Перевірити, чи sitemap повертає 200 і парситься
cr0x@server:~$ curl -sSI https://www.example.com/sitemap.xml | head
HTTP/2 200
content-type: application/xml
Що означає вивід: Sitemap досяжний і віддається як XML. Базова гігієна.
Рішення: Якщо він повертає 404/500 або віддається як HTML, виправте роутинг і кешування. Потім повторно надішліть у консолі пошуку.
Завдання 14: Виявити проблему SPA-типу «title ніколи не змінюється»
cr0x@server:~$ for u in https://www.example.com/ https://www.example.com/pricing https://www.example.com/product/widget; do echo "== $u"; curl -sS $u | pup 'title text{}'; done
== https://www.example.com/
Example
== https://www.example.com/pricing
Example
== https://www.example.com/product/widget
Example
Що означає вивід: Кожна сторінка має однаковий title. Це погано для SEO і вводить в оману користувачів допоміжних технологій, які орієнтуються на title.
Рішення: Реалізуйте унікальні title для маршрутів на сервері або через правильне керування head, і переконайтеся, що видимий H1 відповідає title.
Чеклисти / покроковий план
Покроковий план на наступні два спринти
Sprint 1: Стабілізувати семантику і зупинити кровотечу
- Зафіксуйте політику заголовків. Один H1 на сторінку, консистентна ієрархія H2/H3. Додайте lint-правило або gate перевірки.
- Виправте інтерактивні елементи. Замініть клікабельні div на кнопки/посилання. Приберіть вкладені інтерактивні елементи.
- Додайте/відновіть skip links і лендмарки. Один main, позначені навігації, передбачувана структура.
- Гігієна форм. Мітки, autocomplete, доступні повідомлення про помилки, управління фокусом при валідації.
- Відновіть стилі фокусу. Використовуйте outline, не border. Забезпечте контраст.
- Автоматизуйте перевірки регресій. Lighthouse + axe в CI з порогами і правилом «без нових порушень».
Sprint 2: Покращення продуктивності і краулінгу, що складаються
- Виправте CLS в джерелі. Резервуйте місце для зображень/реклами, стабільні шрифти, уникайте пізніх інжекцій DOM над fold.
- Зменшіть вартість JS. Видаліть сторонні скрипти, code-splitting, відкладіть некритичні фічі, вимірюйте INP.
- Зробіть навігацію краулебельною. Переконайтеся, що основні маршрути — реальні посилання в HTML, а не JS-only обробники кліків.
- Програма alt-тексту. Визначте правила: декоративні vs інформаційні vs функціональні зображення. Наведіть порядок у компонентах.
-
Консистентність title + meta. Унікальні title, точні meta descriptions, правильний
lang, sanity canonical. - Стратегія пагінації. Забезпечте доступні контролі пагінації і переконайтеся, що глибокі сторінки досяжні та індексуються.
Чеклист релізного гейту (роздрукуйте це, дратуйте команду)
- Smoke-тест лише клавіатурою: навігація, основний CTA, форми, закриття модалів.
- Один H1, розумний контур, без спаму заголовків у повторюваних компонентах.
- Посилання мають описовий текст; немає масового «клікніть тут».
- Зображення: осмислений alt де потрібно, порожній alt для декоративних.
- Бюджети Lighthouse: доступність і продуктивність вище порогів.
- Немає випадкових
noindexзаголовків/мета, canonical коректний. - CLS контрольовано в ключових шаблонах; зображення мають розміри.
- Сторонні скрипти переглянуті; немає нових блокуючих тегів без обґрунтування.
Питання й відповіді
1) Чи покращення доступності безпосередньо впливають на позиції?
Не як один «a11y-складник» ранжування. Але виправлення, які роблять сайт доступним — семантична структура, краулебельна навігація,
стабільний рендер, керовані форми — часто покращують те, як контент відкривають, парсять і сприймають. Це покращує те, що справді важить.
2) Чи корисна ARIA для SEO?
ARIA в основному для допоміжних технологій, а не для пошукових систем. Використовуйте її, щоб зробити кастомні віджети доступними, коли нативні елементи
не справляються. Якщо можна використати нативний елемент — робіть це. Це швидше, надійніше і звичайно більш сумісно.
3) Якщо у нас уже є SSR — чи ми закінчили?
SSR допомагає, але ви все одно можете випустити семантично зламану сторінку: неправильні заголовки, недоступні контролі, відсутні мітки та фокусні пастки.
SSR — це транспортний механізм. A11y — дисципліна про дизайн і реалізацію.
4) Чи має кожне зображення мати alt-текст?
Кожен <img> має мати атрибут alt. Іноді цей alt порожній (alt="") для декоративних зображень.
Функціональні та інформаційні зображення потребують осмисленого alt, що відповідає внеску зображення.
5) Ми використовуємо кнопки лише з іконками. Який правильний патерн?
Використовуйте реальний <button> і забезпечте доступну назву через видимий текст, aria-label або aria-labelledby.
Переконайтеся, що фокус видимий і кнопка доступна з клавіатури. Потім протестуйте зі скрінрідером принаймні раз на реліз.
6) Чи може «перейти до контенту» впливати на SEO?
Опосередковано. Skip links покращують використання клавіатури і зменшують тертя/відскоки, особливо на сторінках з великими хедерами і навігаціями.
Вони також змушують команди підтримувати coherente <main> регіон, що є гарною гігієною структури.
7) Який найшвидший a11y-фікс з найбільшим SEO-ефектом?
Почистіть заголовки і семантику навігації, і переконайтеся, що початковий HTML містить осмислений контент і H1. Це покращує парсинг і зменшує залежність від крихкого клієнтського рендерингу.
8) Як уникнути регресій без перетворення релізів на комітет?
Автоматизуйте. Запускайте Lighthouse і axe в CI, встановіть пороги і блокуйте злиття при нових порушеннях. Поєднайте це з одним ручним smoke-тестом лише клавіатурою для ключових потоків.
Це швидше, ніж розбиратись у кварталі «чому впав трафік?» після факту.
9) Чи допомагають покращення Core Web Vitals доступності?
Часто так. Менший CLS зменшує рух і плутанину. Кращий INP знижує лаг введення, що може бути критичним для користувачів, які покладаються на клавіатуру,
переключальні пристрої або голосовий ввід. Але не оптимізуйте шляхом видалення афордансів, як-от індикатори фокусу.
10) У нас є дизайн-система. Чому ми все ще провалюємо аудити?
Дизайн-системи часто випускають компоненти, що виглядають консистентно, але поводяться по-різному: відсутні мітки, несемантичні контейнери,
кастомні select без підтримки клавіатури. Аудитуйте саму систему, а не тільки продукт-сторінки. Виправте один раз; вигода буде скрізь.
Висновок: наступні кроки, які переживуть квартал зустрічей
Якщо ви хочете роботу з A11y, яка також рухає SEO, припиніть ставитися до доступності як до побічного завдання на відповідність і почніть сприймати її як
інженерію надійності фронтенду. Ваш DOM — це API. Зробіть його стабільним, семантичним і тестованим.
Зробіть це наступним кроком, у порядку
- Запустіть плейбук швидкої діагностики для ваших топ-5 посадкових сторінок: сирий HTML, заголовки, семантика навігації, CLS/LCP/INP.
- Виправте структурні блокери: один H1, розумна ієрархія, реальні посилання/кнопки, пронумеровані форми, видимий фокус, skip link + лендмарки.
- Впровадьте gate в CI: Lighthouse + axe з бюджетами і правилом «без нових порушень». Запобігання регресіям краще героїки.
- Обріжте сторонні скрипти і стабілізуйте макет. Робота з продуктивності, що зменшує підвисання, — це робота з доступності і SEO.
- Інституціоналізуйте нудні перевірки: smoke-тест лише клавіатурою для кожного релізу, особливо для навігації, модалів і оформлення замовлення.
Віддача — не тільки позиції. Це менше крихких UI-інцидентів, менше суперечок «працює на моїй машині» і сайт, що поводиться як професійний продукт, а не демо, яке випадково опинилося в продакшені.