常见布局修复方案—外边距叠加问题

外边距叠加是一个相当简单的概念。 但是,在实践中对网页进行布局时, 它会造成许多混淆。 简单的说,当两个或更多个垂直边距相遇时,它们将形成一个外边距。这个外边距的高度等于两个发生叠加的外边距的高度中的较大者。只有普通文档流中块框的垂直外边距才会发生外边距叠加。 行内框、浮动框或绝对定位框之间的外边距不会叠加。

一般来说, 垂直外边距叠加有三种情况:

  • 元素自身叠加
  • 包含(父子)元素叠加
  • 相邻元素叠加
元素自身叠加

我们知道, 盒模型是 内容→内边距→边框→外边距 这样逐层包含的结构。 当元素没有内容(即空元素)、内边距、边框时, 它的上下边距就相遇了, 即会产生叠加(垂直方向)。 当为元素添加内容、 内边距、 边框任何一项, 就会取消叠加。

元素的顶外边距和底外边距发生叠加

包含(父子)元素叠加

包含元素的外边距隔着 父元素的内边距和边框, 当这两项都不存在的时候, 父子元素垂直外边距相邻, 产生叠加。

元素的顶外边距与父元素的顶外边距发生叠加

相邻元素叠加

这个比较好理解, 相邻的两个元素, 如果它们的上下边距相遇,即会产生叠加。

元素的顶外边距与前面元素的底外边距发生叠加

后两种情况对于网页布局的影响比较大,在某些场合需要合适的方案解决这个问题。
1.解决父子元素外边距叠加问题
  1. <style>
  2. #box {
  3. margin: 10px;
  4. background-color:#d5d5d5;
  5. }
  6. p {
  7. margin: 20px;
  8. background-color:#90C2F3;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <div class="wrapper">
  14. <div id="box">
  15. <p>This paragraph has a 20px margin.</p>
  16. </div>
  17. </div>
  18. </body>
  19. </html>

以上示例中div框设置了10像素的外边距,段落设置了20像素的外边距,预期的样式如下左图所示,在段落和div之间有20像素的外边距,在div外边围绕着10像素的外边距。

  

预期样式                                             实际样式

这里发生了两个情况。首先,段落的20像素顶外边距和底外边距与div的10像素外边距叠加,形成一个20像素的垂直外边距。其次,这些外边距不是被父div包围 ,而是突出到div的顶部和底部的外边。出现这种情况是由于具有块级子元素的元素计算其高度的方式造成的。

如果元素没有垂直边框或内边距 ,那么它的髙度就是它包含的子元素的顶部和底部边框边缘之间的距离。 因此,包含的子元素的顶部和底部外边距就突出到容器元素的外边。有一个简单的解决方案:通过添加一个垂直边框或内边距,外边距就不再叠加了, 而且元素的高度就是它包含的子元素的顶部和底部外边距边缘之间的距离。

为了让前面的示例看起来像左图只需在div周围添加内边距或边框:外边距叠加的大多数问题可以通过添加一点内边距或与元素背景颜色相同的小边框来修复。

  1. #box {
  2. margin: 10px;
  3. padding:1px;
  4. background-color:#d5d5d5;
  5. }
  6. p {
  7. margin: 20px;
  8. background-color:#90C2F3;
  9. }

另外一个常用的解决方案是给让父级元素触发 BFC,使父元素不和它的子元素发生 margin 折叠(注意这里指的是创建了BFC的元素和它的子元素不会发生折叠)

触发BFC的方法主要有以下几种:

1.  float(除了none)
2.  overflow(除了visible)
3.  display设为‘table-cell’, ‘table-caption’, 或‘inline-block’
4.  position(除了static和relative)
5.  zoom:1, IE的hasLayout特性会建立一个新的BFC

