返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何进行外边距折叠Collapsing margins的分析
  • 441
分享到

如何进行外边距折叠Collapsing margins的分析

2024-04-02 19:04:59 441人浏览 安东尼
摘要

如何进行外边距折叠Collapsing margins的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。外边距折叠,是属于盒模型部分的一个重

如何进行外边距折叠Collapsing margins的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

外边距折叠,是属于盒模型部分的一个重要概念。在刚刚开始接触CSS的时候,对外边距折叠的认识,只有一句话:垂直方向上相邻的两个外边距(margin)会合并成一个,最终的大小,是两个中较大的。

什么是外边距折叠,以及还有其他什么情况下会发生,都不清楚。后来,在实际应用中发现,外边距折叠不是这么简单的,其中包含了很多其他情况下的折叠规则。

一、概念

Collapsing margin,指的是毗邻的两个或多个外边距 (margin) 会合并成一个外边距,即外边距折叠。其中所说的 margin 毗邻,可以归结为以下两点:

1. 这两个或多个外边距没有被非空内容、padding、border或clear分隔开。

2. 这些margin都处于普通流(in-flow,非浮动元素,非定位元素)中。

二、margin折叠的规则

1. 两个或多个毗邻的普通流中的块元素垂直方向上的margin会折叠

A. 两个或多个

说明其数量必须是大于一个,又说明,折叠是元素与元素间相互的行为,不存在A和B折叠,B没有和A折叠的现象了。

B. 毗邻

是指没有被非空内容、padding、border或clear分隔开,说明其位置关系。注意一点,在没有被分隔开的情况下,一个元素margin-top会和它普通流中的***个子元素(非浮动元素等)的margin-top相邻;只有在一个元素的height是”auto”的情况下,它的margin-bottom才会和它普通流中的***一个子元素(非浮动元素等)的margin-bottom相邻。文章不够,例子来凑:

html code<div style="border:1px solid red; width:100px;">     <div style="margin:50px 0; background-color:green; height:50px; width:50px;">        <div style="margin:20px 0;">            <div style="margin:100px 0;">B</div>        </div>     </div> </div>

截图:

如何进行外边距折叠Collapsing margins的分析

以上测试用例中,margin会把B的包含块撑开。

如果一个元素的height特性的值不是 auto,那么它的margin-bottom和它的子元素的margin-bottom不算是相邻,因此,不会发生折叠。margin-top 没有此限制,所以是 100px,margin-bottom 没有折叠,所以只有 50px。

C. 垂直方向

是指具体的方位,只有垂直方向的margin才会折叠,也就是说,水平方向的margin不会发生折叠的现象。

D. 折叠后margin的计算

参与折叠的margin都是正值。例:

HTML code<div style="height:50px; margin-bottom:50px; width:50px; background-color: red;">A</div> <div style="height:50px; margin-top:100px; width:50px; background-color: green;">B</div>

截图:

如何进行外边距折叠Collapsing margins的分析

可见,在margin都是正数的情况下,会取其中margin较大的值为最终 margin值。

参与折叠的margin中有正值,有负值。如果,毗邻的margin中有正值,同时存在负值会怎样呢?有正有负,先取出负margin中绝对值***的,然后,和正marin值***的magin,相加。请看下面的例子:

HTML code<div style="height:50px; margin-bottom:-50px; width:50px; background-color: red;">A</div> <div style="height:50px; margin-top:100px; width:50px; background-color: green;">B</div>

截图:

如何进行外边距折叠Collapsing margins的分析

上面的例子最终的margin是 100+(-50)=50px。

参与折叠的margin都是负值。***,如果毗邻的两个margin都是负值又会怎样呢?当margin都是负值的时候,取的是其中绝对值较大的,然后,从0位置,负向位移。看例子:

HTML code<div style="height:100px; margin-bottom:-75px; width:100px; background-color: red;">A</div> <div style="height:100px; margin-left:50px; margin-top:-50px; width:100px; background-color: green;">B</div>

截图:

