CSS中上下margin的传递和折叠

1.上下margin传递

1.1.margin-top传递

为什么会产生上边距传递?

块级元素的顶部线父元素的顶部线重叠,那么这个块级元素的margin-top值会传递给父元素。

示例代码:给inner盒子设置margin-top: 20px;

.reference {
width: 100px;
height: 100px;
background-color: #f00;
color: #fff;
} .box {
width: 200px;
height: 200px;
background-color: #0f0;
} .inner {
width: 100px;
height: 100px;
background-color: #00f;
margin-top: 20px;
}
<div class="reference">参考盒子</div>
<div class="box">
<div class="inner"></div>
</div>

运行结果:inner的margin-top的值传递给了box。

1.2.margin-bottom传递

为什么会产生下边距传递?

块级元素的底部线父元素的底部线重叠,并且父元素的高度是auto,那么这个块级元素的margin-bottom值会传递给父元素。

示例代码:给inner盒子设置margin-bottom: 20px;,并且给父元素设置height: auto;

.box {
width: 200px;
height: auto; /* 给父元素高度设置auto,或者不设置高度,默认为auto */
background-color: #0f0;
} .inner {
width: 100px;
height: 100px;
background-color: #00f;
margin-bottom: 20px;
color: #fff;
} .reference {
width: 100px;
height: 100px;
background-color: #f00;
color: #fff;
}
<div class="box">
<div class="inner">inner</div>
</div>
<div class="reference">参考盒子</div>

运行结果:inner的margin-bottom的值传递给了box。

1.3.如何防止出现传递问题?

  • 给父元素设置padding-toppadding-bottom,防止顶部线或底部线重叠即可;

  • 给父元素设置border,可以解决边距传递的问题;

  • 触发BFC(Block Format Context,块级格式化上下文),简单理解就是给父元素设置一个结界,防止上下边距传递出去(最优解决方案)。触发BFC有以下方式:

    • 添加浮动float(float的值不能是none);
    • 设置一个非visibleoverflow属性(除了visible,其他属性值都可以,像hidden、auto、scroll等);
    • 设置定位position(position的值不能是static或relative);
    • 设置display的值为inline-block、table-cell、flex、table-caption或inline-flex

2.上下margin折叠

上下margin折叠(collapse),也称作外边距塌陷。垂直方向上相邻的2个margin(margin-top、margin-bottom)有可能会合并为一个margin。但是水平方向上的margin(margin-left、margin-right)永远不会折叠。

2.1.兄弟块级元素之间上下margin折叠

示例代码:给box1设置下边距40px,给box2设置上边距20px。

.box1 {
width: 100px;
height: 100px;
background-color: #f00;
margin-bottom: 40px;
} .box2 {
width: 100px;
height: 100px;
background-color: #0f0;
margin-top: 20px;
}
<div class="box1">box1</div>
<div class="box2">box2</div>

运行结果:两个盒子间距为40px。

2.2.父子块级元素之间上下margin折叠

示例代码:inner设置上边距为40px,父元素box设置上边距为20px。

.reference {
width: 100px;
height: 100px;
background-color: #00f;
color: #fff;
} .box {
width: 200px;
height: 200px;
background-color: #f00;
margin-top: 20px;
} .inner {
width: 100px;
height: 100px;
background-color: #0f0;
margin-top: 40px;
}
<div class="reference">参考盒子</div>
<div class="box">
<div class="inner">inner</div>
</div>

运行结果:上边距为40px。

2.3.总结

  • 父子块级元素之间上下margin折叠的原因是inner将上边距传递给了父元素box,然后父元素box再与自己的上边距进行比较;
  • 折叠后最终计算规则:两个值进行比较,取较大值;
  • 如果想防止上下边距折叠,只设置其中一个即可;

