Не фокусируйте div с tabindex, когда пользователь щелкнул элемент

Я добавил tabindex="0", чтобы пользователи могли переходить на вкладку div и использовать клавиатуру для взаимодействия с ним. Если щелкнуть или нажать Enter / пробел, когда он активен, появится всплывающее окно div. Стиль фокуса, который он применяет к div при нажатии на вкладку, хорош, но я заметил, что когда пользователи нажимают div, чтобы активировать его, стиль фокуса применяется и к нему в это время. Если они удерживают мышь, к ней применяется стиль фокуса.

Как я могу обеспечить визуальный фокус для этого div только тогда, когда пользователь перешел на него, но не отображать фокус, когда пользователь щелкнул по нему?

В настоящее время я снимаю фокус с помощью .blur(), когда он активирован, но все еще мигает этот стиль фокусировки, и он всегда виден, пока пользователь удерживает мышь.

Аналогичным интерфейсом, демонстрирующим желаемое поведение, является приложение Pages на iCloud.com. Вы можете использовать вкладку, чтобы сфокусировать различные значки на панели инструментов, а затем, когда вы переходите к своему имени и нажимаете клавишу возврата / пробела, появляется всплывающее окно, и фокус на вашем имени удаляется. В этот момент цвет текста имени изменится на более темно-серый. Если вы щелкнули по своему имени вместо использования клавиатуры, вы никогда не увидите фокус, примененный к вашему имени, вы увидите изменение цвета текста только при появлении всплывающего окна.


person Jordan H    schedule 19.12.2014    source источник
comment
Apple делает этот фокус с классом фокуса, который меняет фоновое изображение. Стиль: focus - это контур 0, что означает, что они подавляют стиль контура браузера и не заменяют его. Это определенно альтернатива, но она не решает вашу проблему, она обходит поведение, потому что поведение ожидаемое и не может быть исправлено.   -  person unobf    schedule 21.12.2014
comment
Спасибо @unobf, я решил заменить стиль фокуса по умолчанию на приемлемый для всех, затем я вручную размываю его, когда пользователь щелкает, чтобы закрыть всплывающее окно, чтобы удалить стиль фокуса. Но я не делаю этого, если они отклоняются с помощью сочетания клавиш (разные прослушиватели событий). Хотите обновить свой ответ, чтобы отметить это «обходное решение», которое можно сделать?   -  person Jordan H    schedule 24.12.2014
comment
когда вы говорите, что это другой обработчик, что вы имеете в виду? Если вы читаете сообщение в блоге, я добавляю комментарий ниже unobfuscated.blogspot.com/2013/05/, то вы увидите, что очень трудно отличить пользователя программы чтения с экрана от пользователя мыши. Некоторые пользователи программ чтения с экрана используют программу чтения с экрана с лупой (т. Е. Они могут использовать зрение для некоторых вещей и дополнять его голосом из программы чтения с экрана). Вы можете создавать проблемы для этих пользователей.   -  person unobf    schedule 24.12.2014
comment
У меня есть обработчик onclick и обработчик onkeydown, и они делают разные вещи по желанию.   -  person Jordan H    schedule 24.12.2014
comment
В IE программа чтения с экрана отправляет только событие щелчка, но не события клавиатуры. Кроме того, нажав правильную комбинацию клавиш, пользователь программы чтения с экрана может имитировать щелчок мыши (VO-SPACE с VoiceOver). Это исправление не рекомендуется.   -  person unobf    schedule 24.12.2014
comment
@unobf Я тестировал его с помощью мыши, клавиатуры и VoiceOver, и он отлично работает со всеми тремя.   -  person Jordan H    schedule 24.12.2014
comment
Когда вы нажимаете CTRL-OPTION-SPACE на модальном закрытии с помощью VO, есть ли в браузере контур в дополнение к контуру VO? Кроме того, вы тестировали в Windows с IE и NVDA / JAWS?   -  person unobf    schedule 25.12.2014
comment
@unobf Если вы нажмете esc, чтобы закрыть всплывающее окно, когда вы находитесь на исходной кнопке, фокус будет сохранен на кнопке, которая представила всплывающее окно, как с VoiceOver, так и со стилем фокуса CSS. Это вопрос, который вы задаете? Если вы перемещаетесь по списку, а затем нажимаете esc, ни VO, ни стиль не отображаются, несмотря на то, что кнопка все еще выбрана, не знаю, почему она не перемещает фокус. Если вы вернетесь обратно к кнопке, когда появляется всплывающее окно (я поддерживаю это), затем нажмите VO-space, он закрывает всплывающее окно, и фокус VO сохраняется, но не стиль фокуса CSS.   -  person Jordan H    schedule 30.12.2014
comment
Есть ли в самом диалоге кнопка закрытия?   -  person unobf    schedule 30.12.2014
comment
@unobf это не диалог, а скорее всплывающее меню, кнопки закрытия нет   -  person Jordan H    schedule 30.12.2014


