Фокус

Интерактивные элементы, включая элементы управления формами , ссылки и кнопки, по умолчанию поддерживают фокусировку и вкладку. Вкладки с вкладками являются частью последовательного порядка перемещения фокуса по документу. Остальные элементы инертны, то есть неинтерактивны. С помощью 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 атрибут?

Его невозможно будет сфокусировать.
Правильный!
Он не будет отображаться.
Попробуйте еще раз.
Если это элемент формы, он не будет отправлен.
Правильный!