Приложение №1. Авторизовываюсь. Ввел пароль. Хочу посмотреть его. Жму Таб, чтобы попасть на кнопку "Показать пароль". Приложение пропускает ее и перемещает меня к чекбоксу
Другой пример. Приложение №2. Авторизовываюсь. Ввел пароль. Хочу посмотреть его. Жму Таб, чтобы попасть на кнопку "Показать пароль". Круто! Я на кнопке.
Другой пример. Приложение №2. Авторизовываюсь. Ввел пароль. Хочу посмотреть его. Жму Таб, чтобы попасть на кнопку "Показать пароль". Круто! Я на кнопке.
<a href="#"> — это бич
Кто-то сделал так
Я предлагаю делать так
Ссылка с хэшем в href выглядит как кнопка. Но если открыть контекстное меню, мы увидим "Открыть ссылку в новой вкладке". В конце концов, это ссылка или кнопка? Элемент <button> положит конец сомнениям.
Кто-то сделал так
<a href="#0">Показать мой заказ</a>
<!-- или -->
<a href="#">Показать мой заказ</a>
Я предлагаю делать так
<button type="button">Показать мой заказ</button>
Ссылка с хэшем в href выглядит как кнопка. Но если открыть контекстное меню, мы увидим "Открыть ссылку в новой вкладке". В конце концов, это ссылка или кнопка? Элемент <button> положит конец сомнениям.
Дублированный текст в aria-label бесполезен
Кто-то сделал так
Я предлагаю делать так
Будьте внимательны при написании текста для aria-label. Текст "Основная навигация" будет читаться как "Основная навигация, навигация". Это только загромождает озвучку. Текст "Основная" лучше.
Кто-то сделал так
<nav aria-label="Основная навигация">
<!-- элементы основной навигации -->
</nav>
Я предлагаю делать так
<nav aria-label="Основная">
<!-- элементы основной навигации -->
</nav>
Будьте внимательны при написании текста для aria-label. Текст "Основная навигация" будет читаться как "Основная навигация, навигация". Это только загромождает озвучку. Текст "Основная" лучше.
Приложение №1. Я в поле поиска книг. Ввел поисковой запрос. Ниже выпадающий список предложенных вариантов. Жму Эскейп. Ну вот, приложение игнорирует меня.
Другой пример. Приложение №2. Я в поле поиска товаров. Ввел поисковой запрос. Ниже выпадающий список предложенных вариантов. Жму Эскейп. Опа. Приложение закрыло список. Я могу лазить по приложению дальше.
Другой пример. Приложение №2. Я в поле поиска товаров. Ввел поисковой запрос. Ниже выпадающий список предложенных вариантов. Жму Эскейп. Опа. Приложение закрыло список. Я могу лазить по приложению дальше.
Будьте осторожны с атрибутами minlength и maxlength
Кто-то сделал так
Я предлагаю делать так
Не используйте атрибуты minlength и maxlength для текстовых полей имени и фамилии. Вы никогда не угадаете их длину, а моя знакомая не может ввести свою фамилию "Михайличенкова-Павлюченкова"...
Кто-то сделал так
<label for="sname">Фамилия</label>
<input type="text" minlength="3" maxlength="25" id="sname">
Я предлагаю делать так
<label for="sname">Фамилия</label>
<input type="text" id="sname">
Не используйте атрибуты minlength и maxlength для текстовых полей имени и фамилии. Вы никогда не угадаете их длину, а моя знакомая не может ввести свою фамилию "Михайличенкова-Павлюченкова"...
Знаете ли вы, что есть дополнительный платный контент?
Anonymous Poll
38%
Да
50%
Нет. В первый слышу
0%
Я тебе еще должен платить?
13%
Опросы в топку
Приложение №1. Я в поле поиска товаров. Ввел поисковой запрос. Ниже выпадающий список предложенных вариантов. Жму клавишу со стрелкой вниз. Да что же такое! Приложение игнорирует меня.
Другой пример. Приложение №2. Я в поле поиска товаров. Ввел поисковой запрос. Ниже выпадающий список предложенных вариантов. Жму клавишу со стрелкой вниз. О, я перешел к первому элементу в списке. Могу и дальше пойти, и выбрать кроссовки.
Другой пример. Приложение №2. Я в поле поиска товаров. Ввел поисковой запрос. Ниже выпадающий список предложенных вариантов. Жму клавишу со стрелкой вниз. О, я перешел к первому элементу в списке. Могу и дальше пойти, и выбрать кроссовки.
nav без aria-label — это плохой паттерн
Кто-то сделал так
Я предлагаю делать так
Пользователи скринридеров не смогут найти, где находится основная навигация, если мы им об этом не скажем. А aria-label поможет нам в этом!
Кто-то сделал так
<nav>
<!-- здесь элементы основной навигации -->
</nav>
Я предлагаю делать так
<nav aria-label="Главная">
<!-- здесь элементы основной навигации -->
</nav>
Пользователи скринридеров не смогут найти, где находится основная навигация, если мы им об этом не скажем. А aria-label поможет нам в этом!
Приложение №1. Хочу купить Кроксы. Открыл галерею фоток. Нажимаю на клавишу со стрелкой вправо на клавиатуре. Никакой реакции. Жму еще раз. Нифига. Приложение игнорит меня.
Другой пример. Приложение №2. Хочу купить телефон и открыл галерею фоток Редми. Нажимаю на клавишу со стрелкой вправо на клавиатуре. О, теперь могу рассмотреть фото передней части. Жму еще раз. Теперь могу рассмотреть фото задней части.
Другой пример. Приложение №2. Хочу купить телефон и открыл галерею фоток Редми. Нажимаю на клавишу со стрелкой вправо на клавиатуре. О, теперь могу рассмотреть фото передней части. Жму еще раз. Теперь могу рассмотреть фото задней части.
Выбросите атрибут <input type="tel">
Кто-то сделал так
Я предлагаю делать так
Ожидаете ли вы появления символов * или # при вводе даты рождения? Я нет. По этой причине input type="tel" не подходит для ввода цифр, за исключением ввода номера телефона.
Лаконичные клавиатуры с цифрами с помощью inputmode="numeric" лучше!
Кто-то сделал так
<label for="bd">Дата рождения</label>
<input id="bd" type="tel">
Я предлагаю делать так
<label for="bd">Дата рождения</label>
<input id="bd" inputmode="numeric">
Ожидаете ли вы появления символов * или # при вводе даты рождения? Я нет. По этой причине input type="tel" не подходит для ввода цифр, за исключением ввода номера телефона.
Лаконичные клавиатуры с цифрами с помощью inputmode="numeric" лучше!
Приложение №1. Ввел код для авторизации. Последняя цифра неправильная. Надо ее удалить. Жму клавишу. Прекрасно, удален весь код.
Другой пример. Приложение №2. Ввел код для авторизации. Последняя цифра неправильная. Надо ее удалить. Жму клавишу. Последняя цифра удалена. Остальная часть кода сохранена.
Другой пример. Приложение №2. Ввел код для авторизации. Последняя цифра неправильная. Надо ее удалить. Жму клавишу. Последняя цифра удалена. Остальная часть кода сохранена.
img без alt — это головная боль
Кто-то сделал так
Я предлагаю делать так
Не знаете, какой текст написать для атрибута alt? Лучше оставьте его пустым. Если вы вообще не добавите атрибут, то скринридеры озвучат src. Пользователи услышат: "mediastore/nn-banner, графика". Вам это нужно?
Кто-то сделал так
<img src="mediastore/nn-banner.webp">
Я предлагаю делать так
<img src="mediastore/nn-banner.webp" alt="">
Не знаете, какой текст написать для атрибута alt? Лучше оставьте его пустым. Если вы вообще не добавите атрибут, то скринридеры озвучат src. Пользователи услышат: "mediastore/nn-banner, графика". Вам это нужно?
Приложение №1. Я нахожусь в списке городов на пункте Палермо Мне нужно вернуться к первому элементу списка — городу Париж. Жму клавишу Home. Еще раз. Еще раз. Ничего не выходит.
Другой пример. Приложение №2. Я нахожусь в списке сезонов на пункте 1980-81. Мне нужно вернуться к первому элементу списка — сезон 2023-24. Жму клавишу Home. О, я перешел! Осталось нажать Энтер и сезон будет выбран.
Другой пример. Приложение №2. Я нахожусь в списке сезонов на пункте 1980-81. Мне нужно вернуться к первому элементу списка — сезон 2023-24. Жму клавишу Home. О, я перешел! Осталось нажать Энтер и сезон будет выбран.
Символ * для полей — это визуальный паттерн
Кто-то сделал так
Я предлагаю делать так
Звездочка сбивает с толку многих пользователей скринридера. Они не знают, что это такое. Как им помочь? Следует использовать aria-hidden, чтобы скрыть этот символ.
Кто-то сделал так
<label for="email">
Ваш email
<span>*</span>
</label>
Я предлагаю делать так
<label for="email">
Ваш email
<span aria-hidden="true">*</span>
</label>
Звездочка сбивает с толку многих пользователей скринридера. Они не знают, что это такое. Как им помочь? Следует использовать aria-hidden, чтобы скрыть этот символ.
