Пожалуйста, пометьте ошибку Chrome, чтобы увеличить приоритет ошибки
Это ошибка в Chrome. Пожалуйста, добавьте звездочку к этой проблеме, чтобы повысить ее приоритетность:
https://bugs.chromium.org/p/chromium/issues/detail?id=375693
Тем временем я создал эти три примера Code Pen, чтобы показать, как обойти эту проблему. Они построены с использованием CSS Grid для примеров, но те же методы могут быть использованы для flexbox.
Использование aria-labelledby вместо легенды
Это более правильный способ решения проблемы. Недостатком является то, что вам приходится иметь дело с созданием уникальных идентификаторов, применяемых к каждому поддельному элементу легенды.
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>
Использование role = "group" и aria-labelledby вместо fieldset и legend
Если вам нужен flex-контейнер, чтобы иметь возможность растягиваться на высоту элемента-брата, а затем передавать его на дочерние элементы, вам нужно будет использовать role="group"
вместо<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>
Создание фальшивой дублирующей легенды для стилизации
Это гораздо более хакерский способ сделать это. Это все еще так же доступно, но вам не нужно иметь дело с идентификаторами при этом. Основным недостатком является то, что между элементом настоящей легенды и элементом поддельной легенды будет дублироваться контент.
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>
Легенда ДОЛЖНА быть прямым потомком
Когда вы впервые пытаетесь исправить это самостоятельно, вы, вероятно, попытаетесь сделать это:
<!-- DO NOT DO THIS! -->
<fieldset>
<div class="flex-container">
<legend class="flex-child">
Broken semantics legend text
</legend>
...
</div>
</fieldset>
Вы обнаружите, что это работает, и тогда вы, вероятно, будете двигаться дальше, не задумываясь об этом.
Проблема в том, что размещение оболочки div между набором полей и легендой нарушает отношения между этими двумя элементами. Это нарушает семантику набора полей / легенды.
Таким образом, тем самым вы победили всю цель использования fieldset / legend.
Кроме того, нет смысла использовать набор полей, если вы не зададите этому набору легенду.