请在Chrome bug上加星号以增加bug优先级
这是Chrome的一个bug。请在此问题上添加一个星号,以增加其需要修复的优先级:
https://bugs.chromium.org/p/chromium/issues/detail?id=375693
与此同时,我创建了这三个Code Pen示例来展示如何解决这个问题。它们是使用CSS Grid为示例构建的,但同样的技术也可以用于flexbox。
用aria- labeling by代替legend
这是处理这个问题更为恰当的方法。缺点是您必须处理生成应用于每个假图例元素的唯一id。
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- labels by代替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>
为样式目的创建一个假的重复图例
这是一种更俗气的方法。它仍然是可访问的,但当这样做时,你不必处理id。主要的缺点是在真实的传说元素和虚假的传说元素之间会有重复的内容。
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的语义。
这样一来,你就违背了使用fieldset/legend的初衷。
同样,如果您不给字段集一个图例,那么使用字段集也没有多大意义。