外边距叠加一直是前端开发必须了解的一个概念,面试一般也会问到这个问题。所以整理一下相关外边距叠加相关的知识点。外边距叠加是什么?什么时候会发生外边距叠加?如何避免外边距叠加?
先来看看W3C
对于外边距叠加的定义:
In CSS, the adjoining margins of two or more boxes (which might or might not be siblings) can combine to form a single margin. Margins that combine this way are said to collapse, and the resulting combined margin is called a collapsed margin.
大概意思是:在CSS中,两个或多个毗邻的普通流中的盒子(可能是父子元素,也可能是兄弟元素)在垂直方向上的外边距会发生叠加,这种形成的外边距称之为外边距叠加。
我们可以注意定义中的几个关键字:毗邻
、两个或多个
、垂直方向
和普通流
。
毗邻说明了他们的位置关系,没有被padding
、border
、clear
和line box
分隔开。
两个或多个盒子是指元素之间的相互影响,单个元素不会存在外边距叠加的情况。
Horizontal margins never collapse.
只有垂直方向的外边距会发生外边距叠加。水平方向的外边距不存在叠加的情况。
啥为普通流?W3C
只对out of flow
作了定义:
An element is called out of flow if it is floated, absolutely positioned, or is the root element.An element is called in-flow if it is not out-of-flow.
从定义中我们可以知道只要不是float
、absolutely positioned
和root element
时就是in flow
。
外边距叠加存在两种情况:一是父子外边距叠加;二是兄弟外边距叠加。
W3C
对于什么是毗邻的外边距也有定义:
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
从定义中我们可以很清楚的知道要符合哪些情况才会发生外边距折叠:
padding
、border
、clear
和line box
分隔开都属于垂直毗邻盒子边缘:
top margin
和它第一个普通流子元素的top margin
bottom margin
和它下一个普通流兄弟的top margin
bottom margin
和它父元素的bottom margin
top margin
和bottom margin
,且没有创建一个新的块级格式上下文,且有被计算为0的min-height
,被计算为0或auto
的height
,且没有普通流子元素demo1:
.parent1 {
height: 20px;
background: yellow;
margin-bottom: 20px;
}
.parent2 {
margin: 20px 0 30px;
}
.parent3 {
height: 20px;
background: green;
margin-top: 20px;
}
.child {
background: red;
height: 20px;
margin: 40px 0 30px;
}
<div class="parent1"></div>
<div class="parent2">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
<div class="parent3"></div>
这个demo里的.parent2
和第一个.child
的top margin
叠加,导致.parent1
和.parent2
之间的边距为40px
。
demo2:
还是用上面的代码,.parent2
中的.child
中的top margin
和bottom margin
发生外边距叠加,它们之间的外边距为40px
。
demo3:
还是上面的代码,.parent2
中的最后一个.child
发生bottom margin
叠加,.parent2
和.parent3
之间的边距为30px
。
demo4:
.demo {
height: 30px;
background: red;
}
.margin-test {
margin: 20px 0 30px;
}
<div class="container">
<div class="demo"></div>
<div class="margin-test"></div>
<div class="demo"></div>
</div>
这个demo是上面的第四种情况,元素自身的外边距top
和bottom
发生折叠,我们可以看出.container
的高度为90px
,这里可以看到margin-test
的top
和bottom
外边距发生了折叠。
上面讲了外边距的叠加,那如何避免呢,其实只要破坏上面讲到的四个条件中的任何一个即可:毗邻
、两个或多个
、普通流
和垂直方向
。
W3C
也对此做了总结:
英语不好,翻译一下:
欢迎关注我们的公众号
Original url: Access
Created at: 2019-09-26 17:30:22
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论