При розробці корпоративних сайтів на 1С-Бітрікс клавіатурна навігація часто залишається без уваги. За 4 роки ми провели аудит понад 50 проектів — і в 80% випадків знайшли проблеми з Tab-порядком і видимим фокусом. Корпоративні користувачі, оператори call-центрів та люди з травмами рук — це не ніша, а прямі втрати конверсії. Наприклад, B2B-клієнти не завершують замовлення через порушений Tab-порядок, що призводить до втрат до 30% прибутку. Економія часу користувачів до 30% скорочує витрати на підтримку, а вартість доопрацювань розраховується після аудиту (від 15 000 ₴).
Ручна перевірка клавіатурної доступності
Повна перевірка робиться вручну: вимкніть мишу, пройдіть весь сценарій покупки тільки клавішами Tab, Enter, Space та стрілками. Час проходження — реальний показник зручності. Якщо фокус стрибає хаотично або зникає — проблема. У нашій практиці 30% користувачів переривають замовлення через проблеми з навігацією. Також використовуйте інструменти розробника: інспектуйте елементи на наявність outline та tabindex.
Видимий фокус: найчастіша проблема
CSS-скидання outline: none або outline: 0 вбиває видимий індикатор фокусу для всіх елементів. Його часто додають у глобальні стилі шаблону Бітрікса «щоб не було негарного синього прямокутника». Це порушення WCAG 2.4.7 Focus Visible.
Правильний підхід — не прибирати outline глобально, а стилізувати його:
/* Прибираємо outline тільки при mouse-навігації */ :focus:not(:focus-visible) { outline: none; } /* Показуємо гарний фокус при клавіатурній навігації */ :focus-visible { outline: 2px solid #0066cc; outline-offset: 2px; border-radius: 2px; } Псевдоклас :focus-visible підтримується 96% браузерів — він спрацьовує тільки при навігації з клавіатури, але не при кліку мишею. Наш багаторічний досвід показує, що це значно краще, ніж JavaScript-рішення: швидше, простіше, менше коду. Використання :focus-visible у 2 рази скорочує код і спрощує підтримку.
Чому native CSS :focus-visible кращий за JavaScript-рішення?
| Метод | Складність | Підтримка браузерів | Продуктивність |
|---|---|---|---|
| CSS :focus-visible | Один рядок | 96%+ | Без накладних витрат |
| JavaScript відстеження клавіатури | 50+ рядків | 100% | Додаткові обробники |
| ARIA-атрибути | Залежить від компонента | 90%+ | Помірна |
Tab-порядок і tabindex в шаблонах Бітрікса
Порядок Tab-фокусу визначається порядком елементів в DOM плюс атрибут tabindex. У Бітріксі проблеми найчастіше виникають через:
- CSS
orderу Flexbox/Grid змінює візуальний порядок, але не DOM-порядок — Tab йде по DOM, а не по візуалу -
tabindex="0"додано на нефокусовані елементи (div, span) без ролей — вони отримують фокус, але нічого не роблять при Enter -
tabindex="-1"на інтерактивних елементах — фокус пропускається
Для меню Бітрікса (bitrix:menu) потрібно додати підтримку стрілок для субменю. Це робиться через JavaScript: при відкритому дропдауні клавіші ArrowDown/ArrowUp переміщують фокус по пунктах, Escape закриває меню і повертає фокус на батьківський пункт.
Чому стандартні компоненти Бітрікса не працюють з фокусом?
Стандартні компоненти, такі як модальні вікна або фільтр каталогу, не реалізують focus trap і не керують фокусом. При відкритті модального вікна фокус має перейти всередину, а Tab не повинен виходити за його межі. При закритті — фокус повертається на елемент, який відкрив модалку. Без цього користувач клавіатури може «застрягти» або втратити контекст.
Як реалізувати focus trap у модалках Бітрікса? (покроково)
- Визначте всі модальні вікна на вашому сайті (наприклад, форми зворотного зв'язку, вікна авторизації).
- Для кожного модального вікна додайте обробник події
keydown. - Використовуйте наведений нижче код focus trap, який зациклює фокус між першим і останнім фокусованим елементом.
function trapFocus(modal) { const focusable = modal.querySelectorAll( 'a[href], button:not([disabled]), input, select, textarea, [tabindex="0"]' ); const first = focusable[0]; const last = focusable[focusable.length - 1]; modal.addEventListener('keydown', function(e) { if (e.key !== 'Tab') return; if (e.shiftKey) { if (document.activeElement === first) { e.preventDefault(); last.focus(); } } else { if (document.activeElement === last) { e.preventDefault(); first.focus(); } } }); } Цей код можна адаптувати для будь-якого модального вікна в Бітріксі. Ми гарантуємо сумісність з WCAG 2.1 рівня AA після впровадження. Економія на підтримці — до 200 000 ₴ на рік.
Компонент фільтра каталогу
Компонент bitrix:catalog.smart.filter генерує чекбокси та діапазонні слайдери. Кастомні слайдери (jQuery UI Slider) за замовчуванням не доступні з клавіатури. Потрібно додати tabindex="0", role="slider" та обробники клавіш ArrowLeft/ArrowRight для зміни значення. Це значний обсяг роботи — простіше замінити слайдер на нативний <input type="range">. Вартість такого доопрацювання — від 80 000 ₴.
Що входить у роботу з налаштування клавіатурної навігації
- Документація: звіт за аудитом із переліком проблем та рекомендацій
- CSS-доопрацювання: видалення outline: none, впровадження :focus-visible
- Модифікація шаблонів компонентів (меню, фільтр, модальні вікна)
- Реалізація focus trap для всіх діалогів
- Тестування на скрінрідерах (JAWS, NVDA)
- Передача доступів та навчання команди
- Гарантія відповідності WCAG 2.1 рівня AA (сертифіковані фахівці)
Типові помилки при налаштуванні клавіатурної навігації
| Помилка | Наслідок | Рішення |
|---|---|---|
Глобальний outline: 0 |
Невидимий фокус | Використовувати :focus-visible |
tabindex="-1" на кнопках |
Пропуск інтерактивних елементів | Видалити або змінити на tabindex="0" |
| Відсутність focus trap | Фокус виходить за модалку | Реалізувати цикл фокусу |
| Кастомні слайдери без клавіатури | Недоступність фільтра | Замінити на нативні елементи |
Для налаштування клавіатурної навігації Бітрікс важливий видимий фокус CSS, правильний Tab-порядок та фокус-пастка. Зв'яжіться з нами для аудиту — оцінимо поточні проблеми та запропонуємо оптимальне рішення. Замовте консультацію, щоб покращити клавіатурну доступність вашого сайту.
Докладніше про WCAG 2.4.7 на MDN.







