我们都知道margin的一点知识,但似乎又不全面,我争取写的全面一点。
我觉得最重要的一点是下面这句话(摘自 CSS Mastery):

Margin collapsing only happens with the vertical margins of block boxes in the normal flow of the document. Margins between things like inline boxes, floated boxes, or absolutely positioned boxes never collapse.

记住这里面有三个关键词:vertical marginblock boxsnormal flow

简单解释一下:
* vertical margin:水平方向的margin不会压缩在一起,只有垂直方向的才可以
* block boxs:盒子模型分为三种,只有block box和inline block这两种盒子模型才符合要求
* normal flow:所有的盒子类型的元素的position属性都有一个默认值:static,这种static属性的元素属于normal flow。position属性为relative的也属于normal flow。position属性为absolute何fixed的元素脱离了normal flow。

一共有四种发生collase的情况:

1.一个元素的top margin与另一个元素的bottom margin发生collapse


如上图所示:上面一个元素的margin-bottom为30px,下面元素的margin-top为20px,此时两个元素之间的margin会压缩,压缩后取较大的值30px。

2.元素嵌套时,子元素的top margin和父元素的top margin发生collapse


这种情况下,压缩后的margin也采取较大的值。

3.一个空元素的top margin和自己的bottom margin发生自压缩


这种情况比较奇怪,但是切记这种情况下也会发生压缩。

4.两个空元素嵌套,内部空元素已经压缩的margin和父元素的margin再次压缩


可以想象,一开始一共四个margin,最后压缩成了一个margin。

多问一句为什么?
浏览器的渲染引擎或称为布局引擎在渲染html源文件的时候,只要遇到两个margin,就会将其压缩,并且取其最大值。渲染引擎不区分top margin或者bottom margin,只要是margin就会collapse。

再多问一句为什么?

题外话:一个很重要的学习方法就是多对自己提问。美籍匈牙利数学家波利亚的《怎样解题》的本质就是通过苏格拉底式的诱发式提问让你自己找到答案。我们的大脑内置一个搜索引擎,一旦你对自己提问,你的大脑会忍不住自己去寻找答案。我们的思维是以问题为导向的,思考水平的高低本质上是你对所学习对象的提问的水平的高低。编程随想说,要对自己三个问题:what、how、why。刘未鹏说要知其然((why),更要知其所以然(why why)。

言归正传,为什么浏览器的设计者会让垂直方向的两个margin发生collapse呢?
margin提出的最初的出发点就是控制盒子模型之间的距离的。从这个角度出发,两个盒子都设置了margin,会影响布局的美观。举例如下:

有三个p元素,p元素的默认样式有top margin和bottom margin。如果不发生collpase,如上图左侧,第一个p元素和第二个p元素之间的margin是最上面的margin的两倍,会影响整体的布局美观。

这篇文章比较全面的介绍了一下margin collapse的相关知识,还是想强调一下其适用条件:

  • vertical margin
  • block boxs
  • normal flow

最后,希望对自己提问的方法论对你有用,非常棒(smile)!

box模型之margin相关推荐

  1. IE的box模型显示bug

    原作者charlee.原始链接http://tech.idv2.com/2007/01/02/ie-box-model-bug/以及本声明. box模型即由<div>等块元素的 margi ...

  2. (转)IE的box模型显示bug

    box模型即由<div>等块元素的 margin.padding.border.width.height 等属性构成的显示模型,它是CSS布局的基础.通过设置<div>的各种属 ...

  3. Firefox开发者工具里查看HTML元素的Box模型

    box模型的组成部分: Content box:通过width和height属性指定大小. padding box:衬垫.包裹content盒模型. border box margin box 如下图 ...

  4. css的box模型_拆箱CSS Box模型的基础

    css的box模型 by Bryan Smith 通过布莱恩史密斯 拆箱CSS Box模型的基础 (Unboxing the basics of the CSS Box Model) Understa ...

  5. css盒模型中margin很牛逼

    css盒子模型,说简单也简单,用的时候也有不简单的. 其中margin的值可以为负值,并且为了实现margin,忽略父级的padding.border.甚至定位.这在布局上很有用,要注意. ----- ...

  6. 使用chrome development tool观察box 模型

    测试代码如下: <html> <style> #parent{width:400px;height:400px;margin:20px;padding:19px;border: ...

  7. 洛阳郊区1980年地图_在无聊的郊区居住中解释CSS Box模型

    洛阳郊区1980年地图 by Kevin Kononenko 凯文·科诺年科(Kevin Kononenko) 如果您去过一个普通的郊区社区,那么您可以了解CSS Box Model. (If you ...

  8. CSS盒模型( CSS margin 属性)

    常见的图片 怎样理解呢看下面例如 ' 设置的属性如下 .mian_one{width: 500rpx;height: 500rpx;background: #00d8a0;}.main_two{wid ...

  9. 微信小程序css之盒子(box)模型

    概念 在css的使用中,所有的元素都被理解成为一个盒子模型,这和QT中的盒子模型相同,如下图所示: Content: 这个区域是用来显示内容,大小可以通过设置 width 和 height. Padd ...

最新文章

  1. Numpy入门教程:07. 随机抽样
  2. AngularJS 1.x系列:Node.js安装及npm常用命令(1)
  3. 码农翻身之——分布式,集群,负载均衡
  4. opporeno3详细参数_vivox30和opporeno3哪个好 vivox30和opporeno3对比评测
  5. 实践作业4:Web测试实践(小组作业)记录1
  6. Ajax的使用四大步骤详解,五、使用Ajax的步骤
  7. 操作系统(1-12)
  8. 从明面上学习ASP.NET Core
  9. Swagger的描述注释配置详解
  10. python用于声明类的关键字_python的with关键字
  11. [转]VS 2003 常用快捷键
  12. mysql innodb 数据恢复_MYSQL INNODB 数据库恢复 转
  13. python 3模块导入(import)问题一则
  14. Excel自定义函数
  15. zoom 更改安装位置_如何以Zoom更改会议主持人
  16. dba成长随笔 -- 深入了解Oracle
  17. 送给天天对着电脑或者已经脖子痛的朋友,超实用颈椎保养法
  18. Matter理论介绍-通用-1-04:桥接器-其他功能
  19. MySQL内置函数中的日期和时间函数详解
  20. Failure to find xxx in 中央仓库

热门文章

  1. 深度学习-BP神经网络(python3代码实现)
  2. 国内三大常见核心期刊体系简介——CSSCI、CSCD与中文核心期【转】刊
  3. 图形学基本知识整理(概述 + 硬件知识)
  4. resource.h
  5. 服务器五大相关基础知识【转】
  6. 最受欢迎的Python开源框架有哪些?
  7. web项目打war包方法 两步解决(极其简单方便)
  8. this关键字、this关键字应用
  9. CSMA/CD协议总结最短帧长计算
  10. 有什么软件可以编译汇编程序?