其中方法1、3、4我们很容易理解,因为前面说过只有普通文档流中块框的垂直外边距才会发生外边距叠加。 行内框、浮动框或绝对定位框之间的外边距不会叠加(当然也可以自行验证一下)
方法2、5可以如下示例验证:

  1. #box {
  2. margin: 10px;
  3. overflow: hidden;
  4. /*去掉下行注释触发hasLayout*/ /**zoom:1;*/
  5. background-color:#d5d5d5;
  6. }
  7. p {
  8. margin: 20px;
  9. background-color:#90C2F3;
  10. }
2.解决相邻外边距叠加问题
  1. <style>
  2. #box1 {
  3. margin: 10px;
  4. background-color:red;
  5. height: 50px;
  6. width: 1000px;
  7. }
  8. #box2 {
  9. margin: 10px;
  10. background-color:blue;
  11. height: 50px;
  12. width: 1000px;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <div id="box1">
  18. </div>
  19. <div id="box2">
  20. </div>
  21. </body>
  22. </html>

不做任何处理时,两个div块的间隙是10px;并不是累加的20px;

根据 BFC 的定义,两个元素只有在同一 BFC 内,才有可能发生垂直外边距的重叠,包括相邻元素、嵌套元素。要解决 margin
重叠问题,只要让它们不在同一个 BFC 内就行。对于嵌套元素,只要让父级元素触发 BFC,就能使父级 margin 和当前元素的 margin 不重叠。对于相邻元素,也可以采用以下方法使它们的 margin
不重叠。

触发BFC的方法主要有以下几种:

1.  float(除了none)
2.  overflow(除了visible)
3.  display设为‘table-cell’, ‘table-caption’, 或‘inline-block’
4.  position(除了static和relative)
5.  zoom:1, IE的hasLayout特性会建立一个新的BFC

  1. <style>
  2. #box1 {
  3. margin: 10px;
  4. background-color:red;
  5. height: 50px;
  6. width: 1000px;
  7. float: left;
  8. /*display:inline-block;*/
  9. }
  10. #box2 {
  11. margin: 10px;
  12. background-color:blue;
  13. height: 50px;
  14. width: 1000px;
  15. float: left; 
  16. /*display:inline-block;*/
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <div id="box1">
  22. </div>
  23. <div id="box2">
  24. </div>
  25. </body>
  26. </html>

两个div块的间隙变成了20px,解决了叠加问题。

这里有个特别奇怪的问题需要注意一下,如果选择使用overflow属性消除外边距叠加,需要给每个元素添加 BFC 的外壳,而不是将overflow属性直接添加到两个元素中。

  1. <style>
  2. .wrap{
  3. overflow: hidden;
  4. }
  5. #box1 {
  6. margin: 10px;
  7. background-color:red;
  8. height: 50px;
  9. width: 1000px;
  10. }
  11. #box2 {
  12. margin: 10px;
  13. background-color:blue;
  14. height: 50px;
  15. width: 1000px;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div class="wrap">
  21. <div id="box1">
  22. </div>
  23. </div>
  24. <div class="wrap">
  25. <div id="box2">
  26. </div>
  27. </div>
  28. </body>
  29. </html>

参考:

如何解决外边距叠加的问题? - 知乎

《精通CSS高级Web标准解决方案》

来自为知笔记(Wiz)

时间: 2024-08-02 11:03:12

常见布局修复方案—外边距叠加问题的相关文章

认识W3C标准盒子模型,理解外边距叠加

概述: 注:加粗斜体字是非常重要的概念,决定着你是不是能看懂那句话,所以不懂的请一定要搜索一下. 页面上的每个元素,都在一个矩形框里. 每个矩形框都是一个盒模型. 每个盒模型都由内容区域(content).边框(border ).内填充(padding)和外边距(margin)组成. 这四个属性都可以独立存在.也就是说,一个盒子可以只有content,也可以只有border,也可以只有padding,也可以只有margin. (图片来自网络) 关于margin: 可以有负值 Negative v

如何解决外边距叠加的问题?

