分离元素的边距如何影响固定元素的位置?

3
我有两个独立的DIV,一个是position:fixed的通知栏,另一个是主容器。当我为container设置一些margin-top时,这也会使我的通知栏被推出来!这里有个演示:http://jsfiddle.net/Zh9k8/2/。我知道我可以用top:0将它固定在页面顶部,但我想知道为什么会发生这种情况。

嗯,很奇怪,如果你在那里加一个<br>标签,它实际上会像这样分割数据:http://jsfiddle.net/Zh9k8/3/ - BuddhistBeast
这些元素也放在body中,对吗? - BuddhistBeast
@BuddhistBeast 是的。怎么做呢?你的意思是边距会到父级元素吗? - Positivity
不,margin-top 应该只影响当前 div 与页面上其他元素的位置关系。奇怪的是,在 div 结束标签后自动换行没有发生,它应该在没有实际插入换行符的情况下完成这个操作。 - BuddhistBeast
2个回答

4

由于折叠边距引起的常见问题: http://www.w3.org/TR/CSS21/box.html#collapsing-margins

解决方法是不使用边距,而是通过其他方式创建空间。您可以向.container添加顶部填充并删除边距:

http://jsfiddle.net/Zh9k8/4/

如果一个内联块级元素没有顶部边框、顶部内边距且其第一个内联块级子元素没有间隙,则它的顶部外边距会与其第一个内联块级子元素的顶部外边距折叠。

如果元素的外边距与其父元素的顶部外边距折叠,则该盒子的顶部边框边缘被定义为与父元素相同。

这些术语很令人困惑,但它确切地描述了正在发生的事情。


这很好,为什么固定的div没有自动换行?加上一个断行标签后,边距就不会影响固定元素的位置...我想说你的答案是正确的,只是我很好奇自动换行发生了什么。 - BuddhistBeast
由于固定定位元素在定义上完全脱离了文档流,所以其周围的所有其他元素都会像它不存在一样。 - Adam Jenkins
对于固定位置的定义,如果有一个好的解释,我会给一个赞。我之前很难找到这方面的信息。所以从本质上讲,如果你添加了break标签,那么这与加入padding一样容易解决问题吗? - BuddhistBeast
这种行为意味着折叠的边距值成为容器的属性,而不是第一个子元素(从而偏移绝对定位的元素),但我认为这并不符合你上面引用的句子。你能澄清一下或指出规范中说明这一点的部分吗? - Jim Garrison
@JimGarrison - 我没有写规范,我只是引用了它。你是正确的,折叠边距值似乎成为父元素的属性,而不是子元素的属性。这是规范中最接近的一行(就在我的链接下面几行),我找到的是“如果元素的边距与其父元素的顶部边距折叠,则框的顶部边框边缘被定义为与父元素相同。”我可能会稍微改一下措辞,但它确实说明了父元素的顶部边缘现在与子元素的顶部边缘相同。 - Adam Jenkins

1
你仍然可以使用边距来创建间距。 如果在body上设置最小填充,则可以消除固定块与边距折叠的影响。 请参见更新后的fiddle:http://jsfiddle.net/BMCc9/
body {
    padding: 0.1px;
}

看起来有点“hacky”,但在CSS中什么不是呢?非常好用! - bennett_an

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接