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

概述:

注:加粗斜体字是非常重要的概念,决定着你是不是能看懂那句话,所以不懂的请一定要搜索一下。

页面上的每个元素,都在一个矩形框里。

每个矩形框都是一个盒模型。

每个盒模型都由内容区域(content)、边框(border )、内填充(padding)和外边距(margin)组成。

这四个属性都可以独立存在。也就是说,一个盒子可以只有content,也可以只有border,也可以只有padding,也可以只有margin。

(图片来自网络)

关于margin:

  • 可以有负值

Negative values for margin properties are allowed, but there may be implementation-specific limits

这个特性的作用,强大到可以单独写一篇文章了。所以这里先停留在认知层面就够了。

  • 背景永远都是透明的

  • 可能会失效

margin-top and margin-bottom have no effect on non-replaced inline elements.

给一个宽度和高度不是由外部资源影响的行内级元素(例如a元素、span元素)设置margin-top和margin-bottom是没有任何效果的。

  • 垂直相邻的外边距会折叠

Adjoining vertical margins collapse, except:

  • Margins of the root element‘s box do not collapse.
  • If the top and bottom margins of an element with clearance are adjoining, its margins collapse with the adjoining margins of following siblings but that resulting margin does not collapse with the bottom margin of the parent block.

Two margins are adjoining if and only if:

  • both belong to in-flow block-level boxes that participate in the same block formatting context。
  • no line boxes, no clearance, no padding and no border separate them.
  • both belong to vertically-adjacent box edges, i.e. form one of the following pairs:
    • top margin of a box and top margin of its first in-flow child
    • bottom margin of box and top margin of its next in-flow following sibling
    • bottom margin of a last in-flow child and bottom margin of its parent if the parent has ‘auto‘ computed height
    • top and bottom margins of a box that does not establish a new block formatting context and that has zero computed ‘min-height‘, zero or ‘auto‘ computed ‘height‘, and no in-flow children

两个垂直的margin在一定条件下会折叠,即两个margin合并成一个。

合并规则是,最终的值是两个margin中的最大值,即margin=max(margin1,margin2)。如果有一个是负值,则等于正值减去负值。如果都是负值,则用0减去两个负值。

margin-bottom margin-top 结果
30px 20px   30px
-30px 20px -10px
-30px -20px -50px

折叠的条件其实是很严苛的,只要不满足任何一条要求,都不会发生折叠。

先来看一个满足条件的例子。

<div class="wrap">
  <div class="div1"></div>
  <div class="div2"></div>
</div>
body {
  background-color: #63BD84;
}
.wrap {
  width: 200px;
  background-color: #42A5CE;
}
.div1,
.div2{
  height: 100px;
  margin: 10px;
  background-color: #BDFFF7;
}

最终的结果是这样的:

div1的margin-top和父元素的margin-top结合在一起了,又与body的margin-top结合在一起了,最终与html有10px的margin(因为html是根元素,他的margin不折叠)。

div1的margin-bottom和div2的margin-top结合在一起了。

div2的margin-bottom和父元素的margin-bottom结合在一起了。

可以产生这样的效果是因为:

1.这三个盒子都是在普通流内的。如果让div1和div2浮动起来或者绝对定位,他们的margin将不再折叠。

body {
  margin: 0; //浏览器的默认样式是margin:8;
  background-color: #63BD84;
}
.container {
  width: 300px;
  background-color: #CEE6E6;
}
.wrap {
  height: 300px;
  width: 200px;
  background-color: #42A5CE;
}
.div1,
.div2 {
  float: left;
  margin: 10px;
  width: 100px;
  height: 100px;
  background-color: #BDFFF7;
}

2.他们都在同一个块级格式化上下文中,如果父元素创建了一个新的块级格式化上下文:

body {
  margin: 0; //浏览器的默认样式是margin:8;
  background-color: #63BD84;
}
.container {
  width: 300px;
  background-color: #CEE6E6;
}
.wrap {
  overflow: hidden;  //创建新的块级格式化上下文
  width: 200px;
  background-color: #42A5CE;
}
.div1,
.div2 {
  margin: 10px;
  width: 100px;
  height: 100px;
  background-color: #BDFFF7;
}

父元素和两个div不再同一个块级格式化上下文中了,所以他的margin-top和margin-bottom都不再与子元素的合并,而div1和div2依然满足条件,所以div1的margin-bottom依然与margin-top合并在一起了。

3.两个margin没有被行盒,空隙,内边距和边框分隔

如果我在他们之间添加一行文字(产生一个行盒),或是设置父元素的长度(增加了空隙),或是给父元素添加内边距,或是给父元素设置边框,都会使被隔离的两个margin不再合并:

              

添加行盒                                                                      给父元素设置高度来添加空隙

              

添加padding                                设置边框

