在CSS中提供height属性时,scrollHeight给出的值不正确

时间:2012-07-22 18:31:21

标签: html

我试图得到我的div的scrollHeight并且我正确但是当我在css中为该特定div添加height属性时,我得到了不同的值。

只需运行fiddle,你就会看到scrollheight属性的控制台值等于268(等于所有孩子的高度总和)

但是当我在css中添加一个高度值(比如高度:50px;)时,输出结果为252(差异是最后一个子元素的边距,我认为)。

任何人都可以回答为何存在差异吗?

修改 由于问题不明确,我已经改写了id。当我指定父div的高度时,我得到滚动高度为252像素,而如果我没有指定高度或将其设置为“自动”我得到268像素。我只是想知道为什么利润率在后一种情况下也不会崩溃?我并不担心边缘崩溃,只是想知道为什么这两种情况下的滚动高度不同?

下面给出的答案非常好。但是我也使用javascript(包括最后一个孩子的下边距)获得了正确的scrollHeight

var h = $(div).height();
$(div).height("auto");
var ch = $(div)[0].scrollHeight;
$(div).height(h);

1 个答案:

答案 0 :(得分:7)

重新阅读你的问题后,我发现你在问别的问题。但它仍然是我之前发布的相同答案。

整体高度正确计算为254px。当您明确设置小于此值的高度时,浏览器仅计算238px。这是 - 就像你的猜测 - 底部没有16px边距,因为“保证金折叠”而发生。由于此规则,最后一个边距被丢弃:

  

父母和第一个/最后一个孩子

     

折叠的保证金最终在父母之外。

所以,要修复它,你可以使用:

overflow: hidden;

或者您可以使用填充(此填充将“重新构建”您的保证金行为,请参阅下面的说明):

p {
    padding: 8px;
}
p:first-child, p:last-child {
    padding-top: 16px;
}

有关更多信息,请访问MDN:Margin collapsing


编辑:在我重新阅读您的问题之前,这是我的第一个答案。我会留在这里,以防有人有类似的问题,也因为它导致相同的解决方案。

这解决了:为什么兄弟姐妹的身高/边距不如预期?

您的身高正确计算。您所面对的是:保证金崩溃

这意味着您所有<p> - 代码的顶部和底部边距都是“合并”的。在你的情况下有7行意味着:

  • 18px是一行的高度
  • 顶部和底部的16px边距
  • 第一个元素的顶部和最后一个的底部按预期显示
  • 所有其他边距都已折叠

,结果是:

  7 * 18px (height)
+ 6 * 16px (margins in-between)
+ 2 * 16px (margin top and bottom)
= 254px (exact the value calculated by the browser)

您可以使用padding来轻松避免这种情况。

有关更多信息,请访问MDN:Margin collapsing