Headings should have a hierarchical structure, start with an <h1>
and work down as needed.
But what happens when we don’t know the structure of the rest of the page, when we’re embedding content or inserting a component etc.
What if the heading could be relative to the rest of the page, these would still keep the role="heading"
but the aria-level
1-6 would be generated on page load.
<heading-primary>
aria-level="0"
This will apply the highest level possible (if there is no <h1>
on the page, this will act as an <h1>
if there is an <h1>
this will act as an <h2>
)
<heading-sibling>
aria-level="sibling"
this will match the aria level of the previous heading
<heading-child>
aria-level="child"
this will be 1 level lower than the previous heading (if the last heading was an <h2>
this works as an <h3>
)
<heading-parent>
aria-level="parent"
this will be 1 level higher than the previous heading (if the last heading was an <h3>
this works as an <h2>
)
So this code
<heading-primary></heading-primary>
<heading-child></heading-child>
<heading-child></heading-child>
<heading-sibling></heading-sibling>
<heading-parent></heading-parent>
<heading-sibling></heading-sibling>
<heading-child></heading-child>
Would be read as this
<h1></h1>
<h2></h2>
<h3></h3>
<h3></h3>
<h2></h2>
<h2></h2>
<h3></h3>
But if it’s loaded in a page that already has an <h1>
it would become
<h2></h2>
<h3></h3>
<h4></h4>
<h4></h4>
<h3></h3>
<h3></h3>
<h4></h4>
This is similar to the idea around effectively resetting the heading structure inside a section. Maybe that makes this suggestion redundant, but i thought I’d share anyway it and see if this sparks some ideas or interest.