CSS特性:空白外边距互相叠加

空白双边距是一个极容易误解的CSS特性.它不是CSS的bug,但如果我们一旦误解,将会给你带来很多麻烦.
先看如下demo代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>空白边距叠加demo@Mr.Think
<style>
body{width:300px; font-family:'微软雅黑'; font-size:1em; text-indent:10px; line-height:1.25}
div{background:#a40000;margin:10px}
div p{background:#eee;margin:15px}
</style>
</head>
<body>
<div><p>空白边距叠加demo@Mr.Think</p></div>
</body>
</html>

这是一个div元素内嵌套p的简单样例,先别复制保存为html测试,在你看完上面的代码后,你是否以为它出为你呈现如下图的效果?
空白外边距互相叠加
好,现在你可以复制上面代码,保存到本地,然后在浏览器中打开.你会惊讶的发现,它呈现给你的效果是这样的:
空白外边距互相叠加
为什么会这样呢?按CSS中,对于有块级子元素的元素计算高度的方式,如果元素没有垂直边框和填充,那其高度就是其子元素顶部和底部边框边缘之间的距离.故,子元素的顶部和底部空白边就突出到元素的外围了.p元素的15px外边距与div元素的10px的外边距形成一个单一的15px垂直空白边,另外,形式的这个空白边并非为div所包围,而是呈现在div的外围.所以,我们看到了第二张效果图.
如何解决?本人比较推荐两种解决方式:
其一,为外围元素定义透明边框.具体到本例,即在样式div中加入border:1px solid transparent;
其二,为外围元素定义内边距填充..具体到本例,即在样式div中加入padding:1px
另外,还可以通过外围元素绝对定位,或者定义子元素浮动等方式实现.

共有 19 条评论.

发表评论4,461 Views

  1. 少了 </title>

    [回复]

  2. 少了 ?

    [回复]

    No.14 回复:

    @No.14, 少了 <title>

    [回复]

  3. 之前也遇到过这个问题。。误打误撞用padding:1px;这种方式解决了..但是不知道原理 现在了解了~

    [回复]

  4. 如影飞

    嗯,遇到这个问题还觉得很奇怪,在用border调试的时候发现加边框可以解决,但是确实有这个边框颜色的问题~现在看到这篇文章,真是妙不可言呵呵~

    [回复]

  5. 一个overflow:hidden;就解决的问题

    空白边距叠加demo@Mr.Think

    body{width:300px; font-family:’微软雅黑’; font-size:1em; text-indent:10px; line-height:1.25}
    div{background:#a40000;margin:10px; overflow:hidden;}
    div p{background:#eee;margin:15px}

    空白边距叠加demo@Mr.Think

    [回复]

    Mr.Think 回复:

    @wany, 这种方法不妥. 万恶的IE6是不支持的.

    [回复]

  6. 雨打浮萍

    我在外层的div里面加上zoom:1; overflow:hidden;,就可以了,理由我也不知道,也不知道这样加正常不。。。

    [回复]

    Mr.Think 回复:

    @雨打浮萍, 可能是你未清除浮动的原因吧.zoom:1; overflow:hidden;是用来清除浮动的.

    [回复]

  7. 雨打浮萍

    在ie里面,为什么我这儿还有是有问题呢?上左右都正常了,但下边距还是没有恢复。

    [回复]

  8. 米雪儿

    平时都没注意这个细节,看到这篇文章,想想以前也遇到过类似的问题但不知道什么原因。
    我试了下,用border:1px solid transparent这种方法,ie6下是有黑色1px边框存在的,不知道大家有没有这个问题。

    [回复]

    Mr.Think 回复:

    @米雪儿, 对的.IE6是不支持border的transparent属性的.所以IE6下还是建议用padding方法解决.也可以谷歌一下IE6对transparent属性bug的解决方法,但都是比较繁琐的.

    [回复]

  9. 其一,为外围元素定义透明边框.具体到本例,即在样式div中加入border:1px solid transprent;

    transprent – transparent

    [回复]

    Mr.Think 回复:

    @Aiseli, 感谢更正~笔误.

    [回复]

发表评论[无需注册]