Bitte markieren Sie den Chrome-Fehler, um die Fehlerpriorität zu erhöhen
Dies ist ein Fehler in Chrome. Bitte fügen Sie diesem Problem einen Stern hinzu, um die zu behebende Priorität zu erhöhen:
https://bugs.chromium.org/p/chromium/issues/detail?id=375693
In der Zwischenzeit habe ich diese drei Code Pen-Beispiele erstellt, um zu zeigen, wie das Problem umgangen werden kann. Sie werden für die Beispiele mit CSS Grid erstellt, aber für Flexbox können dieselben Techniken verwendet werden.
Verwenden von Aria-Labelledby anstelle von Legende
Dies ist der bessere Weg, um mit dem Problem umzugehen. Der Nachteil ist, dass Sie sich mit der Generierung eindeutiger IDs befassen müssen, die auf jedes gefälschte Legendenelement angewendet werden.
https://codepen.io/daniel-tonon/pen/vaaGzZ
<style>
.flex-container {
display: flex;
}
</style>
<fieldset aria-labelledby="fake-legend">
<div class="flex-container">
<div class="flex-child" id="fake-legend">
I am as good accessibilty wise as a real legend
</div>
...
</div>
</fieldset>
Verwenden Sie role = "group" und aria-labelledby anstelle von fieldset und legend
Wenn Sie den Flex-Container benötigen, um sich auf die Höhe eines Geschwisterelements dehnen zu können, und diese Dehnung dann auch an seine Kinder weitergeben, müssen Sie role="group"
stattdessen verwenden<fieldset>
https://codepen.io/daniel-tonon/pen/BayRjGz
<style>
.flex-container {
display: flex;
}
</style>
<div role="group" class="flex-container" aria-labelledby="fake-legend">
<div class="flex-child" id="fake-legend">
I am as good accessibilty wise as a real legend
</div>
...
</div>
Erstellen einer gefälschten doppelten Legende für Stylingzwecke
Dies ist ein weitaus hackigerer Weg, dies zu tun. Es ist immer noch genauso zugänglich, aber Sie müssen sich auf diese Weise nicht mit IDs befassen. Der Hauptnachteil ist, dass zwischen dem realen Legendenelement und dem gefälschten Legendenelement doppelter Inhalt vorhanden sein wird.
https://codepen.io/daniel-tonon/pen/zLLqjY
<style>
.screen-reader-only {
position: absolute;
opacity: 0;
pointer-events: none;
}
.flex-container {
display: flex;
}
</style>
<fieldset>
<legend class="screen-reader-only">
I am a real screen-reader accessible legend element
</legend>
<div class="flex-container">
<div class="flex-child" aria-hidden="true">
I am a fake legend purely for styling purposes
</div>
...
</div>
</fieldset>
Die Legende MUSS ein direkter Nachkomme sein
Wenn Sie zum ersten Mal versuchen, dies selbst zu beheben, werden Sie wahrscheinlich Folgendes versuchen:
<!-- DO NOT DO THIS! -->
<fieldset>
<div class="flex-container">
<legend class="flex-child">
Broken semantics legend text
</legend>
...
</div>
</fieldset>
Sie werden feststellen, dass es funktioniert, und dann werden Sie wahrscheinlich weitermachen, ohne darüber nachzudenken.
Das Problem besteht darin, dass durch das Einfügen eines Div-Wrappers zwischen dem Feldsatz und der Legende die Beziehung zwischen den beiden Elementen unterbrochen wird. Dies bricht die Semantik von Feldmenge / Legende.
Auf diese Weise haben Sie den gesamten Zweck der Verwendung von Feldsatz / Legende besiegt.
Es macht auch nicht viel Sinn, ein Feldset zu verwenden, wenn Sie diesem Feldset keine Legende geben.