Основы доступности форм
Заполнитель ! = Метка
label
label
aria-label
<!-- Неправильно: отсутствует label -->
<input type="text" placeholder="enter your email">
Правильный вариант:
<!-- Используйте label или aria-label -->
<label for="email">Enter your email</label>
<input type="text" id="email" placeholder="enter your email">
<!-- Либо -->
<input type="text" aria-label="enter your email" placeholder="enter your email">
Типы полей ввода
type
input
<!-- Неправильно: неправильно указан тип поля ввода -->
<input type="text" placeholder="enter your mobile number">
<input type="text" placeholder="enter your password">
Правильный вариант:
<!-- Используйте правильный тип input -->
<input type="tel" placeholder="enter your mobile number">
<input type="password" placeholder="enter your password">
Группировка чекбоксов и радиокнопок
fieldset
legend
<!-- Неправильно: скрин-ридеры не смогут определить заголовок группы -->
<div>
<h2>Enter your prefer meals</h2>
<input type="checkbox" for="c1">
<label id="c1">Veg</label>
<input type="checkbox" for="c2">
<label id="c2">Non-veg</label>
<input type="checkbox" for="c3">
<label id="c3">Vegan</label>
<input type="checkbox" for="c4">
<label id="c4">Fruit salad</label>
<div>
Правильный вариант:
<!-- Используйте fieldset и legend -->
<fieldset>
<legend>Enter your prefer meals</legend>
<input type="checkbox" for="c1">
<label id="c1">Veg</label>
<input type="checkbox" for="c2">
<label id="c2">Non-veg</label>
<input type="checkbox" for="c3">
<label id="c3">Vegan</label>
<input type="checkbox" for="c4">
<label id="c4">Fruit salad</label>
</fieldset>
Кнопки и ссылки
button
link
<!-- Неправильно: ссылка используется как кнопка -->
<a href="#" onClick="submitForm()">Submit</a>
Правильный вариант:
<!-- Используйте семантический тег -->
<button onClick="submitForm()">Submit</button>
ARIA-атрибуты
aria-атомарный
aria-atomic
<!-- Неправильно: скрин-ридеры не озвучат полное изменение -->
<div class="totalPrice" aria-live="polite">
<span>Total Price:</span> <h2>$ 100</h2>
</div>
Правильный вариант:
<!-- Используйте aria-atomic для полного озвучивания -->
<div class="totalPrice" aria-atomic="true" aria-live="polite">
<span>Total Price:</span> <h2>$ 100</h2>
</div>
aria-описано
aria-describedby
<!-- Неправильно: дополнительная информация не будет доступна скрин-ридерам -->
<input type="email" aria-label="Enter your email">
<p>We will use your email for marketing</p>
Правильный вариант:
<!-- Используйте aria-describedby -->
<input type="email" aria-label="Enter your email" aria-describedby="emailInfo">
<p id="emailInfo">We will use your email for marketing</p>
Обязательные поля
aria-required
<!-- Неправильно: только визуальное указание на обязательное поле -->
<label for="email">Enter your email*</label>
<input type="email" name="emailDescription">
Правильный вариант:
<!-- Используйте required для не визуальных пользователей -->
<label for="email">Enter your email*</label>
<input type="email" name="emailDescription" aria-required>
Обработка ошибок
Группировка с optgroup
optgroup
<!-- Неправильно: отсутствие группировки опций -->
<select>
<option>Chicken</option>
<option>Fish</option>
<option>Spinach</option>
<option>Onion</option>
<option>Kale</option>
<option>Meat</option>
</select>
Правильный вариант:
<!-- Используйте optgroup для группировки связанных полей -->
<select>
<optgroup label="Non-veg">
<option>Chicken</option>
<option>Fish</option>
<option>Meat</option>
</optgroup>
<optgroup label="Veg">
<option>Onion</option>
<option>Kale</option>
<option>Spinach</option>
</optgroup>
</select>
Фокус и outline
outline
:focus
/* Неправильно: не отключайте outline */
*:focus {
outline: 0;
}
Правильный вариант:
/* Опция 1: Кастомизация focus/outline */
*:focus {
border: 1px solid pink;
box-shadow: 0 0 10px pink;
outline: 0;
}
/* Опция 2: Кастомизация значения outline */
*:focus {
outline: 1px solid blue;
}