请给Chrome的bug加星标以提高其修复优先级
这是Chrome的一个bug。请在该问题上添加一个星标,以提高其修复优先级:
https://bugs.chromium.org/p/chromium/issues/detail?id=375693
同时,我创建了这三个Code Pen示例,展示如何解决这个问题。这些示例使用CSS Grid构建,但相同的技术也可用于flexbox。
使用aria-labelledby而不是legend
这是处理问题的更合适方式。缺点是您必须处理为每个伪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-labelledby 替代 fieldset 和 legend
如果您需要弹性容器能够拉伸到同级元素的高度,并将该拉伸传递给其子元素,您需要使用 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>
为了样式目的而创建一个假的重复图例
这是一种更加hacky (狡猾) 的方法。它仍然具有可访问性,但使用此方式时不必处理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>
Legend必须是直接后代
当你第一次尝试自己修复这个问题时,你可能会尝试这样做:
<fieldset>
<div class="flex-container">
<legend class="flex-child">
Broken semantics legend text
</legend>
...
</div>
</fieldset>
你会发现它有效,然后你可能会毫不犹豫地继续前进。
问题在于在fieldset和legend之间放置一个div包装器会破坏两个元素之间的关系。这破坏了fieldset / legend的语义。
所以,这样做,你已经打败了使用fieldset/legend的初衷。
此外,如果您没有给fieldset一个legend,那么使用fieldset就没有多大意义。