如何进行外边距折叠Collapsing margins的分析

相邻的margin要一起参与计算,不得分步计算。以上举的例子都是兄弟节点在垂直方向的相邻,要注意,相邻的元素不一定非要是兄弟节点,父子节点也可以,即使不是兄弟父子节点也可以相邻。举一个复杂点儿的例子,我们要计算的是A和B之间的margin最终应该是多少:

HTML code<div style="margin:50px 0; background-color:green; width:50px;">     <div style="margin:-60px 0;">            <div style="margin:150px 0;">A</div>     </div> </div> <div style="margin:-100px 0; background-color:green; width:50px;">     <div style="margin:-120px 0;">            <div style="margin:200px 0;">B</div>     </div> </div>

有人可能说了,算A和B之间的margin,分别算A和其父元素的折叠,然后与其父元素的父元素的折叠,这个值算出来之后,应该是90px。依此法算出B的为80px;然后,A和B折叠,margin 为90px。

对吗?错了,大错特错。错在哪里了呢?请注意,多个margin相邻折叠成一个margin,所以计算的时候,应该取所有相关的值,而不能分开,分步来算。以上例子中,A和B之间的margin折叠产生的margin,是6个相邻margin折叠的结果。分别是:

◆正值:50px,150px,200px

◆负值:-60px,-100px,-120px

根据有正有负时的计算规则,正值的***值为 200px,负值中绝对值***的是-120px,所以,最终折叠后的margin应该是 200 + (-120) = 80px。
可以打开浏览器来验证自己的猜想。

2. 浮动元素/inline-block的元素/绝对定位元素的margin不会和垂直方向上的其他元素的margin折叠

浮动元素的margin在垂直方向上也不会发生 margin折叠,即使和它相邻的子元素,也不会。看例子:

HTML code<div style="margin-bottom:50px; width:50px; height:50px; background-color:green;">A</div> <div style="margin-top:50px; width:100px; height:100px; background-color:green; float:left;">     <div style="margin-top:50px; background-color:Gold;">B</div> </div>

截图:

如何进行外边距折叠Collapsing margins的分析

可见,两个绿色的块儿之间,相距100px,而若B和它的浮动包含块发生margin折叠的话,金色的条应该位于绿色块的最上方,显然,没有发生折叠。
将float:leftt分别换成 “display:inline-block”和”position:absolute”测试后两种情况,截图与上同。

3. 创建了块级格式化内容的元素,不和它的子元素发生margin折叠

关于块级格式化内容,请参照:Http://www.w3.org/TR/CSS2/visuren.html#block-fORMatting,其中浮动元素,绝对定位元素,以及 overflow值不是&rsquo;visible&rsquo;的元素,都符合。以 “overflow:hidden” 的元素为例:

HTML code<div style="margin-top:50px; width:100px; height:100px; background-color:green; overflow:hidden;">     <div style="margin-top:50px; background-color:gold;">B</div> </div>

截图:

 如何进行外边距折叠Collapsing margins的分析 

若B和它的 “overflow:hidden” 包含块发生margin折叠的话,金色的条应该位于绿色块的最上方,显然,没有发生折叠。

4. 元素自身的margin-bottom和margin-top相邻时也会折叠

自身margin-bottom和margin-top相邻,只能是自身内容为空,垂直方向上border、padding为0。例:

HTML code<div style="border:1px solid red; width:100px;">     <div style="margin-top:100px;margin-bottom:50px;"></div> </div>

截图:

如何进行外边距折叠Collapsing margins的分析

以上代码运行后,我们得到的是一个正方形,说明,最终的margin是100px,而不是150px,也就是说发生了margin折叠。

看完上述内容,你们掌握如何进行外边距折叠Collapsing margins的分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网JavaScript频道,感谢各位的阅读!

--结束END--

本文标题: 如何进行外边距折叠Collapsing margins的分析

