Oznacz błąd przeglądarki Chrome, aby zwiększyć priorytet błędu
To jest błąd w Chrome. Dodaj gwiazdkę do tego problemu, aby zwiększyć priorytet, który należy naprawić:
https://bugs.chromium.org/p/chromium/issues/detail?id=375693
W międzyczasie stworzyłem te trzy przykłady pióra Code Pen, aby pokazać, jak obejść ten problem. Zostały one zbudowane za pomocą CSS Grid dla przykładów, ale te same techniki mogą być zastosowane dla Flexbox.
Używanie aria-labelledby zamiast legendy
Jest to bardziej odpowiedni sposób na rozwiązanie problemu. Minusem jest to, że musisz poradzić sobie z generowaniem unikalnych identyfikatorów stosowanych do każdego fałszywego elementu legendy.
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>
Użycie role = "group" i aria-labelledby zamiast zestawu pól i legendy
Jeśli potrzebujesz elastycznego pojemnika, aby móc rozciągnąć się na wysokość elementu rodzeństwa, a następnie przekazać ten odcinek swoim dzieciom, musisz użyć role="group"
zamiast<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>
Tworzenie fałszywej duplikaty legendy do celów stylizacji
Jest to o wiele bardziej hackerski sposób na zrobienie tego. Nadal jest tak samo dostępny, ale nie musisz zajmować się identyfikatorami, robiąc to w ten sposób. Główną wadą jest to, że między prawdziwym elementem legendy a fałszywym elementem legendy będzie zduplikowana treść.
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>
Legenda MUSI być bezpośrednio przyzwoita
Kiedy po raz pierwszy próbujesz to naprawić, prawdopodobnie spróbujesz to zrobić:
<!-- DO NOT DO THIS! -->
<fieldset>
<div class="flex-container">
<legend class="flex-child">
Broken semantics legend text
</legend>
...
</div>
</fieldset>
Odkryjesz, że to działa, a następnie prawdopodobnie przejdziesz dalej, nie zastanawiając się dłużej.
Problem polega na tym, że umieszczenie opakowania div między zestawem pól a legendą zrywa związek między dwoma elementami. To łamie semantykę zestawu pól / legend.
Robiąc to, pokonałeś cały cel używania zestawu pól / legend.
Poza tym nie ma sensu używać zestawu pól, jeśli nie nadajesz mu zestawu legend.