Beri bintang pada bug Chrome untuk meningkatkan prioritas bug
Ini adalah bug di Chrome. Harap tambahkan bintang pada masalah ini untuk meningkatkan prioritasnya untuk diperbaiki:
https://bugs.chromium.org/p/chromium/issues/detail?id=375693
Sementara itu, saya membuat tiga contoh Pena Kode ini untuk menunjukkan cara mengatasi masalah ini. Mereka dibuat menggunakan CSS Grid untuk contoh tetapi teknik yang sama dapat digunakan untuk flexbox.
Menggunakan aria-labelled oleh bukan legenda
Ini adalah cara yang lebih tepat untuk mengatasi masalah tersebut. Kelemahannya adalah Anda harus berurusan dengan menghasilkan ID unik yang diterapkan untuk setiap elemen legenda palsu.
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>
Menggunakan role = "group" dan aria-labelled oleh bukannya fieldset dan legenda
Jika Anda membutuhkan wadah fleksibel untuk dapat meregangkan hingga setinggi elemen saudara dan kemudian juga merentangkannya ke anak-anaknya, Anda harus menggunakan role="group"
alih-alih<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>
Membuat legenda duplikat palsu untuk keperluan penataan
Ini adalah cara yang jauh lebih sulit untuk melakukannya. Itu masih dapat diakses tetapi Anda tidak harus berurusan dengan ID ketika melakukannya dengan cara ini. Sisi bawah utama adalah bahwa akan ada duplikat konten antara elemen legenda nyata dan elemen legenda palsu.
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 HARUS menjadi keturunan langsung
Ketika Anda pertama kali mencoba untuk memperbaiki ini sendiri, Anda mungkin akan mencoba melakukan ini:
<!-- DO NOT DO THIS! -->
<fieldset>
<div class="flex-container">
<legend class="flex-child">
Broken semantics legend text
</legend>
...
</div>
</fieldset>
Anda akan menemukan bahwa itu berfungsi, dan kemudian Anda mungkin akan melanjutkan tanpa memikirkannya lagi.
Masalahnya adalah bahwa menempatkan pembungkus div antara fieldset dan legenda memutus hubungan antara dua elemen. Ini mematahkan semantik fieldset / legenda.
Jadi dengan melakukan ini, Anda telah mengalahkan seluruh tujuan menggunakan fieldset / legenda di tempat pertama.
Selain itu, tidak ada gunanya menggunakan fieldset jika Anda tidak memberikan legenda tersebut.