Aggiungi il bug di Chrome per aumentare la priorità dei bug
Questo è un bug in Chrome. Aggiungi una stella a questo problema per aumentare la priorità da correggere:
https://bugs.chromium.org/p/chromium/issues/detail?id=375693
Nel frattempo, ho creato questi tre esempi di Code Pen per mostrare come aggirare il problema. Sono costruiti utilizzando la griglia CSS per gli esempi, ma le stesse tecniche possono essere utilizzate per la flexbox.
Usando aria-labelledby anziché legenda
Questo è il modo più propizio per affrontare il problema. Il rovescio della medaglia è che devi occuparti della generazione di ID univoci applicati a ogni elemento legenda falso.
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>
Utilizzo di role = "group" e aria-labelledby invece di fieldset e legenda
Se hai bisogno del contenitore flessibile per essere in grado di allungare fino all'altezza di un elemento fratello e quindi passare anche questo tratto ai suoi figli, dovrai usare role="group"
invece di<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>
Creazione di una falsa legenda duplicata a scopi di styling
Questo è un modo molto più confuso per farlo. È comunque altrettanto accessibile ma non è necessario gestire gli ID quando lo si fa in questo modo. Il lato negativo principale è che ci sarà un contenuto duplicato tra l'elemento legenda reale e l'elemento legenda falso.
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 leggenda DEVE essere un diretto discendente
Quando provi per la prima volta a risolvere il problema da solo, probabilmente proverai a farlo:
<!-- DO NOT DO THIS! -->
<fieldset>
<div class="flex-container">
<legend class="flex-child">
Broken semantics legend text
</legend>
...
</div>
</fieldset>
Scoprirai che funziona, e poi probabilmente passerai senza pensarci due volte.
Il problema è che mettere un wrapper div tra il fieldset e la legenda interrompe la relazione tra i due elementi. Questo rompe la semantica di fieldset / legenda.
Così facendo, hai sconfitto in primo luogo l'intero scopo di usare fieldset / legenda.
Inoltre, non ha molto senso usare un fieldset se non si dà a quel set di campi una legenda.