触发block formatting context即可,触发的方法:1. float不为none2. overflow不为visible3. display设为'table-cell', 'table-caption', 或'inline-block'4. position既不是static也不是relative5. zoom:1, IE的hasLayout特性会建立一个新的block formatting context

css内边距与外边距的区别

你真的了解margin吗?你知道margin有什么特性吗?你知道什么是垂直外边距合并?margin在块元素.内联元素中的区别?什么时候该用 padding而不是margin?你知道负margin吗?你知道负margin在实际工作中的用途吗?常见的浏览器下margin出现的bug有哪些?…… 写css,你少不了与margin打交道,而对于这个平时我们最常用的css属性我们并非十分了解.介于此我打算写下这篇文章,一来是自己工作中的总结,也是对自己知识的一次梳理. Margin是什么 CSS 边距属性

htm的常见布局

布局是CSS中一个重要部分,本文总结了CSS布局中的常用技巧,包括常用的水平居中.垂直居中方法,以及单列布局.多列布局的多种实现方式(包括传统的盒模型布局和比较新的flex布局实现),希望能给需要的小伙伴带来一些帮助. 目录 1.常用居中方法:水平居中,垂直居中, 2.单列布局 3.二列&三列布局:float+margin,position+margin,圣杯布局(float+负margin),双飞翼布局(float+负margin),flex布局 如果你想学习交流html5css3等web前端

IE下的双外边距浮动bug

最常见且最容易发现的额一个bug是IE 6和最低版本中的双外边距浮动bug.这个bug是任何浮动元素上的外边距加倍. 上面代码中,div盒子向左边浮动,设置的margin-left的值是10px.在chrome浏览器,Firefox浏览器中: 在ie6中,距离为20px: 这个bug很容易修复,就是设置元素的display属性为inline就行,元素本身是浮动,设置inline不会影响显示方式. 显示样式:

[ css 外边距 margin ] css中margin外边距合并问题讲解及实例演示

外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距;合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者 外边距合并外边距合并(叠加)是一个相当简单的概念.但是,在实践中对网页进行布局时,它会造成许多混淆.简单地说,外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距.合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者.当一个元素出现在另一个元素上面时,第一个元素的下外边距与第二个元素的上外边距会发生合并.请看下图: CSS 外边距合并实例 1 亲自试一试

margin外边距合并详解

margin外边距合并详解: 外边距合并现象在网页布局中非常的常见,必须对此有明确的把我,以此做到未雨绸缪,否则可能影响工作效率,甚至严重阻碍项目的进度.在网络上已经有大量的相关文章,下面再通过实例结合对网络教材的总结,再来介绍一下外边距合并现象. 概念: 相邻的两个或者多个外边距在垂直方向上合并成一个外边距,这就是所谓的外边距合并. 水平方向不存在此现象. 外边距合并产生条件: 1.相邻的外边距之间没有非空内容.padding和border和clear分隔. 2.对象都处于文档流中,即非浮动和

CSS中的外边距合并问题

w3school中给出的合并定义为:         外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距.         合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者. 此处的“垂直外边距”一词,个人认为不太容易理解. 因为从网页上看来,top margin与bottom margin是平行的,left margin与right margin是平行的,又何来合并一说? 但其所谓的“垂直”,可直接理解为上下两个外边距(此处为个人理解). 因为就其实际合并情况考虑,只有

CSS基础学习十五:盒子模型补充之外边距合并

今天继续接着CSS盒子模型补充,CSS基础学习十三:盒子模型和CSS基础学习十四:盒子模型补充之display属 性设置都是介绍了盒子模型中的内容概括.开始今天的主题:外边距合并. 外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距.合并后的外边距的高度等于两个发生合 并的外边距的高度中的较大者. (1)外边距合并 外边距合并叠加是一个相当简单的概念.但是,在实践中对网页进行布局时,它会造成许多混淆.简单地说,外 边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距.合并后的