Атрибут tabindex устанавливает порядок
получения фокуса при переходе между элементами
с помощью клавиши Tab.
Нажимая эту клавишу можно активировать последовательно
некоторые элементы страницы (ссылки
и элементы форм).
Активные элементы будут получать фокус ввода.
Для полей ввода типа input и textarea фокус будет выражаться в том, что в поле
будет моргать курсор и в него можно будет
вводить текст, для
ссылок и других элементов это
будет выделение каким-то образом (подчеркивание,
обведение пунктирной границей и т.п., зависит
от браузера).
Чтобы поменять стили по умолчанию для элемента
в фокусе смотрите псевдокласс
focus.
Если в момент получения фокуса элемент не
был виден на странице (из-за прокрутки),
то страница прокрутится к этому элементу.
Если элементам не задан атрибут tabindex или он имеет значение 0, то переход
по ним клавишей Tab будет идти в порядке
следования элементов в HTML коде.
Если на странице есть элементы, которым задан tabindex, то вначале переход будет
идти по ним, начиная от меньшего значения
атрибута tabindex (самым маленьким
может быть единица) и так далее по возрастанию
значений атрибута, а когда такие элементы
закончатся — переход пойдет по тем элементам,
которым не задан tabindex или он имеет
значение 0.
Значением атрибута служат целые числа от 1 до бесконечности. Если какие-то
номера пропущены — ничего страшного не случится
(к примеру, если нет номера 2, то
сначала фокус попадет на элемент с tabindex
,
равным 1, а потом на элемент с tabindex,
равным 3).
Если на странице в момент нажатия клавиши Tab есть элемент в фокусе (фокус мог
быть получен не только нажатием Tab,
но и кликом мышкой по элементу или атрибутом autofocus),
то следующее нажатие клавиши Tab приведет
к тому, что фокус получит следующий по порядку
элемент после того, который в фокусе (к примеру,
если сейчас в фокусе элемент с tabindex3, то следующим получит фокус элемент
с tabindex 4).
Если полю ввода задан атрибут disabled,
то оно будет проигнорировано переходами через
клавишу Tab, даже если этому полю задан атрибут
tabindex.
Атрибут tabindex применяется к тегам a, input, textarea, button, select,
area.
Пример
Давайте инпутам
зададим атрибут tabindex. Понажимайте
последовательно клавишу Tab и вы увидите,
как фокус ввода будет переходить от первого
инпута к четвертому, а потом пойдет по ссылкам
с начала страницы (так как больше элементов
с заданным атрибутом tabindex нет):
HTML атрибут tabindex | назначение, значения, примеры
Атрибут tabindex — определяет позицию элемента в порядке табуляции в текущем документе.
Возможные значения: целое число в диапазоне от 0 до 32767.
Элементы, поддерживающие атрибут tabindex, и имеющие для него положительное значение, перебираются в первую очередь.
Элементы, не поддерживающие атрибут tabindex или поддерживающие его и устанавливающие значение «0», считаются текстом. Эти элементы перебираются в порядке, в котором они следуют в потоке символов.
Такое применение не соответствует спецификации HTML 4.01, но поддерживается Internet Explorer, Firefox, Opera, Chrome и не поддерживается Safari.
Элементы DOM – React
React реализует независимую от браузера систему DOM для повышения производительности и кроссбраузерной совместимости. Это позволило избавиться от некоторых шероховатостей в браузерных реализациях DOM.
В React все свойства и атрибуты DOM (включая обработчики событий) должны быть в стиле camelCase. Например, HTML-атрибут tabindex соответствует атрибуту tabIndex в React. Исключение составляют атрибуты aria-* и
data-*, которые следует писать в нижнем регистре. В частности, вы можете оставить aria-label как aria-label.
Различия в атрибутах
Есть ряд атрибутов, которые по-разному работают в React и HTML:
checked
Атрибут checked поддерживается компонентами <input> типа checkbox или radio. Он нужен для того, чтобы узнать выбран ли компонент. Это полезно для создания управляемых компонентов. defaultChecked — это неуправляемый эквивалент, который определяет, выбран ли компонент на момент первого монтирования.
className
Чтобы указать класс CSS, используйте атрибут className
. Это относится ко всем обычным элементам DOM и SVG, таким как <div>, <a> и т. д.
Если вы используете React с веб-компонентами (что встречается редко), используйте вместо этого атрибут class.
dangerouslySetInnerHTML
Свойству innerHTML в DOM браузера соответствует dangerouslySetInnerHTML в React. Как правило, вставка HTML из кода рискованна, так как можно случайно подвергнуть ваших пользователей атаке межсайтового скриптинга. Таким образом, вы можете вставить HTML непосредственно из React используя dangerouslySetInnerHTML и передать объект с ключом __html, чтобы напомнить себе, что это небезопасно. Например:
function createMarkup() {
return {__html: 'Первый · Второй'};
}
function MyComponent() {
return <div dangerouslySetInnerHTML={createMarkup()} />;
}
htmlFor
Поскольку for является зарезервированным словом JavaScript, для определения HTML-атрибута for в элементах React вместо него используйте htmlFor.
onChange
Событие onChange ведёт себя ожидаемо: событие срабатывает при изменении поля формы. Мы намеренно не используем существующее поведение браузера, потому что имя onChange плохо передаёт, что происходит на самом деле. Вместо этого, React-реализация onChange опирается на браузерное событие для обработки ввода в реальном времени.
selected
Если вы хотите отметить некоторый пункт списка <option> выделенным, задайте его значение в атрибуте value тега <select>.
Изучите «Тег select» для получения подробных инструкций.
style
Примечание
Некоторые примеры в документации используют для удобства style, но использование атрибута style для оформления элементов не рекомендуется. В большинстве случаев для ссылки на классы, определённые во внешнем CSS, следует использовать className. Атрибут style в React чаще всего используется при добавлении динамически вычисляемых стилей во время рендера. Смотрите FAQ: Стилизация и CSS.
Атрибут style принимает JavaScript-объект со свойствами в camelCase вместо CSS-строк. Такой подход повышает эффективность и защищает от XSS. Например:
Обратите внимание, что браузерные префиксы не добавляются к стилям автоматически. Для поддержки старых браузеров необходимо добавить соответствующие свойства стиля:
const divStyle = {
WebkitTransition: 'all',
msTransition: 'all'
};
function ComponentWithTransition() {
return <div style={divStyle}>Это будет работать в разных браузерах</div>;
}
Ключи стилей записываются в camelCase для обеспечения доступа к аналогичным свойствам DOM из JS (например, node.style.backgroundImage). Префиксы браузера кроме ms должны начинаться с заглавной буквы. Вот почему WebkitTransition начинается с заглавной «W».
React автоматически добавит суффикс «px» к свойствам стилей с числовым значением. Если вы хотите использовать единицы измерения, отличные от «px», укажите значение в виде строки с желаемой единицей измерения. Например:
Однако не все свойства стилей преобразуются в пиксельные строки. Некоторые из них остаются без единиц (например, zoom, order, flex). Полный список свойств без единиц измерения можно увидеть здесь.
suppressContentEditableWarning
Обычно, когда элемент с потомками помечен как contentEditable, появляется предупреждение, что он не будет работать. Данный атрибут скрывает это предупреждение. Поэтому используйте его, только если вы создаёте похожую на Draft.js библиотеку, которая управляет contentEditable вручную.
suppressHydrationWarning
Если вы используете рендеринг React на стороне сервера и клиент с сервером рендерят разный контент, то как правило, об этом выдаётся предупреждение. Однако в редких случаях очень сложно или невозможно гарантировать точное совпадение. Например, ожидается, что временные метки будут различаться на сервере и на клиенте.
Если для suppressHydrationWarning установлено значение true, React не будет предупреждать вас о несоответствиях в атрибутах и содержимом этого элемента. Он работает только на один уровень глубины и предназначен для использования в качестве запасного решения. Не злоупотребляйте этим. Вы можете прочитать больше о гидратации на странице ReactDOM.hydrate().
value
Атрибут value поддерживается компонентами <input>, <select> и <textarea>. Он устанавливает значение компонента. Это полезно для создания управляемых компонентов. defaultValue — это неуправляемый эквивалент, который устанавливает значение компонента во время первого монтирования.
Поддержка всех HTML-атрибутов
Начиная с React 16, полностью поддерживаются любые стандартные или пользовательские атрибуты DOM.
React всегда предоставлял JavaScript-ориентированный API для DOM. Поскольку компоненты React часто принимают как пользовательские, так и связанные с DOM пропсы, React использует стиль camelCase так же, как DOM API:
Вы также можете использовать пользовательские атрибуты, если они написаны в нижнем регистре.
Использование атрибута HTML tabindex и псевдокласса CSS :focus
Если вы интересуетесь обеспечением доступности веб-сайта, вам, вероятно, знакомы эти возможности. Но мы не очень много пишем об обеспечении доступности веб-сайта, хотя эта тема тоже важна. Представим, что у нас есть следующая страница с различными элементами, начинающаяся, например, с поля ввода:
Если сначала поле ввода поискового запроса в фокусе, затем используется табуляция для перемещения по элементам, то фокус переходит от поля ввода поискового запроса на первую ссылку, перескакивая через заголовок и текст, затем на вторую ссылку и так далее. Чтобы было ясно видно, что находится в фокусе, с помощью псевдокласса фокус добавлен цвет фона.
Но что делать, если необходимо, чтобы все элементы страницы могли оказаться в фокусе? Нужно добавить атрибут HTML tabindex в код HTML тому элементу, который должен оказываться в фокусе:
Теперь при использовании табуляции для перемещения по элементам все элементы будут оказываться в фокусе и выделяться цветом фона, в том числе все текстовые элементы.
Но обратите внимание, что любой из этих элементов будет оказываться в фокусе и к нему будут применяться стили для элемента в фокусе, даже если нажать на него указателем мыши.
Это значит, что можно создать что-то наподобие следующего примера. Это игра на чистом CSS под названием «Найдите котенка»:
В этом примере используется тот же способ, что и в предыдущем: изменение стилей для элемента в фокусе, но значения атрибута HTML tabindex добавлено всем вложенным блокам, так что все они могут оказаться в фокусе как при использовании табуляции, так и при нажатии указателем мыши.
Если использовать воображение и другие свойства CSS, можно создать другие интересные эффекты.
Но постарайтесь использовать этот способ только там, где он действительно нужен, как и любые другие усложнения.
Надеемся, этот способ использования атрибута HTML tabindex и псевдокласса CSS фокус показался Вам интересным, хотя он, как мы уже отмечали, вероятно, уже знаком опытным разработчикам.
Автор урока Louis Lazaris
Перевод — Дежурка
Смотрите также:
html — Как использовать tabindex для элемента с непрозрачностью, установленной на 0
У меня есть поле загрузки изображения перетаскиванием, в котором я установил для поля ввода значение непрозрачности 0, поэтому кнопка загрузки не отображается, поэтому я могу стилизовать ее в соответствии с макетом. Однако я пытаюсь решить проблемы с доступностью, заставляя запускать функцию загрузки, когда пользователь нажимает клавишу ВВОД.
Проблема, с которой я столкнулся, заключается в том, что, поскольку непрозрачность установлена на 0, когда я нажимаю на нее, она не фокусирует элемент. Я все еще могу нажать клавишу ВВОД, чтобы загрузить файл, и это работает нормально, но нет индикатора, чтобы пользователь знал, что эта опция для них есть.
Есть хороший способ исправить это?
Вот небольшой пример того, что я делаю:
HTML:
<div>
<input type="file" accept="image/*">
<p> Drop your photo here or upload a file</p>
</div>
Это должно позволить вам щелкнуть настраиваемый кружок с текстом, чтобы открыть ввод файла. Он также позволяет вам переходить к нему, и отображается визуальная подсказка, указывающая, что элемент сфокусирован.
<div>
<input type="file" accept="image/*">
<label for="inputID">Drop your photo here or upload a file</label>
</div>
2
Max Jacobson
15 Апр 2020 в 15:12
tabindex — HTML: HyperText Markup Language
Глобальный атрибут tabindex указывает, что его элемент может быть сфокусирован, и где он участвует в последовательной навигации с клавиатуры (обычно с помощью клавиши Tab , отсюда и название).
Он принимает целое число в качестве значения с разными результатами в зависимости от целочисленного значения:
Отрицательное значение (обычно tabindex = "- 1" ) означает, что элемент недоступен с помощью последовательной навигации с клавиатуры, но его можно сфокусировать с помощью JavaScript или визуально, щелкнув мышью.Чаще всего полезно создавать доступные виджеты с помощью JavaScript.
Примечание: Отрицательное значение полезно, когда у вас есть закадровый контент, который появляется при определенном событии. Пользователь не сможет сфокусировать какой-либо элемент с отрицательным tabindex с помощью клавиатуры, но сценарий может сделать это, вызвав метод focus () .
tabindex = "0" означает, что элемент должен быть доступен для фокусировки при последовательной навигации с клавиатуры после любых положительных значений tabindex и его порядок определяется исходным порядком документа.
Положительное значение . означает, что элемент должен быть доступен для фокусировки при последовательной навигации с клавиатуры, а его порядок определяется значением числа. То есть tabindex = "4" фокусируется до tabindex = "5" и tabindex = "0" , но после tabindex = "3" . Если несколько элементов имеют одно и то же положительное значение tabindex , их порядок относительно друг друга следует за их положением в источнике документа. Максимальное значение для tabindex — 32767.Если не указан, принимает значение по умолчанию 0.
Предупреждение: Избегайте использования tabindex значений больше 0. Это затрудняет навигацию и управление содержимым страницы для людей, которые полагаются на вспомогательные технологии. Вместо этого напишите документ с элементами в логической последовательности.
Если вы установите атрибут tabindex для
, то его дочерний контент нельзя будет прокручивать с помощью клавиш со стрелками, если вы также не установите tabindex для содержимого.Ознакомьтесь с этой скрипкой, чтобы понять эффекты прокрутки tabindex .
Избегайте использования атрибута tabindex в сочетании с неинтерактивным содержимым, чтобы сделать что-то, предназначенное для интерактивной фокусировки, с помощью ввода с клавиатуры. Примером этого может быть использование элемента
для описания кнопки вместо элемента .
Интерактивные компоненты, созданные с использованием неинтерактивных элементов, не перечислены в дереве специальных возможностей.Это не позволяет вспомогательным технологиям переходить к этим компонентам и манипулировать ими. Содержимое должно быть семантически описано с использованием интерактивных элементов (, , , , , и т. Д.). . Эти элементы имеют встроенные роли и состояния, которые сообщают о состоянии доступности, которой в противном случае пришлось бы управлять с помощью ARIA.
Таблицы BCD загружаются только в браузере
Как установить собственный tabindex в html
Отрицательное значение (обычно tabindex = «- 1») означает, что элемент недоступен с помощью последовательной навигации с клавиатуры, но может быть сфокусирован с помощью Javascript или визуально. Чаще всего полезно создавать доступные виджеты с помощью JavaScript. Вы можете посмотреть на приведенный ниже пример специальных возможностей Tabindex, чтобы устранить путаницу.
Отрицательное значение полезно, когда у вас есть закадровый контент, который появляется при определенном событии.Пользователь не сможет сфокусировать какой-либо элемент с отрицательным индексом табуляции с помощью клавиатуры, но сценарий может сделать это, вызвав метод focus ().
tabindex = «0» означает, что элемент должен быть доступен для фокусировки при последовательной навигации с клавиатуры, но его порядок определяется исходным порядком документа.
Положительное значение означает, что элемент должен быть доступен для фокусировки при последовательной навигации с клавиатуры, а его порядок определяется значением числа. То есть tabindex = «4» фокусируется перед tabindex = «5», но после tabindex = «3».Если несколько элементов имеют одно и то же положительное значение tabindex, их порядок относительно друг друга соответствует их положению в источнике документа. Максимальное значение tabindex — 32767. Если не указано, используется значение по умолчанию 0.
Атрибут tabindex определяет порядок табуляции элемента. Кнопка «вкладка» используется для навигации. Атрибут содержимого tabindex позволяет пользователям контролировать, должен ли элемент быть фокусируемым, должен ли он быть достижимым с использованием последовательной навигации по фокусу, и каков должен быть относительный порядок элемента для целей последовательной навигации по фокусу. Синтаксис:
element tabindex = "number"
Атрибут:
Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции HTML с Web Design for Beginners | Курс HTML .
номер : Указывает порядок «табуляции», когда клавиша табуляции используется для навигации.
Пример:
< div tabindex = «0» > < p > / GFG0005 div >
< div tabindex = «1» > < p > GFG Article 2 / div >
< div tabindex = "2" > < p > GFG Article 3 > P div >
В приведенном выше примере, когда кнопка вкладки используется для навигации по элементам, сначала будет сфокусирована Статья 1 , затем Статья 2 и Статья 3 .
Примечание: Если значение tabindex равно -1, то его нельзя будет сфокусировать. Например, ссылка ниже не будет фокусироваться при использовании клавиш табуляции для перехода. Пример:
< a href = "#" tabindex = "-1" здесь клавиша недоступна! a >
Панели навигации: Панели навигации важны для любых веб-сайтов.Это блоки, связанные со ссылками на разные страницы веб-сайтов.
Существует два типа меню навигации:
Вертикальные полосы навигации
Горизонтальные полосы навигации
Вертикальные полосы навигации: Вертикальные полосы меню отображаются друг над другом. Примеры:
Код:
< стиль >
ul {
тип список; список
маржа: 0;
заполнение: 0;
ширина: 20%;
цвет фона: белый;
положение: фиксированное;
высота: 25%;
переполнение: скрыто;
}
li a {
дисплей: блок;
цвет: # 000;
отступ: 8px 16px;
текстовое оформление: нет;
}
.hme {
background-color: # 4CB96B;
}
стиль >
< корпус >
< li > < a class = "hme" href = "#" tabindex = Главная страница a > li >
< li > < a href # = "1" > Блог a > li >
< li > < a класс = "hme" href = "#" tabindex = "4" > О нас > О нас > li >
< li > < a href = "#a" tabindex = Сша a > li >
ul >
16 корпус 75
9 Горизонтальные полосы навигации: В меню горизонтальных полос навигации одна отображается одна за другой или рядом. Примеры:
Код:
< style >
ul-
list
маржа: 0;
заполнение: 0;
цвет фона: белый;
высота: 25%;
переполнение: скрыто;
}
ли {
поплавок: левый;
}
li a {
дисплей: блок;
цвет: # 000;
отступ: 8px 16px;
текстовое оформление: нет;
}
.hme {
background-color: # 4CB96B
}
style >
< ul >
< li > < a class = ""
"" "" "" "" tabindex = "1" > Дом a > li >
<> href = "#" tabindex = "2" > Блог a > li > 9 0009
< li > < a класс = "hme" href = "#"
tabinde > О нас a > li >
< li > < a href = tabindex = "4" > Свяжитесь с нами a > li >
ul > корпус >
Доступность в Penn State | Самостоятельная проверка с помощью CSS и TABINDEX
Содержание страницы
TABINDEX = "0"
Пользователи клавиатуры и пользователи программ чтения с экрана часто используют клавишу TAB для перехода по ссылкам и элементам формы.Однако бывают случаи, когда вы хотите, чтобы клавиша TAB остановилась в другом месте на веб-странице.
При добавлении атрибута TABINDEX = 0 к любому элементу клавиша TAB принудительно останавливается в определенном месте. TABINDEX = "0" по существу работает как знак остановки без изменения порядка навигации по умолчанию. В противном случае это не меняет табуляцию.
Атрибут TABINDEX = 0 может использоваться для элементов, не являющихся формами, для имитации взаимодействия в неформах, например, в этой самопроверке, которая использует CSS, чтобы скрыть и показать ответ.
Форма самопроверки
В приведенном ниже примере мы видим, что вопрос может быть вставлен в вкладку, прежде чем непосредственно перейти к ответу. Ответ скрыт и раскрывается при наведении на него вкладки или при наведении на него указателя.
Образец самопроверки
Посмотреть код
HTML-код
Код показывает, что теги P для вопроса, варианта ответа и синего поля имеют атрибут . Синее поле закодировано как пустая ссылка с классом стиля «ответ» (т. Е.е. ).
В классе .answer цвета фона и текста устанавливаются одинаковыми.Также добавляется граница того же цвета. Он не будет отображаться как отдельный элемент, пока не изменится цвет фона.
WebAIM: специальные возможности клавиатуры - Tabindex
Вы здесь: Главная> Статьи> Специальные возможности клавиатуры> Страница 2: Tabindex
Содержание статьи
Страница 1: Доступ с клавиатуры
Текущая страница: Страница 2: Tabindex
Обзор
tabindex Атрибут
0 и -1 значений
Страница 3: Клавиша доступа
Обзор
Атрибут tabindex имеет три различных использования:
tabindex = "1" (или любое число больше 1) определяет явный порядок навигации по табуляции или клавиатуре. Этого всегда следует избегать.
tabindex = "0" позволяет элементам помимо ссылок и элементов формы получать фокус клавиатуры. Он не меняет порядок табуляции, но помещает элемент в логический поток навигации, как если бы это была ссылка / кнопка на странице.
tabindex = "- 1" позволяет вещам, помимо ссылок и элементов формы, получать «программный» фокус, то есть фокус может быть установлен на элемент с помощью сценариев.
tabindex Атрибут
tabindex атрибут 1+ явно определяет порядок навигации для фокусируемых элементов (обычно ссылок и элементов управления формы) на странице.Его также можно использовать для определения, должны ли элементы быть фокусируемыми или нет.
Важно
tabindex следует избегать значений 1+. Эти элементы получат фокус клавиатуры перед элементами без значения tabindex (или tabindex = "0" ), в результате чего порядок навигации будет отличаться от порядка визуализации и / или чтения с экрана. Вместо использования tabindex просто настройте порядок исходного кода страницы для поддержки логической навигации и порядка чтения, а затем используйте CSS для настройки визуального представления.
0 и -1 Значения
tabindex = "0" и tabindex = "- 1" имеют особое значение и обеспечивают отличную функциональность в HTML.
tabindex = "0"
Значение 0 указывает, что элемент следует разместить в порядке навигации по умолчанию. Это позволяет элементам, которые изначально не фокусируются (например,
, ,
и без href ), получать фокус клавиатуры.Ссылки и элементы управления формы лучше всего подходят почти для всех интерактивных элементов, но tabindex = "0" позволяет фокусировать другие элементы и, таким образом, потенциально может инициировать взаимодействие.
Важно
Если tabindex = "0" используется, чтобы сделать элементы доступными для фокусировки, взаимодействие с клавиатурой должно быть правильным и интуитивно понятным для этого элемента. Это означает, что элементы, представленные, например, в виде кнопок, должны реагировать как на нажатие клавиш Enter, так и на клавишу пробела. В некоторых браузерах для этого может потребоваться обнаружение нажатия клавиш с помощью сценария.Роли ARIA (например, role = "button" ) и атрибуты (например, aria-extended = "true" ) и т. Д. Часто должны использоваться для информирования пользователей программ чтения с экрана о функциях навигационного элемента.
tabindex = "- 1"
Значение tabindex = "- 1" удаляет интерактивные элементы из потока навигации по умолчанию. В большинстве случаев это нежелательно. Если добавлено к чему-то, что еще не является интерактивным, tabindex = "- 1" позволяет этому элементу получить программный фокус.Это означает, что на него можно установить фокус с помощью сценария focus () . Это может быть полезно для элементов, к которым не следует переходить напрямую с помощью клавиши Tab, но для которых необходимо установить фокус клавиатуры. Примеры включают модальное диалоговое окно, которое должно быть сфокусировано при открытии, или сообщение об ошибке отправки формы, которое должно быть немедленно сфокусировано при отправке ошибочной формы.
Значение -1 также может быть полезно в сложных виджетах и меню, в которых используются клавиши со стрелками или другие сочетания клавиш.Он может гарантировать, что только один элемент в виджете, такой как активная вкладка в группе интерактивных вкладок для панели вкладок, доступен для навигации с помощью клавиши Tab, при этом позволяя установить фокус на других компонентах в виджете.
Важно
Помните, что tabindex = "- 1" удаляет элемент из потока навигации по умолчанию. Не назначайте tabindex = "- 1" любому элементу, который должен быть доступен с клавиатуры, например ссылке или кнопке, по которой зрячие пользователи могут щелкнуть мышью.
Управление фокусом и инертный | CSS-уловки
Многие виды вспомогательных технологий используют навигацию с помощью клавиатуры для понимания содержимого экрана и выполнения действий с ним. Один из способов навигации - с помощью клавиши Tab . Возможно, вы уже знакомы с этим способом навигации, если используете его для быстрого перехода от ввода к вводу в форме, не дотрагиваясь до мыши или трекпада.
Вкладка будет переходить к интерактивным элементам в том порядке, в котором они отображаются в DOM.Это одна из причин, почему так важно, чтобы порядок вашего исходного кода соответствовал визуальной иерархии вашего дизайна.
Список интерактивных элементов с возможностью вкладок:
Якоря, когда присутствует атрибут href ,
,
и , с сопровождающей этикеткой,
,
<детали> ,
и при наличии элементов управления,
<объект> , в зависимости от того, как он используется,
любой элемент с переполнением прокрутки в Firefox,
любой элемент с примененным к нему атрибутом contenteditable и
любой элемент с примененным к нему атрибутом tabindex (подробнее об этом чуть позже).
Интерактивный элемент получает фокус, когда:
Переход к нему осуществляется с помощью клавиши Tab, ,
, на котором щелкают, после привязки, которая ссылается на другой фокусируемый элемент,
или фокус устанавливается программно с помощью element.focus () в JavaScript.
Фокусировка аналогична наведению курсора мыши на элемент в том смысле, что вы определяете то, что хотите активировать. Вот почему так важны визуально очевидные стили фокусировки.
Индикация фокуса перемещается по каркасу домашней страницы. Он начинается с логотипа, переходит к продуктам, затем к услугам, затем к карьере, блогу, контактам и заканчивается кнопкой «Узнать больше».
Управление фокусом
Управление фокусом - это практика координации того, что может и не может получать события фокусировки. Это одна из самых сложных задач в интерфейсной разработке, но она важна для обеспечения доступности веб-сайтов и веб-приложений.
Передовой опыт управления фокусом
В 99% случаев вы хотите оставить порядок фокусировки в покое. Я не могу этого особо подчеркнуть.
Focus будет работать на вас без дополнительных усилий, при условии, что вы используете элемент для кнопок, элемент привязки для ссылок, элемент для пользовательского ввода и т. Д.
Бывают редкие случаи, когда вы можете захотеть применить фокус к чему-то вне фокуса или сделать фокусируемым то, что обычно не принимает события фокусировки. Вот несколько рекомендаций о том, как это сделать доступным и интуитивно понятным способом:
✅ Do: узнать об атрибуте tabindex
tabindex позволяет сфокусировать элемент.Он принимает в качестве значения целое число. Его поведение меняется в зависимости от того, какое целое число используется.
❌ Нельзя: применять tabindex = "0" к вещам, которым он не нужен
Интерактивные элементы, которые могут получать фокус клавиатуры (например, элемент ), не нуждаются в применении к ним атрибута tabindex .
Кроме того, вам не нужно объявлять tabindex для неинтерактивных элементов, чтобы гарантировать, что они могут быть прочитаны вспомогательными технологиями (на самом деле это сбой WCAG, если нет роли и доступного имени).Это на самом деле создает неожиданные и трудные для навигации впечатления для человека, использующего вспомогательные технологии - у них есть другие ожидаемые способы чтения этого контента.
✅ Сделайте: используйте
tabindex = "- 1" для фокусировки с помощью JavaScript
tabindex = "- 1" используется для создания доступных интерактивных виджетов с помощью JavaScript.
Объявление tabindex = "- 1" сделает элемент доступным для фокусировки с помощью JavaScript или щелчка / касания. Однако он не позволит перейти к нему с помощью клавиши Tab .
❌ Нельзя: использовать положительное целое число в качестве
tabindex значение
Это серьезный антипаттерн. Использование положительного целого числа переопределит ожидаемый порядок табуляции и создаст сбивающий с толку и дезориентирующий опыт для человека, пытающегося ориентироваться в вашем контенте.
Достаточно одного экземпляра этого. Многократные заявления - настоящий кошмар. Серьезно: не делай этого.
❌ Нельзя: создавать порядок фокусировки вручную
К интерактивным элементам можно добавлять вкладки только в силу их использования.Вам не нужно устанавливать серию из атрибутов tabindex с увеличивающимися значениями для каждого интерактивного элемента в том порядке, который, по вашему мнению, должен использовать человек, просматривающий ваш сайт. Вместо этого вы позволите порядку элементов в DOM сделать это за вас.
Захват фокуса
Могут быть моменты, когда вам нужно помешать сосредоточиться на вещах. Хорошим примером этого является захват фокуса, который является действием условного ограничения событий фокуса элементом и его дочерними элементами.
Захват фокуса не следует путать с ловушками клавиатуры (иногда называемыми ловушками фокуса). Клавиатурные ловушки - это ситуации, когда кто-то, осуществляющий навигацию с помощью клавиатуры, не может выйти из виджета или компонента из-за неприятного цикла плохо написанной логики.
Практический пример того, что вы могли бы использовать для захвата фокуса, будет для модального:
Индикация фокуса перемещается по каркасу домашней страницы и открывает модальное окно для демонстрации захвата фокуса. Внутри модального окна находятся позиции табуляции для модального контейнера, кнопка воспроизведения видео, кнопка отмены, кнопка покупки и кнопка закрытия.После закрытия модального окна фокус возвращается к кнопке, запустившей модальное окно.
Почему это важно?
Сохранение фокуса в модальном окне сообщает его границы и помогает информировать о том, что является модальным, а что нет - это аналогично тому, как зрячий человек может видеть, как модальное окно «плавает» над другим содержимым веб-сайта или веб-приложения. Это важная информация, если:
У вас слабое зрение или его нет, и вы полагаетесь на объявления программы чтения с экрана, чтобы сообщить о смене режима взаимодействия.
У вас слабое зрение и увеличенный дисплей, где фокусировка за пределами модального режима может сбивать с толку и дезориентировать.
Вы перемещаетесь исключительно с помощью клавиатуры, иначе вы могли бы выйти из модального окна и потеряться на основной странице или просмотре, пытаясь вернуться в модальное окно.
Как вы это делаете?
Надежно управлять фокусом - дело непростое. Вам необходимо использовать JavaScript для:
Определите элементы-контейнеры для всех фокусируемых элементов на текущей странице или представлении.
Определите границы захваченного содержимого, включая первый и последний фокусируемый элемент.
Удалите как интерактивность, так и возможность обнаружения всего, что определено как доступное для фокусировки, что не входит в этот набор захваченного контента.
Переместить фокус на захваченное содержимое.
Прослушивание событий, которые сигнализируют об отклонении захваченного содержимого (сохранение, отмена, отклонение / нажатие клавиши Esc и т. Д.).
Отклонить область захваченного содержимого при срабатывании соответствующего события.
Восстановить ранее удаленную интерактивность.
Переместите фокус обратно на интерактивный элемент, который вызвал захваченное содержимое.
Почему мы это делаем?
Не буду врать: это все сложно и требует много времени. Тем не менее, управление фокусом и разумный, удобный порядок фокусировки - это правила доступности веб-контента. Достаточно важно, чтобы он считался частью международного юридически обязательного стандарта удобства использования.
Табулируемый и доступный для поиска
Есть небольшая хитрость, чтобы избавиться от обнаруживаемости и интерактивности.
Программы чтения с экрана
имеют режим взаимодействия, который позволяет им исследовать страницу или просматривать ее с помощью виртуального курсора. Виртуальный курсор также позволяет пользователю, использующему программу чтения с экрана, находить неинтерактивные части страницы (заголовки, списки и т. Д.). В отличие от использования Tab и стилей фокуса, виртуальный курсор доступен только людям, использующим программу чтения с экрана.
Когда вы управляете фокусом, вы можете ограничить возможность виртуального курсора обнаруживать контент. В нашем примере с модальным окном это означает предотвращение случайного «выхода» за пределы модального окна при его чтении.
Обнаруживаемость может быть подавлена с помощью разумного применения aria-hidden = "true" . Однако интерактивность немного более тонкая.
Введите
инертный
Атрибут inert - это глобальный атрибут HTML, который значительно упростит удаление, а затем восстановление способности обнаруживать и фокусировать интерактивные элементы. Вот пример того, как это будет работать:
Сохранить изменения?
Внесенные вами изменения будут потеряны, если вы их не сохраните.
<основной инертный>
Я намеренно избегаю использования элемента для модального окна из-за множества проблем с поддержкой вспомогательных технологий.
инертный был объявлен в элементе после модального подтверждения сохранения.Это означает, что весь контент, содержащийся в пределах , не может получить фокус и не может быть нажат.
Фокус ограничен внутри модального окна. Когда модальное окно отклонено, inert может быть удалено из элемента . Этот способ обработки захвата фокуса намного проще по сравнению с существующими методами.
Помните: Событие закрытия может быть вызвано двумя кнопками внутри нашего модального примера, а также нажатием Esc на клавиатуре.Некоторые модальные окна также позволяют вам закрыть модальную область, нажав кнопку мыши.
Подставка для инертного
Все последние версии Edge, Chrome и Opera поддерживают inert , если включены экспериментальные функции веб-платформы. Поддержка Firefox также скоро появится! Единственным исключением являются как настольные, так и мобильные версии Safari.
Мне бы очень хотелось, чтобы Apple реализовала встроенную поддержку для inert . Хотя полифилл доступен, у него есть нетривиальные проблемы с поддержкой для всех основных программ чтения с экрана.Не хорошо!
Кроме того, я хотел бы обратить внимание на эту заметку из README:
проекта inert polyfill.
Полифилл будет дорогим с точки зрения производительности по сравнению с собственной реализацией inert , потому что он требует изрядного обхода дерева.
«Обход дерева» означает, что JavaScript в полифилле потенциально потребует большой вычислительной мощности для работы и, следовательно, замедлит работу конечного пользователя.
Для устройств с низким энергопотреблением, таких как бюджетные смартфоны Android, старые ноутбуки и более мощные устройства, выполняющие ресурсоемкие задачи (например, запуск нескольких приложений Electron), это может означать зависание или сбой.Встроенная поддержка браузера означает, что такое поведение гораздо менее обременительно для устройства, поскольку оно имеет доступ к частям браузера, которых нет в JavaScript.
Safari
Лично я разочарован тем, что Apple не поддерживает inert . Хотя я понимаю, что добавление новых функций в браузер - невероятно сложная и трудная работа, inert кажется функцией, которую Apple поддерживала бы намного раньше.
macOS и iOS исторически имели отличную поддержку специальных возможностей, а вспомогательные технологические функции являются общей частью их маркетинговых кампаний.Поддержка inert кажется естественным продолжением миссии Apple, так как сама эта функция во многом упростит разработку доступных веб-интерфейсов.
К сожалению, Apple также скрывает, над чем она работает и когда мы можем ожидать это увидеть. Из-за этого будущее inert остается открытым вопросом.
Игалия
Igalia - компания, которая работает над функциями браузера. В настоящее время у них есть эксперимент, в котором публика может проголосовать за то, какие функции они хотели бы видеть.Обоснование этой инициативы выходит за рамки этой статьи, но вы можете прочитать об этом больше в Smashing Magazine.
Одна из возможностей, которую рассматривает Igalia, - это добавление поддержки WebKit для inert . Если вы искали способ помочь улучшить доступность в Интернете, но не знаете, с чего начать, я призываю вас пообещать. 5, 10, 25 долларов. Это не обязательно должно быть огромное количество, каждый маленький кусочек складывается.
К сожалению, inert не победил в эксперименте с открытой приоритизацией.Это означает, что мы снова не знаем, работает ли над этим Apple и когда мы можем ожидать его появления в Safari Technology Preview.
Завершение
Управление фокусом требует определенных навыков и осторожности, но это того стоит. Атрибут inert может значительно облегчить эту задачу.
Технологии, такие как inert , также представляют собой одну из самых сильных сторон веб-платформы: способность проложить коровьи тропы к эмерджентному поведению и систематизировать его во что-то простое и эффективное.
Дополнительная литература
Спасибо Адриану Роселли и Саре Хигли за их отзывы.
tabindex - это глобальный атрибут, который позволяет элементу HTML получать фокус. Ему необходимо значение нуля или отрицательное число, чтобы работать доступным способом.
Когда значение tabindex установлено равным нулю или положительным числом, к элементу можно перейти с помощью клавиши Tab на клавиатуре.Когда для него установлено отрицательное число, его элемент можно программно сфокусировать с помощью JavaScript.
Типичные ошибки
К сожалению, атрибут tabindex часто неправильно понимают и, следовательно, неправильно используют. Ниже приведены некоторые распространенные примеры использования tabindex , которые отрицательно влияют на доступность:
Использование положительного значения
tabindex
Использование tabindex со значением 1 , 2 , 3 и т. Д. .помещает элемент tabindex применяется первым в порядке табуляции на клавиатуре. Это может запутать любого, кто полагается на клавишу Tab на клавиатуре для навигации.
Установка порядка вкладок вручную
Вам не нужно вручную устанавливать порядок вкладок для каждой страницы или просмотра на веб-сайте или в веб-приложении. Мало того, что эта дополнительная, ненужная работа, которую трудно поддерживать, может отклоняться от чьего-то ожидаемого или желаемого способа навигации.Это приводит к раздражающему, сбивающему с толку и потенциально недоступному опыту.
Вместо этого используйте соответствующие интерактивные элементы ( a для ссылок, кнопку для кнопок и т. Д.) И разместите их в порядке чтения документа. Интерактивные элементы имеют уже встроенное собственное поведение браузера, которое позволяет переходить к ним с помощью вкладки Tab без необходимости объявления tabindex .
Создание фокусируемых неинтерактивных элементов
Существует миф о том, что tabindex = "0" применяется к неинтерактивным элементам (абзацам, заголовкам, спискам и т. Д.)) помогает «улучшить» доступность, предоставляя возможность человеку, использующему программу чтения с экрана, сосредоточиться на всем содержимом веб-страницы или веб-приложения. К сожалению, эта благонамеренная идея на самом деле не способствует хорошему опыту использования вспомогательных технологий.
Точно так же, как вам не нужно добавлять объявление атрибута tabindex к родным интерактивным элементам, вам также не нужно добавлять атрибут tabindex к неинтерактивным элементам, чтобы они могли работать со вспомогательными технологиями .
Причина этого в том, что у вспомогательных технологий, таких как программы чтения с экрана, есть другие ожидаемые способы навигации и использования этого контента. Из-за этого добавление атрибута tabindex к неинтерактивным элементам создает несколько проблем. Это:
Добавляет путаницу в отношении того, что является интерактивным, а что нет, особенно если вы не видите экран.
Требуется дополнительная работа для людей, использующих клавиатуру для навигации (и, в частности, людей, использующих клавиатуру, возраст которых не превышает , а не , использующих вспомогательные технологии), особенно тем, кто имеет инвалидность по управлению моторикой.
Не может объявлять имя и роль элемента, что создает дополнительную путаницу в отношении того, что это за элемент, как он должен работать и правильно ли он закодирован.
tabindex , объявленный для неинтерактивного элемента, вложенного внутри интерактивного элемента
Вам не нужно объявлять tabindex для дочернего элемента, если его родительский элемент является интерактивным. Примером этого может быть элемент span , вложенный внутри кнопки :
Наличие атрибута tabindex в этом примере кода нелогично повлияет на порядок интерактивных элементов.Это создает раздражающую и потенциально сбивающую с толку людей, использующих клавиатуру или вспомогательные технологии.
Допустимые варианты использования
tabindex
Ниже приведены некоторые из наиболее распространенных случаев, когда вам действительно необходимо использовать tabindex . В этих сценариях он делает доступным контент.
Интерактивные виджеты и диаграммы JavaScript
Объявления tabindex = "- 1" иногда можно найти в интерактивных виджетах и компонентах, которые управляют внутренним фокусом, таких как поля со списком или деревья, поскольку это позволяет JavaScript сосредоточиться на элементе через focus () метод.
Прокручиваемые контейнеры переполнения
tabindex = "0" следует применять к любому неинтерактивному элементу, к которому применено свойство CSS ’ overflow . Это позволит людям, использующим клавиатуру, перемещаться и прокручивать переполненный контент.
Вам также необходимо будет предоставить:
Ярлык, кратко описывающий содержимое, размещенное в неинтерактивном элементе. Этикетка может быть предоставлена:
Ассоциацией id / aria-labelledby , если у нее есть видимый заголовок, или
aria-label , если нет.
Способ определения семантического содержания содержимого. Это может быть обеспечено:
применимым элементом секционирования или
ролью ориентира, если контент настолько важен, что людям нужен быстрый и простой способ вернуться к нему.
Роль группы также может использоваться, если нет необходимости в быстром доступе.
Это удовлетворяет критерию 4 WCAG.1.2: Имя, роль, значение. Он позволяет людям выполнять прокрутку с помощью клавиатуры, а также указывает, почему им следует выполнять прокрутку и какой контент они могут ожидать найти внутри.
Когда нет подходящего элемента HTML
Для интерактивных элементов управления, не имеющих соответствующего элемента HTML, необходимо объявление tabindex = "0" . Примером этого может быть список, виджет, который «представляет список параметров и позволяет пользователю выбрать один или несколько из них».
Надеюсь, это предоставит достаточно информации для ответственного и доступного обращения с tabindex .