本文链接: https://lsjlt.com/news/86693.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何进行外边距折叠Collapsing margins的分析
    如何进行外边距折叠Collapsing margins的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。外边距折叠,是属于盒模型部分的一个重...
    99+
    2024-04-02
  • css中margin值和垂直外边距重叠的示例分析
    这篇文章主要介绍了css中margin值和垂直外边距重叠的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。并列盒子的margin(双margin的重叠)面试题:一个盒子...
    99+
    2023-06-08
  • 如何进行asmcmd的分析
    如何进行asmcmd的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在ASM实例中,所有的存储于ASM磁盘组中的文件对于操作系统命令而言是...
    99+
    2024-04-02
  • 如何进行JDBC的分析
    这篇文章给大家介绍如何进行JDBC的分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. 数据库编程的基础条件如果你想实现代码操作数据库,那么以下条件是你实现它的前提编程语言:例如 Java、C++、Python 等...
    99+
    2023-06-22
  • 如何进行Request的分析
    如何进行Request的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。介绍Request类是一个http请求的类,对于爬虫而言是一个很重要的类。通常在Spider中创建这样...
    99+
    2023-06-17
  • 如何进行abstract的分析
    这篇文章将为大家详细讲解有关如何进行abstract的分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。抽象类: abstract抽象:不具体,看不明白。抽象类表象体现。在不断抽取过程中,将...
    99+
    2023-06-02
  • 如何进行MV-Sketch的分析
    如何进行MV-Sketch的分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。网络测量是对网络行为进行特征化、对各项指标进行量化并充分理解与正确认识互联网的最基本手段,支持...
    99+
    2023-06-03
  • 如何进行SAP CPI的分析
    本篇文章为大家展示了如何进行SAP CPI的分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。最近Jerry由于项目需要,又得学习一个新工具:SAP Cloud Platform Integrati...
    99+
    2023-06-04
  • 如何进行CitizenMe的应用分析
    如何进行CitizenMe的应用分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。审核服务条款与性格测试第一个功能是跟踪记录用...
    99+
    2024-04-02
  • 如何进行ogg的字符分析
    今天就跟大家聊聊有关如何进行ogg的字符分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 我们所熟知oracle的字符...
    99+
    2024-04-02
  • 如何进行null与index的分析
    这期内容当中小编将会给大家带来有关如何进行null与index的分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 今天在测试过程中遇到一问...
    99+
    2024-04-02
  • 如何进行oracle中的sequence分析
    本篇文章给大家分享的是有关如何进行oracle中的sequence分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在oracle中seque...
    99+
    2024-04-02
  • 如何进行JavaScript重构的分析
    本篇文章为大家展示了如何进行JavaScript重构的分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。通常我们的团队中,开发人员在Java语言层面具备相当的技术素...
    99+
    2024-04-02
  • 如何进行JSON来历的分析
    如何进行JSON来历的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。本篇文章介绍JSON来历,以及JSON来历的说明介绍,即我们可以把想要...
    99+
    2024-04-02
  • 如何进行Iptables的脚本分析
    这篇文章给大家介绍如何进行Iptables的脚本分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。环境:redhat9 加载了string time等模块,加载方法参照 http://bbs.chinaunix.net...
    99+
    2023-06-13
  • 如何进行Linux的性能分析
    今天就跟大家聊聊有关如何进行Linux的性能分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。当你登陆一台 Linux 服务器之后,因为一个问题要做性能分析时:你会在第 1 分钟内做...
    99+
    2023-06-16
  • 如何进行dedecms注入的分析
    如何进行dedecms注入的分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。漏洞文件: plus\feedback.php。存在问题的代码:...if($comtype ...
    99+
    2023-06-17
  • 如何进行AOP的应用分析
    这篇文章将为大家详细讲解有关如何进行AOP的应用分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通...
    99+
    2023-06-17
  • 如何进行CouchDB漏洞的分析
    今天就跟大家聊聊有关如何进行CouchDB漏洞的分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。0x00 文档信息    ...
    99+
    2023-06-19
  • 如何进行Collection接口的分析
    如何进行Collection接口的分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。###15Collection-List-ArrayList/LinkedL...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作