CSS中上下margin的传递和折叠的更多相关文章

  1. 深入理解css中的margin属性

    深入理解css中的margin属性 之前我一直认为margin属性是一个非常简单的属性,但是最近做项目时遇到了一些问题,才发现margin属性还是有一些“坑”的,下面我会介绍margin的基本知识以及 ...

  2. 深入css中的margin

    深入css中的margin 第一:margin-top css代码(元素没有任何定位的情况下,并且元素默认为block) <style type="text/css"> ...

  3. 解说css中的margin属性缩写方式

    <html> <body> <div style="border: 1px solid red;"> <div style="b ...

  4. 深入理解CSS中的margin

    1.css margin可以改变容器的尺寸 元素尺寸 可视尺寸--标准盒子模型中盒子的宽度是不包括margin值的,clientWidth 占据尺寸--包括margin的宽度 outWidth不在标准 ...

  5. CSS中的margin、border、padding区别

    CSS padding margin border属性详解 图解CSS padding.margin.border属性W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来 ...

  6. [html]CSS中的margin、border、padding区别

    图解CSS padding.margin.border属性W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层. ...

  7. CSS中的margin、border和padding的区别

    aaarticlea/gif;base64,R0lGODlhuQEbAbMAAP8AM8zMzGZmYszMmZmZZkIP/5qE/8zM/wICApmZmf//zP///wAAAAAAAAAAAA

  8. CSS中设置margin:0 auto; 水平居中无效的原因分析

    很多初学制作网页的朋友,可能会遇到的一个常见问题,就是在CSS中加了margin:0 auto;却没有效果,不能居中的问题,margin:0 auto;的意思就是:上下边界为0,左右根据宽度自适应,其 ...

  9. CSS中的margin和padding的用法和区别

    在CSS中margin是指从自身边框到另一个容器边框之间的距离,就是容器外距离. 语法结构 (1)padding-left:10px; 左内边距 (2)padding-right:10px; 右内边距 ...

随机推荐

  1. java 必应壁纸批量下载

    基于java 必应壁纸批量下载 - rookie丶k - 博客园 (cnblogs.com)实现 上面代码运行本地有点小问题,改了改 1.ssl验证 2.请求头 3.需要优化下载速度,多线程方式(还不 ...

  2. 【Lua】实现代码执行覆盖率统计工具

    一.如何评估测试过程的测试情况? 很多时候完成功能测试后就会发布上线,甚至交叉和回归都没有足够的时间去执行,然后通过线上的补丁对遗漏的问题进行修复.如果可以在发布前了解本次测试过程所覆盖代码执行的比例 ...

  3. Ubuntu怎么修改DNS

    有时候会出现配置好网络之后,可以ping通网关却ping不通www.baidu.com orangepi@orangepi3:~$ ping 192.168.1.1 PING 192.168.1.1 ...

  4. 数值分析:矩阵奇异值分解(Numpy实现)

    1. 奇异值分解(SVD) (1)奇异值分解 已知矩阵\(\bm{A} \in \R^{m \times n}\), 其奇异值分解为: \[\bm{A} = \bm{U}\bm{S}\bm{V}^T ...

  5. HAOI 2018 Round 1 题解

    无聊了开一套省选题刷刷--u1s1 感觉三个题都不错,难度也挺有梯度,是一道标准的省选难度的题(话说 CSP 前你刷省选题干嘛/ts/ts) 小 C 珂海星 T1:P4495 [HAOI2018]奇怪 ...

  6. 洛谷 P6499 - [COCI2016-2017#2] Burza(状压 dp)

    题面传送门 一道挺有意思的思维题(?) 首先我们假设根节点深度为 \(0\),那么 Daniel 的目标显然就是堵住一些节点使得 Stjepan 不能移动到深度为 \(k\) 的节点,Stjepan ...

  7. WPS表格数据透视表的美化和布局

    设计--分类汇总--在组的底部显示所有分类汇总   把二级分类单独放在一类中 设计--报表布局--以表格形式显示   快速调整表格的外观 分析--+/-按钮   设置字段的数字格式以万元为单位 选中任 ...

  8. Pyquery解析库的安装和使用

    Pyquery同样是一个强大的网页解析工具,它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便.GitHub:https://github.com/gawel/pyqu ...

  9. PL\SQL和PL/SQL Developer 12安装与配置

    安装: (1)在已有安装包的情况下,直接将安装包解压到文件夹下,注意不要解压缩到c:\programs Files(x86)的文件夹下,不能解压缩到有中文文件夹命名的文件夹下面 (2)没有安装包的情况 ...

  10. Jumpserver堡垒机容器化部署

    JumpServer 是符合 4A 的专业运维安全审计系统. 前提条件 已部署docker Jumpserver 对外需要开放 80 443 和 2222 端口 服务器.数据库.redis 等依赖组件 ...