-
Notifications
You must be signed in to change notification settings - Fork 27
HTML Popover Attribute A11y Proposal (manual and auto)
Table of Contents
- Summary
- Important considerations
- Heuristics over explicit semantics
- Triggers, anchoring and reading order
- Manual popups
- Auto popups
This document describes accessibility solutions for the proposed popover API (popover attribute).
Please read the popup Popover API Explainer before reading or commenting on this document.
Additional links:
Chromestatus
Demo
More demos from Scott O'Hara
A11y issues in GH
- The popover API is currently incomplete:
- The attributes to trigger popups automatically from user input (popovertoggletarget or popovershowtarget) are currently only supported on button elements, but this support is expected to expand in later versions, e.g., to text inputs. When it does, we will need to make adjustments to keyboard behaviors such as ensuring that triggering elements are in the tab order.
- Hint popovers and popoverhovertarget have been deferred in the interests of shipping something useful sooner. However, once they are added, they will bring their own a11y considerations.
- This discussion requires adding the concept of a minimum role to HTML-AAM. A minimum role assures that an element won't be exposed as a "generic", which blends in with the page. This concept is important for other discussions on how to expose generic elements when they’ve been given properties important to accessibility. E.g.,
tabindex
,contenteditable
, and possibly in regards to naming.
There are currently 2 types of popovers: manual and auto. These values are not semantic, but produce behaviors that look and behave like common patterns. Therefore, the approach taken here is to use heuristics to build accessibility around the most likely pattern and allow the author to modify from there.
Semantic HTML elements may be specified in the future that encapsulate various popup behaviors, e.g., <tooltip> or <notification>. The proposed <selectmenu> is also being implemented using popup behaviors.
A popover can be associated with a triggering button via the popovertoggletarget or popovershowtarget attribute (pointing from the trigger to the popup).
- A triggering element that can open the popover should automatically support the equivalent of the
aria-expanded
property. The value should be true if an associated popover is open. - Note that the
aria-haspopup
equivalent property is not exposed, because it would be redundant, and provides less useful information thanaria-expanded
. See also: https://github.com/w3c/aria/issues/1024
Manual popovers are elements that show up in the top layer and are controlled by the page. The main use cases we know of are a toast / notification, and persistently visible content such as modeless dialogs that need to overlay other content.
-
Minimum role of
group
, to prevent the contents from blending into the rest of the page. TBD: develop alternate platform mechanisms in each platform API for exposing the fact that an element is a manual popover, e.g., object attributeispopover:true
. This would be helpful in cases where the popover already has its own strong role. - Announcements for new popovers:
- When focus goes inside the popover, there is no need for an additional announcement of the popover, as moving focus there is enough.
- Else, when triggered by page load, default to not announcing the popover, or include in initial page load summary (e.g., this page has 5 headings, 4 landmarks and 3 popovers).
- Else, announce the popover with at minimum the title of the popover. If the verbosity indicates instructions to be read, the AT should inform the user that, for instance, F6 will navigate to the popover (Ctrl+F6 on Mac).
-
NOTE: author guidance would be necessary to indicate what
popover=manual
should be used on. For example, apopover=manual
may be used on a<dialog>
element, arole=region/article
, or possibly even a generic<div>
(thus ideally being exposed as arole=group
).
-
NOTE: author guidance would be necessary to indicate what
- F6 (Ctrl+F6 on Mac) cycles to these, with the most recent popover first.
- Escape does not automatically close, just as light dismiss is not automatically supported (use
popover=auto
for this behavior).
Auto popovers can exist only 1 at a time. They are automatically dismissed if another auto popover is shown, or if the user navigates away.
- Similar to manual popovers, use a minimum role of
group
, to prevent the contents from blending into the rest of the page. - Would commonly be expected to be used on elements with roles that are current token values for
aria-haspopup
. Can be used with other roles as well, such as range slider popover invoked by a volume button.
- Tab order repair: all of the tab stops inside of the popover should be inserted after the triggering element, and before what the original tab stop after the trigger.
- Escape key dismisses, even if the auto popup does not currently have focus.