问题 为什么的边距不会与相邻的

崩溃?

根据我对CSS规范的理解,段落上方或下方的表格应该折叠垂直边距。但是,这不会发生在这里:

table {
  margin: 100px;
  border: solid red 2px;
}
p {
  margin: 100px
}
<table>
  <tr>
    <td>
      This is a one-celled table with 100px margin all around.
    </td>
  </tr>
</table>

<p>This is a paragraph with 100px margin all around.</p>

2365
2017-09-25 22:56


起源



答案:


边距折叠仅针对块元素定义。试试吧 - 添加 display: block 到表样式,突然它工作(并改变表的显示...)

表很特别。在CSS规范中,它们不是 相当 块元素 - 特殊规则适用于他们的孩子(显然)和孩子的大小和位置 table 元素本身。

相关规格:

http://www.w3.org/TR/CSS21/box.html#collapsing-margins
http://www.w3.org/TR/CSS21/visuren.html#block-box


9
2017-09-25 23:19



哎呀!你没错 - 添加display:block修复了这个问题。但是,它重新打开了这个: stackoverflow.com/questions/129651/...  是否有可能有一个表(1)折叠边距和(2)不扩展占用所有可用宽度? - raldi
我可以说,不,不。只有普通的块元素允许它们的边距折叠,并且为块级元素计算宽度+填充+边框+边距,使得结果总和是包含块的宽度。你可以把一张桌子放在一个带有边距的块里面但是...... ;-) - Shog9♦
我查了一下。没有'display:block'的表按预期工作 - Jitendra Vyas


答案:


边距折叠仅针对块元素定义。试试吧 - 添加 display: block 到表样式,突然它工作(并改变表的显示...)

表很特别。在CSS规范中,它们不是 相当 块元素 - 特殊规则适用于他们的孩子(显然)和孩子的大小和位置 table 元素本身。

相关规格:

http://www.w3.org/TR/CSS21/box.html#collapsing-margins
http://www.w3.org/TR/CSS21/visuren.html#block-box


9
2017-09-25 23:19



哎呀!你没错 - 添加display:block修复了这个问题。但是,它重新打开了这个: stackoverflow.com/questions/129651/...  是否有可能有一个表(1)折叠边距和(2)不扩展占用所有可用宽度? - raldi
我可以说,不,不。只有普通的块元素允许它们的边距折叠,并且为块级元素计算宽度+填充+边框+边距,使得结果总和是包含块的宽度。你可以把一张桌子放在一个带有边距的块里面但是...... ;-) - Shog9♦
我查了一下。没有'display:block'的表按预期工作 - Jitendra Vyas


我认为这取决于CSS的不同浏览器实现。我刚试过你的代码,Firefox3不会崩溃垂直边距,但是IE7和Safari3.1.2都可以。


3
2017-09-25 23:08





我原本以为Firefox 3不尊重 这部分CSS规范

'display'属性的几个值构成一个元素块级:'block','list-item'和'run-in'(部分时间;参见run-in box)和'table'。

我这样说是因为规范说下面的内容 利润率下降...

正常流动中的两个或多个相邻的块箱垂直边缘坍塌。

...并将表格的样式设置为 display: block 使保证金按照您的预期崩溃并将其重新设定为 display: table 再次解除崩溃。

但再看一遍, 该规范也说明了这一点 (强调我的):

块级元素(除了显示'table'元素,在后面的章节中描述)生成主块框...主块框参与块格式化上下文。

然后,在 块格式化上下文 部分:

块格式化上下文中相邻块框之间的垂直边距折叠。

阅读使我认为一个表(不参与块格式化上下文)和一个段(它确实)之间的边距不应该崩溃是正确的。


2
2017-09-25 23:30



谢谢你指出这一点。我还认为这与规范相矛盾。我不再感谢你的解释:-) ---啊,对不起那个带外评论。我相信SO规则并不支持“谢谢你评论”。不会再发生了! - NicBright
从2018年开始,它看起来你的初步理解是正确的,从那以后所有浏览器都修复了这个问题 错误。 该 display: table 元素生成两个框而不是一个, 表包装盒 和表格框本身,但前者确实参与了块格式化上下文,因此为该元素设置的垂直边距会以其兄弟边距折叠。 - Ilya Streltsyn


我的理解是垂直边距只会在表格和标题之间崩溃[1]。否则,表应该表现为任何其他块元素[2](即2个元素,其中100px边距= 200px)。

  1. http://www.w3.org/TR/CSS2/tables.html#q5
  2. http://www.w3.org/TR/CSS2/box.html

-1
2017-09-25 23:16



奇怪的是,如果我将表设置为“display:block”,它会突然崩溃边缘。 - raldi