Marque o bug do Chrome com estrela para aumentar a prioridade do bug
Este é um erro no Chrome. Adicione uma estrela a esse problema para aumentar sua prioridade a ser corrigida:
https://bugs.chromium.org/p/chromium/issues/detail?id=375693
Nesse meio tempo, criei esses três exemplos de Code Pen para mostrar como solucionar o problema. Eles são criados usando CSS Grid para os exemplos, mas as mesmas técnicas podem ser usadas para o flexbox.
Usando ária-labelledby em vez de legenda
Essa é a maneira mais adequada de lidar com o problema. A desvantagem é que você precisa lidar com a geração de IDs exclusivos aplicados a todos os elementos de legenda falsos.
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>
Usando role = "group" e ária-labelledby em vez de fieldset e legend
Se você precisar que o contêiner flexível possa se esticar até a altura de um elemento irmão e também passá-lo para seus filhos, será necessário usar em role="group"
vez 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>
Criando uma legenda duplicada falsa para fins de estilo
Esta é uma maneira muito mais hacky de fazer isso. Ainda é tão acessível, mas você não precisa lidar com IDs ao fazê-lo dessa maneira. A principal desvantagem é que haverá conteúdo duplicado entre o elemento de legenda real e o elemento de legenda falsa.
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>
A legenda DEVE ser um decendente direto
Quando você estiver tentando consertar isso sozinho, provavelmente tentará fazer o seguinte:
<!-- DO NOT DO THIS! -->
<fieldset>
<div class="flex-container">
<legend class="flex-child">
Broken semantics legend text
</legend>
...
</div>
</fieldset>
Você descobrirá que funciona e provavelmente seguirá em frente sem pensar duas vezes.
O problema é que colocar um invólucro div entre o conjunto de campos e a legenda interrompe o relacionamento entre os dois elementos. Isso quebra a semântica do fieldset / legenda.
Então, ao fazer isso, você derrotou todo o propósito de usar fieldset / legend em primeiro lugar.
Além disso, não faz muito sentido usar um conjunto de campos se você não der uma legenda a esse conjunto de campos.