Ответы (2)


Для элементов с фокусом вы всегда должны использовать tabindex="0" (см. Клавиатурная навигация между компонентами (Последовательность вкладок)), чтобы фокус происходил в правильном порядке DOM - в противном случае сам tabindex может привести к дополнительным проблемам с удобством использования / доступностью.

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

Одним из решений является использование outline: 0 для псевдоклассов :focus и :active, а затем использование ваших собственных фоновых изображений для представления желаемого вами внешнего вида.

Второе решение, которое следует использовать только в случае всплывающего окна, у которого нет видимой кнопки закрытия, но которое закрывается щелчком за пределами всплывающего окна или нажатием команды клавиатуры, заключается в обнаружении использования мыши, а затем размыть элемент, чтобы убрать контур фокуса.

person unobf    schedule 19.12.2014
comment
В этом случае щелчок / активация этого элемента представляет другой элемент, поэтому после того, как он был нажат / активирован, я не хочу, чтобы фокус был виден. Он должен отображать фокус вокруг элемента только тогда, когда пользователи переходят к нему, а не если они щелкают по нему, иначе пользовательский интерфейс выглядит очень странно для традиционных пользователей мыши. - person Jordan H; 20.12.2014
comment
Если при щелчке по нему вы представляете другой элемент, то для того, чтобы стать доступным, ваш фокус должен переместиться на новый видимый элемент, иначе слепой пользователь не узнает, что контент появился. - person unobf; 20.12.2014
comment
Да, это достаточно легко сделать. Но как мне предотвратить появление фокуса для тех, кто просто нажимает на элемент, в отличие от тех, кто вручную сфокусировал его с помощью клавиши табуляции? - person Jordan H; 20.12.2014
comment
Единственный способ попробовать - это попытаться обнаружить мышь и сбросить фокус, проблема в том, что это сложно сделать надежно, если не невозможно, и не испортить это для одного из пользователей клавиатуры unobfuscated.blogspot.com /2013/05/event-handlers-and-screen-readers.html. Однако, если пользователь мыши щелкает по элементу, фокус переместится на вновь появившийся элемент, тогда другой контур фокуса исчезнет, ​​так что это становится спорным вопросом. - person unobf; 20.12.2014
comment
Я добавил дополнительную информацию к вопросу, чтобы показать пример того, что я пытаюсь выполнить на другом веб-сайте, который я использую. Я никогда не хочу, чтобы фокус появлялся у тех, кто нажимает на элемент. Это определенно возможно (см. Предоставленный веб-сайт), и я предполагаю, что вам не нужно прибегать к хитрости, такой как обнаружение движения мыши, чтобы сбросить фокус. - person Jordan H; 21.12.2014

Настраиваемый элемент управления, такой как кнопка настраиваемого элемента, может использовать: focus-visible для выборочного применения индикатора фокуса только к фокусу клавиатуры.

: focus-visible - это то, что вы ищете

person Martin Borisov    schedule 11.02.2021
comment
Было бы хорошо добавить код или подробное объяснение к коду. Счастливого участия :) - person Prateek Mishra; 11.02.2021