Интерактивные элементы, включая элементы управления формами , ссылки и кнопки, по умолчанию поддерживают фокусировку и вкладку. Вкладки с вкладками являются частью последовательного порядка перемещения фокуса по документу. Остальные элементы инертны, то есть неинтерактивны. С помощью HTML-атрибутов можно сделать интерактивные элементы инертными, а инертные — интерактивными.
По умолчанию порядок фокуса навигации совпадает с визуальным порядком, который задан в исходном коде. Существуют HTML-атрибуты, которые могут изменить этот порядок, и CSS-свойства, которые также могут изменить визуальный порядок контента. Изменение порядка вкладок с помощью HTML или порядка визуального отображения с помощью CSS может негативно сказаться на пользовательском опыте.
Не изменяйте воспринимаемый и фактический порядок вкладок с помощью CSS и HTML. Как показывают два следующих примера, порядок вкладок, отличающийся от визуально ожидаемого, сбивает пользователей с толку и ухудшает пользовательский опыт.
В этом примере значение атрибута tabindex
сделало порядок табуляции хаотичным:
В этом примере CSS создал расхождение между порядком табуляции и визуальным порядком содержимого:
Объявление flex-flow: row-reverse;
изменило визуальный порядок. Кроме того, к шестому слову, «This», было применено свойство CSS order , визуально сдвинув его. Последовательность табуляции — это порядок кода, который больше не соответствует визуальному порядку, создавая помехи для пользователей клавиатуры.
Сделайте инертные элементы интерактивными
Атрибуты contenteditable
и tabindex
, являясь глобальными, можно добавить к любому элементу, сделав его доступным для фокусировки. Фокусируемые элементы также можно фокусировать с помощью мыши или указателя мыши, установив атрибут autofocus
, или с помощью скрипта, например, с помощью element.focus()
.
Атрибут tabindex
Глобальный атрибут tabindex
, представленный в разделе «Атрибуты» , позволяет элементам, которые в противном случае не смогли бы получить фокус, получать его, обычно с помощью клавиши Tab , отсюда и название.
Атрибут tabindex
принимает в качестве своего значения целое число. Отрицательное значение делает элемент доступным для фокусировки, но не допускает нажатия клавиши Tab. Значение tabindex
, равное 0
, делает элемент доступным для фокусировки и нажатия клавиши Tab, добавляя элемент, к которому он применён, в последовательный порядок перемещения фокуса в исходном коде. Значение 1 или больше делает элемент доступным для фокусировки и нажатия клавиши Tab, но добавляет его в приоритетную последовательность табуляции, поэтому его следует избегать.
На этой странице кнопка «Поделиться» <share-action>
— это пользовательский элемент . Значение tabindex="0"
добавляет этот элемент, который обычно не фокусируется, в стандартный порядок табуляции клавиатуры:
<share-action authors="@front-end.social/@estellevw" data-action="click" data-category="web.dev" data-icon="share" data-label="share, mastodon" role="button" tabindex="0">
<svg aria-label="share" role="img" xmlns="http://www.w3.org/2000/svg">
<use href="#shareIcon" />
</svg>
<span>Share</span>
</share-action>
На этой странице есть еще один пользовательский элемент: локальная навигация имеет пользовательский элемент с отрицательным значением tabindex
:
<web-navigation-drawer type="standard" tabindex="-1">
Отрицательное значение атрибута tabindex
делает элемент доступным для фокусировки, но не допускающим нажатия клавиш. Элемент может получить фокус, например, с помощью HTMLElement.focus()
, но не участвует в последовательном порядке навигации с фокусировкой. Для элементов, не допускающих нажатия клавиш, но допускающих фокус, принято использовать tabindex="-1"
. Если добавить tabindex="-1"
к интерактивному элементу, он перестанет быть доступным для нажатия клавиш.
Метод element.focus()
можно использовать для установки фокуса на элементы, которые можно фокусировать. Браузеры прокручивают элементы, находящиеся в фокусе, чтобы они стали видимыми. По этой причине избегайте использования element.focus({preventScroll:true})
, поскольку фокусировка на невидимом элементе негативно сказывается на пользовательском опыте.
Если вы хотите выполнить запрос к документу, чтобы узнать, какой элемент находится в фокусе, используйте свойство Document.activeElement
, доступное только для чтения.
Элементы с tabindex
, равным 1
или больше, включаются в отдельную последовательность табуляции. Как вы заметите в Codepen, табуляция начинается с отдельной последовательности, от наименьшего значения к наибольшему, а затем проходит по элементам в обычной последовательности (без tabindex
или tabindex="0"
) в порядке исходного кода:
Положительное значение tabindex
помещает элемент в приоритетную последовательность фокусировки, что может привести к хаосу в порядке фокусировки. Избегайте изменения порядка DOM с помощью tabindex
. Изменение порядка табуляции не только может создавать неудобства для пользователей, но и затрудняет управление и поддержку со стороны разработчиков.
Атрибут contenteditable
Атрибут contenteditable
уже обсуждался ранее. Установка contenteditable="true"
для любого элемента делает его доступным для редактирования, фокусировки и включения в последовательность табуляции. Поведение фокусировки аналогично установке tabindex="0"
, но не идентично. Вложенные элементы contenteditable
могут фокусироваться, но не могут быть активны табуляцией. Чтобы сделать вложенный элемент contenteditable
активным табуляцией, добавьте tabindex="0"
, что добавит его в последовательный порядок фокусировки.
Дать autofocus
интерактивным элементам
Хотя булевский атрибут autofocus
является глобальным и может быть установлен для любого элемента, он не делает инертный элемент интерактивным. При загрузке страницы фокус устанавливается на первый элемент с атрибутами autofocus
, если этот элемент отображается и не вложен в <dialog>
.
Автоматическая установка фокуса на контент может сбивать с толку. Установка autofocus
на элементе управления формы означает, что элемент управления формы прокручивается в область просмотра при загрузке страницы. Все ваши пользователи, включая пользователей программ чтения с экрана и пользователей с небольшими областями просмотра, могут не «видеть» инструкции к форме, возможно, даже прокручивая дальше видимой метки элемента управления формы. Атрибут autofocus
не изменяет порядок последовательной навигации по фокусу в документе. Элементы в последовательности, предшествующие элементу с автофокусом, пропускаются. По этим причинам не рекомендуется включать атрибут autofocus
.
Исключением из рекомендации «не использовать autofocus
» является добавление атрибута autofocus
в элементы <dialog>
. При открытии диалогового окна браузер автоматически фокусируется на первом интерактивном элементе внутри <dialog>
, доступном для фокусировки, что означает отсутствие необходимости добавлять autofocus
к элементу. Если вы хотите быть уверены, что фокус будет на определённом интерактивном элементе в диалоговом окне при его открытии, добавьте атрибут autofocus
к этому элементу.
<dialog open>
<form method="dialog">
<button type="submit" autofocus>close</button>
</form>
</dialog>
Атрибут autofocus
, установленный для кнопки закрытия <button>
позволяет ей получать фокус при открытии диалогового окна. Будучи первым элементом диалогового окна, она бы получила фокус в любом случае. По умолчанию при открытии диалогового окна фокус получает первый фокусируемый элемент в нём, если только атрибут autofocus
не установлен для другого элемента в этом же окне.
Сделать интерактивные элементы инертными
Существуют также HTML-атрибуты, которые могут исключать интерактивные элементы из последовательности табуляции. Добавление отрицательного tabindex
к фокусируемым элементам, добавление атрибута disabled
к поддерживающим элементам формы и добавление глобального атрибута inert
к контейнеру — всё это делает элементы непереключаемыми. Эти три атрибута НЕ являются взаимозаменяемыми.
Отрицательное значение tabindex
Отрицательное значение атрибута tabindex
делает элемент доступным для фокусировки, но не для переключения с помощью табуляции. Добавление tabindex="0"
к элементу, доступному для фокусировки по умолчанию, включая ссылки, кнопки, элементы управления формами и элементы, доступные contenteditable
, не является обязательным; однако включение tabindex
с отрицательным значением исключает элементы, доступные для переключения с помощью табуляции, из последовательного порядка перемещения по фокусу.
Отрицательное значение tabindex
не позволяет пользователям с клавиатурой фокусироваться на интерактивных элементах, но не отключает сам элемент. Пользователи с указателем по-прежнему могут фокусироваться на элементе. Чтобы отключить элемент, используйте атрибут disabled
.
Неполноценный
Булевский атрибут disable делает элементы управления формы, к которым он применён, и их потомки, если таковые имеются, нефокусируемыми. Отключённые элементы управления формы не могут быть сфокусированы, не получают события нажатия и не отправляются при отправке формы.
Атрибут disabled
не является глобальным. Он применяется к <button>
, <input>
, <optgroup>
, <option>
, <select>
, <textarea>
, пользовательским элементам, связанным с формой, и <fieldset>
. При установке для <optgroup>
или <fieldset>
все дочерние элементы управления формы отключаются, за исключением содержимого первого <legend>
элемента <fieldset>
.
Те же элементы, которые поддерживают disabled
, также доступны для нацеливания с помощью псевдоклассов :disabled
и :enabled
. Элементы, отключенные с помощью атрибута disabled
, обычно оформляются светло-серым цветом в таблице стилей user-agent, даже если задан accent-color
.
Поскольку атрибут является логическим, его наличие отключает включённый элемент; его нельзя установить в false
. Чтобы снова включить отключённый элемент, атрибут необходимо удалить, обычно с помощью Element.removeAttribute('disabled')
.
Свойство HTMLInputElement.disabled
позволяет проверить, отключен ли элемент ввода. Поскольку disabled
не является глобальным атрибутом, оно не наследуется от HTMLElement, но каждый поддерживающий интерфейс элемента, например HTMLSelectElement
и HTMLTextareaElement
, имеет такое же свойство, доступное только для чтения.
Атрибут disabled
не применяется к элементам, которые обычно являются inert
и которым можно сделать фокусируемыми с помощью tabindex
или contenteditable
, а также к элементу <form>
. Чтобы отключить эти элементы, можно использовать глобальный атрибут inert
.
inert
атрибут
При добавлении к элементу глобального логического атрибута inert
этот элемент и весь вложенный в него контент становятся недоступными, то есть на них нельзя кликнуть или перейти с помощью Tab. Они также удаляются из дерева доступности. Хотя inert
можно применить к любому элементу, обычно он используется для фрагментов контента, например, закадрового или скрытого.
При применении атрибута disabled
к элементам управления формы браузер использует стили по умолчанию, которые можно задать с помощью псевдокласса :disabled
. Атрибут inert
не имеет визуальных индикаторов и не имеет соответствующего псевдокласса (хотя селектор атрибута [inert]
соответствует).
Использование inert
для видимого контента без указания стилей может привести к ухудшению пользовательского опыта. Поскольку инертный контент недоступен для пользователей программ чтения с экрана, это может привести к путанице, когда зрячие пользователи видят на экране контент, недоступный для инструментов доступности. Сделайте инертность очевидной с помощью CSS.
Убедитесь, что фокус никогда не переходит на невидимый контент. Всё, что отображается за пределами экрана и не появляется автоматически при фокусировке, следует сделать инертным . Если контент скрыт, но появляется при фокусировке, например, ссылка «Перейти к контенту» , его не нужно делать инертным.
Проверьте свое понимание
Проверьте свои знания о фокусировке.
Если элемент не может быть сфокусирован, как он описывается?
Что будет верно, если элемент имеет disabled
атрибут?