Veuillez suivre le bogue Chrome pour augmenter la priorité des bogues
Il s'agit d'un bogue dans Chrome. Veuillez ajouter une étoile à ce problème pour augmenter sa priorité à corriger:
https://bugs.chromium.org/p/chromium/issues/detail?id=375693
En attendant, j'ai créé ces trois exemples de stylo code pour montrer comment contourner le problème. Ils sont construits en utilisant CSS Grid pour les exemples mais les mêmes techniques peuvent être utilisées pour flexbox.
Utiliser aria-labelledby au lieu de légende
C'est la manière la plus appropriée de résoudre le problème. L'inconvénient est que vous devez gérer la génération d'ID uniques appliqués à chaque faux élément de légende.
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>
Utilisation de role = "group" et aria-labelledby au lieu de fieldset et legend
Si vous avez besoin que le conteneur flexible soit capable de s'étirer à la hauteur d'un élément frère et de passer ensuite cet étirement sur ses enfants, vous devrez utiliser à la role="group"
place de<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>
Création d'une fausse légende en double à des fins de style
C'est une façon beaucoup plus hacky de le faire. Il est toujours aussi accessible, mais vous n'avez pas à gérer les identifiants lorsque vous le faites de cette façon. Le principal inconvénient est qu'il va y avoir du contenu en double entre le véritable élément de légende et le faux élément de légende.
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>
La légende DOIT être directement décente
Lorsque vous essayez pour la première fois de résoudre ce problème vous-même, vous essayez probablement de le faire:
<!-- DO NOT DO THIS! -->
<fieldset>
<div class="flex-container">
<legend class="flex-child">
Broken semantics legend text
</legend>
...
</div>
</fieldset>
Vous découvrirez que cela fonctionne, puis vous avancerez probablement sans y réfléchir.
Le problème est que mettre un wrapper div entre le fieldset et la légende rompt la relation entre les deux éléments. Cela rompt la sémantique de fieldset / legend.
Donc, en faisant cela, vous avez déjoué tout le but d'utiliser fieldset / legend en premier lieu.
En outre, il est inutile d'utiliser un jeu de champs si vous ne donnez pas à ce jeu de champs une légende.