有没有办法让 CSS 边距通过字段集边界折叠?

Posted

技术标签:

【中文标题】有没有办法让 CSS 边距通过字段集边界折叠?【英文标题】:Is there any way to allow CSS margins to collapse through a fieldset boundary? 【发布时间】:2018-03-04 01:26:40 【问题描述】:

在 CSS 中,相邻的垂直边距通常会相互“折叠”(即元素之间的垂直间距将等于最大边距,而不是边距之和)。

但是,fieldset 元素与大多数其他元素不同,它不允许其子元素的边距与其兄弟元素的边距一起折叠:

<div>Before div</div>
<div style="margin:0; border:0; padding:0; background:#ccc;">
    <div style="margin:20px 0;">This div has a top and bottom margin, which has collapsed outside of the parent div.</div>
</div>
<div>After div</div>

<div>Before fieldset</div>
<fieldset style="margin:0; border:0; padding:0; background:#ccc;">
    <div style="margin:20px 0;">This div has a top and bottom margin, but the parent fieldset prevents it from collapsing.</div>
</fieldset>
<div>After fieldset</div>

我认为(但不确定)这是因为字段集正在创建一个新的块格式化上下文——the CSS spec doesn’t currently define whether fieldsets should or not,但the html5 spec says it “expects” them to。

有什么方法可以防止字段集阻止他们的孩子和他们的兄弟姐妹之间的边距折叠?

【问题讨论】:

看起来我的浏览器 (Chrome) 通常会使用一些默认填充来呈现 fieldset 元素,这可能会阻止边距折叠。您最好的方法可能是简单地使用div @Blazemonger:“我的浏览器 (Chrome) 通常会使用一些默认填充来呈现字段集元素”——确实如此,但正如您在我的示例中所注意到的,如果填充为删除。 “你最好的方法可能是简单地使用 div”——可能不是,因为 fieldset 向屏幕阅读器表明表单字段是分组的,而 div indicates nothing。 我的意思是,有默认属性-webkit-padding-start-webkit-padding-before 需要与padding 分开覆盖。但即使我这样做了,利润也不会崩溃,所以我不确定它们是否真的发挥了作用。 看起来你的理论是对的:“
元素应该建立一个新的块格式化上下文”根据MDN 和W3C。顺便说一句,我注意到您可以通过将 fieldset 放入 div 中来获得所需的结果,而不是反之亦然。
【参考方案1】:

是的,fieldset 元素建立了新的块格式化上下文(此行为首先在浏览器中实现,因此规范将此功能合并为“预期默认呈现”的一部分)。

不幸的是,我不知道有什么方法可以用 CSS 来“撤消”这个,除了通过将 fieldset 元素的框设置为 display:contents 来完全移除它,这目前只能在 Chrome 中使用“实验性”来提供所需的结果Web 平台功能”标志已打开(Firefox,虽然早在 2015 年就实现了 display:contents,但尚未根据recent addition to the spec 更新其实现以适用于表单控件等“异常元素”)。

【讨论】:

【参考方案2】:

正如您和@Blazemonger 在 cmets 中已经讨论的那样,它可能是特定于浏览器的。如果您使用带有值group 的 aria role 属性,您仍然可以使用 div 而不会牺牲可访问性。

<div role="group">
  <!-- inputs here -->
</div>

来自官方规范:

WAI-ARIA 提供一个分组角色,其功能类似于fieldsetlegend。在此示例中,div 元素具有 role=group 到 表示包含的元素是组的成员,并且 aria-labelledby 属性引用 id 来获取将提供的文本 作为组的标签。

Source

【讨论】:

“它可能是特定于浏览器的”——这种行为在多个浏览器中是一致的。 “如果您使用带有值 group 的 aria role 属性,您仍然可以使用 div 而不会牺牲可访问性”— 是的,尽管您排除了不支持这一点 ARIA 的旧屏幕阅读器。 (我还没有检查截止是什么。)

以上是关于有没有办法让 CSS 边距通过字段集边界折叠?的主要内容,如果未能解决你的问题,请参考以下文章

CSS中的表格边框颜色与边框折叠

css 具有纯CSS的等大小列。使用底部填充边距技巧,通过overflo将过度折叠元素切割成适当的大小

CSS边距不折叠

CSS边距折叠?

有没有办法通过 CSS 为选择选项添加填充?

CSS 中引入边距折叠规则的原因是啥?