← Назад к вопросам

Приведи примеры Accessibility

2.2 Middle🔥 102 комментариев
#JavaScript Core

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Примеры Accessibility (доступности) в веб-разработке

Accessibility (A11y) — это практика создания веб-интерфейсов, которые могут использоваться людьми с различными ограничениями: нарушениями зрения, слуха, моторики, когнитивными особенностями. Это не просто "добрый поступок", а ключевая часть профессиональной разработки, которая расширяет аудиторию и соответствует законодательным стандартам (например, WCAG, ADA). Вот практические примеры по категориям.

Семантическая HTML-структура

Основой доступности является правильное использование HTML элементов, которые предоставляют контекст для screen readers (скринридеров).

<!-- Недоступный пример: div вместо семантических тегов -->
<div onclick="submitForm()">Отправить</div>

<!-- Доступный пример: используем button -->
<button onclick="submitForm()">Отправить</button>

Ключевые принципы:

  • Использование <button> для действий вместо <div>
  • <nav>, <main>, <aside> для обозначения областей страницы
  • Заголовки <h1>-<h6> в логическом порядке для создания "информационного каркаса"

Альтернативы для медиа-контента

Люди с нарушениями зрения или слуха зависят от текстовых описаний.

<!-- Изображение с alt -->
<img src="chart.png" alt="Диаграмма роста продаж в 2023 году: 45% увеличение">

<!-- Видео с субтитрами и аудио-описанием -->
<video controls>
  <source src="presentation.mp4" type="video/mp4">
  <track src="subtitles_en.vtt" kind="subtitles" srclang="en" label="English">
</video>

Доступные формы

Forms — критическая точка взаимодействия. Пример улучшенной формы:

<form aria-labelledby="form-title">
  <h2 id="form-title">Регистрация</h2>
  
  <!-- Поле с явной label и aria-required -->
  <div>
    <label for="email">Email адрес <span class="required">*</span></label>
    <input 
      type="email" 
      id="email" 
      name="email" 
      aria-required="true"
      aria-describedby="email-help"
    >
    <p id="email-help" class="helper-text">Мы не передаем ваш email третьим лицам</p>
  </div>
  
  <!-- Поле с live validation -->
  <div>
    <label for="password">Пароль</label>
    <input 
      type="password" 
      id="password" 
      name="password"
      aria-live="polite"
      oninput="validatePassword(this)"
    >
    <p id="password-error" role="alert" class="error-text"></p>
  </div>
  
  <!-- Группа радио-кнопок с aria-labelledby -->
  <fieldset aria-labelledby="subscription-label">
    <legend id="subscription-label">Тип подписки</legend>
    <input type="radio" id="basic" name="subscription" value="basic">
    <label for="basic">Базовая</label>
    <input type="radio" id="pro" name="subscription" value="pro">
    <label for="pro">Профессиональная</label>
  </fieldset>
</form>

ARIA (Accessible Rich Internet Applications) атрибуты

Когда семантического HTML недостаточно, ARIA дополняет информацию для assistive technologies.

// Динамически обновляемый контент (живые регионы)
function updateLiveRegion(message) {
  const liveRegion = document.getElementById('notifications');
  liveRegion.textContent = message;
  liveRegion.setAttribute('aria-live', 'assertive'); // urgent announcement
}

// Модальное окно с правильной ARIA
function openModal() {
  const modal = document.getElementById('modal');
  modal.style.display = 'block';
  modal.setAttribute('aria-modal', 'true');
  modal.setAttribute('role', 'dialog');
  modal.setAttribute('aria-labelledby', 'modal-title');
  
  // Trap focus внутри модалки
  const focusableElements = modal.querySelectorAll('button, input, [tabindex]');
  focusableElements[0].focus();
}

Управление фокусом (Focus Management)

Для пользователей с двигательными ограничениями или использующих только клавиатуру, фокус — основной инструмент.

/* Видимые стили для фокуса */
button:focus, input:focus {
  outline:拨打 3px solid #0056cc;
  outline-offset: 2px;
}

/* Не удалять outline без альтернативы! */
// Программное управление фокусом в сложных компонентах
class Dropdown {
  constructor(element) {
    this.element = element;
    this.items = element.querySelectorAll('.dropdown-item');
    this.activeIndex = 0;
  }
  
  navigateUp() {
    this.activeIndex = Math.max(0, this.activeIndex - 1);
    this.items[this.activeIndex].focus();
  }
  
  navigateDown() {
    this.activeIndex = Math.min(this.items.length - 1, this.activeIndex + 1);
    this.items[this.activeIndex].focus();
  }
}

Доступные интерактивные компоненты

Пример доступного аккордеона (collapse/expand):

<div class="accordion">
  <h3>
    <button 
      id="accordion-button-1"
      aria-expanded="false"
      aria-controls="accordion-panel-1"
    >
      Как работает доступность?
      <span aria-hidden="true"></span> <!-- Декоративный символ скрыт от скринридеров -->
    </button>
  </h3>
  <div 
    id="accordion-panel-1"
    role="region"
    aria-labelledby="accordion-button-1"
    hidden
  >
    <p>Accessibility обеспечивает равный доступ к информации...</p>
  </div>
</div>

Тестирование доступности

Примеры проверок:

  • Автоматические тесты: axe-core, Lighthouse в DevTools
// Пример интеграции axe-core в CI
const axe = require('axe-core');
const results = await axe.run(document);
if (results.violations.length) {
  console.error('A11y violations:', results.violations);
}
  • Screen reader тестирование: NVDA, JAWS, VoiceOver
  • Keyboard navigation тестирование: весь интерфейс должен работать без мыши
  • Color contrast проверки: использование инструментов like Color Contrast Analyzer

Реальные преимущества

Эти практики не только помогают пользователям с ограничениями, но и улучшают опыт для всех:

  • Лучшая SEO: семантический HTML помогает поисковым системам
  • Более надежные интерфейсы: доступные компоненты часто имеют более четкую структуру и обработку ошибок
  • Мобильные пользователи: многие техники A11y совпадают с лучшими практиками для мобильных устройств

Вывод: Accessibility — это не набор отдельных "трюков", а целостный подход к разработке, который должен быть интегрирован в процесс с самого начала: от семантического HTML до тестирования с реальными screen readers. Начинать следует с базового HTML, затем дополнять ARIA там, где необходимо, и всегда тестировать с помощью комбинации автоматических и ручных методов.