综上,判断两个margin是否会折叠,要判断他们是否满足以下三个条件:

  1. 都在普通流中
  2. 在同一个块级格式化上下文中
  3. 没有被行盒、空隙、内填充、边框阻断

关于padding

  • 不能有负值
  • padding-top和padding-bottom对non-replaced inline elements无效
  • 背景样式由background属性设置

关于border

  • 不能有负值
  • padding-top和padding-bottom对non-replaced inline elements无效
  • 样式由border-color和border-style属性设置

可以点击这里进行在线测试

参考:Box model

时间: 2024-12-05 23:49:12

认识W3C标准盒子模型,理解外边距叠加的相关文章

CSS盒子模型中外边距(margin)折叠详解

最近写项目过程中遇到一个CSS盒子模型中外边距(margin)折叠的情况,搞得我焦头烂额,之后再网上查阅了大量的资料,现做一个整理和总结,方便以后忘记的时候查阅,同时也供广大网友参考.如有错误或者总结方面不全的地方,欢饮广大网友指出. 外边距折叠的概念:所谓外边距折叠就是相邻的两个或多个元素(含有子元素的情况)的外边距会在垂直方向上合并成一个一个外边距. CSS盒子模型中外边距(margin)折叠的常见情形有如下2种: 情况1.无子元素的相邻兄弟元素 触发margin折叠的条件:两个元素之间没有

css 盒子模型理解

盒子模型是html+css中最核心的基础知识,理解了这个重要的概念才能更好的排版,进行页面布局.下面是自己积累和总结的关于css盒子模型的知识^_^,希望对初学者有用. 一.css盒子模型概念 CSS css盒子模型 又称框模型 (Box Model) ,包含了元素内容(content).内边距(padding).边框(border).外边距(margin)几个要素.如图: 图中最内部的框是元素的实际内容,也就是元素框,紧挨着元素框外部的是内边距padding,其次是边框(border),然后最

总结css表格,边框,轮廓,盒子模型,边距

css表格:border-collapse     是否把表格边框合并为单一边框 separate/collapse.border-spacing     设置分隔单元格边框的距离 num.caption-side     表格标题的位置 Top/bottom.empty-cells     设置是否显示表格中的空单元格 hide/show.table-layout     设置显示单元.行和列的算法.automatic: 列宽度由单元格内容设定默认.fixed: 列宽由表格宽度和列宽度设定.i

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

外边距叠加是一个相当简单的概念. 但是,在实践中对网页进行布局时, 它会造成许多混淆. 简单的说,当两个或更多个垂直边距相遇时,它们将形成一个外边距.这个外边距的高度等于两个发生叠加的外边距的高度中的较大者.只有普通文档流中块框的垂直外边距才会发生外边距叠加. 行内框.浮动框或绝对定位框之间的外边距不会叠加. 一般来说, 垂直外边距叠加有三种情况: 元素自身叠加 包含(父子)元素叠加 相邻元素叠加 元素自身叠加 我们知道, 盒模型是 内容→内边距→边框→外边距 这样逐层包含的结构. 当元素没有内

关于盒模型的外边距padding和内边距margin

边框border属性值  solid实线   dashed虚线   dotted点线   double双实线 /* 内边距 */padding:20px 30px 30px 30px;若有四个值代表  上/右/下/左 padding: 10px 20px 30ox;三个值代表 上.左右.下 padding: 10px 20px;两个值代表  上下/左右 padding: 10px;一个值代表四个方向一致 /* 外边距 */ margin:20px 30px 30px 30px;若有四个值代表 

第七天-css基础(行高,盒子模型,边距)

摘要: 基础知识-css第七天,昨天因为同学的婚礼,所以没有整理,今天继续,今天是css基础的最后一天,知识点不多也不难,主要是后期多练习,巩固前面学习的知识.还有2个案例的时候视频,下周学习.下周也要开启js基础的模式,敬请期待吧-- line-height 行高 行高是基线与基线的距离(浏览器默认字体16px) 行高=文字高度+上下边距 单行文字垂直居中 设置容器高度和line-height值相等 多行文字垂直居中 1.高度固定容器:自己设置上下padding值相等就ok了 2.高度未知容器

CSS盒子模型之边距基础

1. 边距分为: padding margin 1 *{ 2 margin:0px; 3 padding:0px; 4 } 原文地址:https://www.cnblogs.com/ONE-PIECE-ZXZ/p/9759602.html

CSS——标准盒子模型

在写网页的时候一般都先用Div把网页的框架搭好(用不同的背景颜色来区分不同的Div块),然后填充每一个Div,最后把每个Div的背景颜色去掉 <html> <head> <title></title> <style type="text/css"> .divIndex { width:1000px;height:800px;background-color:yellow;margin:0px auto; } .divLogo

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

触发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