Aaron Dining Chair product page at Pottery Barn (Overview / Responsibly Made / Dimensions & Care / Shipping & Returns accordion on right side of page)
Some examples of exclusive accordions where exactly one item is always open (discussed below as an exact-exclusive accordion, which requires some additional code in addition to the proposed markup):
Developers regularly use exclusive accordions on the Web. Today, that generally means that they build their own widget rather than using a widget provided by the platform, because there is no such widget.
This proposal is suggesting that we add features for exclusive accordions to the platform. Doing so would help users because it would make (or at least would enable making) the user experience more consistent, and generally better, in a number of areas:
Reducing the need for developers to build their own widgets should also reduce the size of pages that use such widgets, which reduces the time and bandwidth needed for users to load those pages.
I propose to add an attribute to the details
element. All details
elements in the same tree that have the same value for this attribute would form an exclusive accordion. The syntax of this attribute and the rules for matching its values would match the name
attribute and its use in defining radio button groups.
When these attributes are used to form a group, it means that any user action or API that causes one of the details
elements in the group to open causes all other elements in the group to close.
There are many options for naming this attribute, and they differ as to how well they:
Choices for its name also differ as to whether they’re already used for other things in HTML. (This could be either an advantage or a disadvantage.) In particular, name
is used for grouping related form controls.
Some possibilities for the attribute’s name are name
, group
, or exclusive
.
Proposed solution: Use name
, since it’s consistent with existing features.
open
attributeSection titled Interaction%20with%20open%20attributeShould this grouping cause the insertion of a details
element with the open
attribute already set to have the open
attribute removed if it would violate the grouping constraint? If so, is such attribute removal on insertion acceptable (both for its complexity and for conformance with architectural principles)? If not, is it ok that we allow developers a loophole to violate the exclusivity semantics?
(This applies both to insertion by the parser and insertion through other methods like setting innerHTML
.)
Proposed solution: Enforce exclusivity only for user interactions, use of the open
IDL attribute, or setting the open
attribute via setAttribute
(or setAttributeNS
, setAttributeNode
, or setAttributeNodeNS
). Do not enforce exclusivity when the open
attribute is set by the parser, when it is set as a result of cloning a node, or when an element is moved to a new document. Do not enforce exclusivity for elements whose root is not a Document or a ShadowRoot.
For many accordions, it is desirable for the print layout of the page to have all items opened. This is currently not possible to do from a style sheet, but it probably should be possible, and it’s possible that it should be the default. The presence of exclusive accordion semantics make this more difficult, because of the rule that only one item can be open. (However, some of the time it will make more sense to print what is on the screen rather than printing all of the content. It’s also not clear to me how often distinguishing between these cases should be a developer decision or should be based on a user decision.)
In theory this could be addressed with a model where details elements were implemented on top of developer-exposed CSS Toggles, and developers could disable the effects of those CSS Toggles when printing. Or, more generally, this could be addressed with a solution that treats things like accordions and tabs as possible interactive presentations of markup that is semantically headings and sections, and allows the use of CSS (or some other mechanism tied to media queries) to choose between them. However, this would be a relatively major change, worthy of its own explainer. It also has many of the same problems as CSS Toggles (see below).
It’s also possible that developers could do this in JavaScript, specifically for printing, but then it certainly wouldn’t be a default and probably wouldn’t be done often.
We should find and consider alternative approaches for addressing this issue.
Proposed solution: For now, do nothing here. If developers want all of the details
elements on a page to print open, they need to change both name
and open
attributes during the beforeprint
and afterprint
events.
details
Section titled Existing%20issues%20with%20detailsThere are some existing issues with details
elements that may need to be resolved before details
elements can be used in a way that fulfills the goals of this proposal.
First, there are issues related to interactive content in the summary
element causing various keyboard and accessibility issues. See https://github.com/whatwg/html/issues/2272 (and its links, which include browser bugs) for details. There are also some related questions about selection in summary
as discussed in https://github.com/whatwg/html/issues/3191 and https://github.com/whatwg/html/issues/8707 .
Second, there are some questions about the relationship between headings and summary
elements. See https://github.com/whatwg/html/issues/8864 . (This is not surprising since the accordion pattern is one possible interactive presentation of markup that is semantically pairs of headings and sections.)
Further reading:
Some accordions (such as the one on the Pixel product page above) always have exactly one item open, and do not allow zero items to be open. (This could be called an exact-exclusive accordion.) This is a somewhat more complicated widget, because the open/close control disappears from the item that is open or becomes disabled. It’s not clear how such widgets could be modeled with this design, other than by ensuring that developer Javascript to handle this.
Proposed solution: For now, do not attempt to address this pattern directly, but make sure it’s possible to do in Javascript.
It’s possible that the presence of a group should change the ARIA roles for the details
or its summary
or change their default keyboard behavior.
If this is the case, it seems likely that such changes may also be desirable for non-exclusive accordions (see next question).
Based on the discussion on 2023 April 27, it seems like at least default keyboard behavior for accordions is undesirable because it leads to bad user experience particularly for users on small or highly-zoomed displays (where the content of a single item is less likely to fit within the display).
This design assumes that there isn’t a use case for the semantic of a non-exclusive accordion, since a non-exclusive accordion is largely indistinguishable from a sequence of disclosures (details
elements).
However, it’s possible there may be value in establishing such a semantic connection between the details
elements in a non-exclusive accordion. (See previous question for one possible reason.)
If such connection is valuable, then that would favor a design that separates the ideas of connecting the details
elements into a group and making the group exclusive.
In the discussion on 2023 April 27, no use cases for a platform feature for connecting a non-exclusive accordion were raised (assuming the conclusion to the keyboard behavior issue above stays as-is).
Should the name be scoped to something smaller than the document (for example, only to siblings) or to something larger than the document (such as the flat tree)?
I think scoping only to siblings would be problematic because there are valid use cases for putting each details
element into some sort of sectioning markup, and that scoping on the flat tree would be problematic because having names cross shadow root boundaries would break encapsulation.
The CSS Toggles proposal is a much more complex proposal that would be able to describe exclusive accordions and many other things. However, it has a number of issues related to developer experience, accessibility, and other things, and it’s not clear whether the proposal is viable.
The proposal for a toggle (expand/collapse) feature probably falls somewhere between this proposal and CSS Toggles in terms of how general it is. It may be a reasonable alternative to this proposal, or it may be reasonable to do both.
I think it’s possible that there’s a risk that this proposal becomes a more general feature than currently intended, which would have both some of the advantages and some of the problems that CSS Toggles have.
It’s likely worth exploring this alternative further, particularly to understand what integration with CSS and JavaScript it would have, and how that integration would affect its use.
Within Open-UI there was another proposal which was to be called panelset. Earlier it was called “spicy sections” in order to avoid bikeshedding or misconceptions that it was yet ready to be thought of as a proposal. The distinguishing characteristic of that proposal is that introduced the idea that certain ‘widgets’ had more in common with scrollbars than they do inputs. That is, they are often reasonable choices of design particular to the media or situation. Panelsets proposed the introduction of other affordances to handle (in document, see also 559) tabs and accordions. Thus, it is less general than CSS Toggles, but more general than all the others mentioned here.)
The panelset proposal has enough open questions that it’s a bit hard to assess.
At the same time, this proposal and panelset address problem spaces that, while intersecting, are different enough that it would still be reasonable to do both if we conclude that both are good.