相邻垂直外边距的塌陷-程序员宅基地

技术标签: css  CSS杂记  html5  前端  html  css3  

首先需要明确塌陷只会发生在块级元素相邻垂直外边距

在使用CSS的垂直外边距样式时,相邻元素父子元素都有可能发生相邻垂直外边距的塌陷(相邻元素是上方元素的下外边距和下方元素的上外边距之间,父子元素是父元素的上外边距和子元素的上外边距之间),为了在编写静态页面时避免由于垂直外边距的塌陷导致的布局混乱,需要了解塌陷时垂直外边距的表现和产生的原因——知道原因才能更好的解决问题

塌陷时外边距的计算方式

在《CSS权威指南》一书中对这种塌陷发生的描述非常的生动,书中将包围元素的外边距比作透明的塑料片,当上下相邻的元素的外边距相邻时,塑料片的垂直宽度大的先触碰到塑料片垂直宽度小的元素的边界,所以塌陷时,保留的是垂直宽度大的外边距值;当父子元素的外边距相邻时,是塑料片垂直宽度大的先触到其他元素或页面的边界,所以塌陷发生时也是保留垂直宽度大的外边距值

在这里插入图片描述

以下明确塌陷发生时相邻垂直外边距的取值方式:

  • 相邻的垂直外边距都为正值,取值较大的
  • 相邻的垂直外边距都为负值,取绝对值较大的
  • 相邻的垂直外边距一正一负,取这两个数的和

父子元素的垂直外边距塌陷

父子元素之间的外边距塌陷发生在父元素的上外边距子元素的上外边距之间,取值方式如上所述

在这里插入图片描述

主要代码如下:

<!-- 以上三组父子元素的HTML结构 -->
<!-- 第一组 -->
<div class="parent" style="margin-top: 100px;">
    <div class="son" style="margin-top: 50px;"></div>
</div>

<!-- 第二组 -->
<div class="parent" style="margin-top: 100px;">
    <div class="son" style="margin-top: -50px;"></div>
</div>

<!-- 第三组 -->
<div class="parent" style="margin-top: -100px;">
    <div class="son" style="margin-top: -50px;"></div>
</div>

相邻元素的垂直外边距塌陷

相邻元素之间的外边距塌陷发生在上方元素的下外边距下方元素的上外边距之间

在这里插入图片描述

主要代码如下:

<!-- 以上三组相邻元素的HTML结构 -->
<!-- 第一组 -->
<div class="sibling1" style="margin-bottom: 100px;"></div>
<div class="sibling2" style="margin-top: 50px;"></div>

<!-- 第二组 -->
<div class="sibling1" style="margin-bottom: 50px;"></div>
<div class="sibling2" style="margin-top: -100px;"></div>

<!-- 第三组 -->
<div class="sibling1" style="margin-bottom: -50px;"></div>
<div class="sibling2" style="margin-top: -100px;"></div>

防止垂直外边距塌陷的方法

要说明一下的是,垂直外边距的塌陷是发生在相邻的垂直外边距之间的,只要不对紧邻在一起的块级元素使用相邻的垂直外边距,是不会有这种塌陷问题的。所以在进行静态布局时,规范的做法往往是:相邻元素的(上下相邻或左右相邻)间隔用外边距实现,并且垂直外边距统一使用一侧的外边距(上外边距或下外边距),而父子元素的(上下间距或左右间距)间隔用内边距实现

在这里插入图片描述

主要代码如下:

<!-- HTML结构如下 -->
<div class="con">
    <div class="parent">
        <div class="son"></div>
    </div>
    <div class="parent">
        <div class="son"></div>
    </div>
    <div class="parent">
        <div class="son"></div>
    </div>
</div>
.parent {
    
    /* 统一使用 上外边距 实现 相邻元素间 的间隔 来 避免塌陷问题 */
    margin-top: 50px;
    /* 使用 内边距 来 实现 父子元素 的间隔 */
    padding-top: 20px;
}

防止父子元素的垂直外边距塌陷

父子元素的垂直外边距塌陷发生时,主要有三种方式解决这个问题:

  • 避免父子元素紧贴彼此:使用边框或内边距将父子元素隔开
  • 触发BFC:典型的,可以对父元素使用overflow: hidden触发
  • 使子元素脱离标准流(提高子元素的层叠上下文):对子元素使用绝对定位或进行浮动

但以上做法有各自的局限性(见下图解析)

在这里插入图片描述

主要代码如下:

使用边框或内边距:
边框的存在可能会引起布局的些许偏差(尺寸上多出了边框的尺寸),有时并不希望有边框的存在;如果对父元素使用内边距,那么子元素距离父元素顶部的间距等于 上内边距+上外边距 ,这样可能导致需要调整内外边距的值,这样比较麻烦

<!-- 添加边框或内边距 -->
<div class="parent" style="border: 1px solid black;">
    <!-- <div class="parent" style="padding: 1px;"> -->
    <div class="son"></div>
</div>

使用overflow: hidden
当父元素的内部元素在布局时如果有超出父元素的部分,这部分将无法显示

<!-- 触发BFC -->
<div class="parent" style="overflow: hidden;">
    <div class="son"></div>
</div>

使子元素脱离标准流:
这个算是比较清爽的做法,既不改变元素原有的尺寸,也不会隐藏超出父元素的部分,但由于子元素脱离了标准流,原有的一些样式可能对子元素无效(就像这里子元素无法居中,因为“margin: 0 auto”对它无效)

 <!-- 使子元素脱离标准流:绝对定位或浮动 -->
<div class="parent" style="position: relative;">
    <div class="son" style="position: absolute"></div>
    <!-- <div class="son" style="float: left;"></div> -->
</div>

由于以上做法各有各的局限,所以还是建议按照以下做法实现元素间的间隔:相邻元素的(上下或左右)间隔用外边距实现,并且垂直外边距统一使用一侧的外边距(上外边距或下外边距),而父子元素的(上下或左右)间隔用内边距实现

防止相邻元素的垂直外边距塌陷

相邻元素的相邻垂直外边距的塌陷是无法避免的,只能通过其他等价方式将间距实现出来

比如如果希望上方元素和下方元素有150px间隔,直接对上方元素使用margin-bottom: 150px就好了,或者只对下方元素使用margin-top: 150px

总结

垂直外边距的塌陷问题完全可以通过不使用相邻的垂直外边距避免,所以在实际的应用中就不太应该使用相邻的垂直外边距。而是应该按照以下原则:
相邻元素的(上下相邻或左右相邻)间隔用外边距实现,并且垂直外边距统一使用一侧的外边距(上外边距或下外边距),而父子元素的(上下间距或左右间距)间隔用内边距实现

如上规范地使用内外边距,可以直接避免塌陷问题

文章源码:https://gitee.com/thisismyaddress/bocheng-blogs/tree/master/css/相邻垂直外边距的塌陷

参考:

https://www.bilibili.com/s/video/BV1DE41197Kc
https://developer.mozilla.org/zh-CN/docs/Web/CSS/margin

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/angry_rooster/article/details/117904553

智能推荐

将tensorflow 1.x & 2.x转化成onnx文件(以arcface-tf2人脸识别模型为例)_ckpt转onnx-程序员宅基地

文章浏览阅读5.9k次,点赞7次,收藏30次。将tensorflow 1.x & 2.x转化成onnx文件文章目录将tensorflow 1.x & 2.x转化成onnx文件一、tensorflow 1.x转化成onnx文件1、ckpt文件生成2、打印权重参数名称3、ckpt文件转pb4、ckpt文件转onnx(--checkpoint)二、tensorflow 2.x转化成onnx文件1、ckpt转savemodel(pb)1)错误用法(不能冻结权重生成pb)2)正确用法(saved_model)2、pb转onnx3、小总结(★★★_ckpt转onnx

SBAS-InSAR沉降监测-程序员宅基地

文章浏览阅读2.2w次,点赞35次,收藏254次。差分干涉测量短基线集时序分析技术(SmallBaselineSubsetInSAR,SBAS-InSAR)凭借其独特的优势,在大区域、长时间序列的地面沉降监测领域具有巨大的应用前景。利用SBAS-InSAR技术对西安市区的14景Sentinel 影像进行处理,本次实验获取了研究区在2019-2020年的基本沉降信息。一下介绍SBAS技术的操作流程,以西安市区为例:1,下载数据,数据源为‘欧空局哨兵数据‘,共有14景数据,时间间隔为一个月。2,数据导入,import data---->Senti_sbas-insar

css选择器总结_加瓦class-程序员宅基地

文章浏览阅读287次。css选择器汇总,以及css选择器权重的讲解_加瓦class

MATLAB摄像头可以运行但是打不开视频_matlab使用摄像头成功但没图像-程序员宅基地

文章浏览阅读510次。今天在学习一个MATLAB关于摄像头操作的代码,运行之后摄像头会一闪一闪,但是就是打不开视频的画面,查看了半天代码发现代码也没有错,最后尝试着将代码中的下面这句中的320x240改为640x480就可以打开视频了vid = videoinput('winvideo', 1, 'YUY2_320x240'); 或者直接去掉第三个参数也可以,例如:vid = videoinput('w..._matlab使用摄像头成功但没图像

Zookeeper 命令和查看节点数据_zk集群如何查看znode大小-程序员宅基地

文章浏览阅读10w+次,点赞7次,收藏33次。1、ZooKeeper命令行在安装目录bin下,执行zkcli.cmd 或zkcli.sh。然后输入命令。常用命令:(1)查看数据:ls, ls2(2)获取数据:get2、四字命令一些数据使用zkCli命令查看不到,使用四字命令则可以获取到。(1)方式1,使用telnet命令可通过telnet或nc命令向ZooKeeper端口发送4个字符的命令。windows下..._zk集群如何查看znode大小

python爬虫网页解析之parsel模块_import parsel-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏6次。python爬虫网页解析之parsel模块一.parsel模块安装官网链接https://pypi.org/project/parsel/1.0.2/pip install parsel==1.0.2二.模块作用改模块主要用来将请求后的字符串格式解析成re,xpath,css进行内容的匹配推荐Python大牛在线分享技术 扣qun:855408893领域:web开发,爬虫,数据分..._import parsel

随便推点

黑马程序员--------语法基础_632485820-程序员宅基地

文章浏览阅读346次。-----Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------Java语法基础1,关键字:其实就是某种语言赋予了特殊含义的单词。保留字:其实就是还没有赋予特殊含义,但是准备日后要使用过的单 词。 2,标示符:Java中的包、类、方法、参数和变量的名字,可由任意顺序的大小写字母、数字、下划线(_)和美元符号($)组成,但标识符不能以数_632485820

Linux下常用软件推荐列表(欢迎补充。。。)_linx软件-程序员宅基地

文章浏览阅读2.4k次。Linux下推荐的常用应用程序列表一,网页浏览1,firefoxfirefox是现在最火的一个浏览器,支持好多扩展和插件,也有很多漂亮的主题.firefox就是mozilla-firefox,他是把mozilla的网页浏览的功能分离为一个单独的浏览器.Firefox一般是linux系统自带的默认浏览器.2,opera(非开源免费软件)opera是号称最快的浏览器.能直接浏览wa_linx软件

华为20级技术官耗巨资3年整合出这份2700页网络协议精髓_tcp/ip协议族 pdf-程序员宅基地

文章浏览阅读145次。以上就是五份TCP/IP、网络协议、路由与交换机2700多页的学习笔记,相信看完这些,一定可以摸透它的。_tcp/ip协议族 pdf

计算机进制幼儿入门,少儿编程中,你该如何给孩子讲解进制问题-程序员宅基地

文章浏览阅读251次。今天继续来聊少儿编程,在聊这个话题之前,先来说一说昨天在上一篇文章中看到的评论,评论这样说,“你这么喜欢编程,有女朋友吗?”看到这条评论,我觉得非常有必要回复一下,这也是很多人对于编程人员的一个误会,总是认为编程人员那么忙碌,性格可能会有点古怪,甚至来说,是一个宅男,是一个不会讨女生欢迎的男生。但就我所知,就我的周边来是说,和我接触的一些做程序员的朋友,他们的收入都还算好,至少来说,在北上广深这些..._二进制怎么跟孩子将

Unity发布的WebGL页面应用实现全屏/非全屏切换_unity中web切换全屏-程序员宅基地

文章浏览阅读1.1k次。转载之https://blog.51cto.com/shuxiayeshou/2386140_unity中web切换全屏

自学JAVA第三天-巩固练习-java基础篇_从控制台接收2个考试的整数分数-程序员宅基地

文章浏览阅读1k次,点赞4次,收藏4次。业精于勤,荒于嬉;行成于思,毁于随。1. 第一题:考试平均分​ 请编程,从控制台接收2个考试的整数分数:数学分数、英语分数。然后程序要计算并打印两科的平均分是多少?(结果取整数即可)import java.util.Scanner;public class average{ public static void main(Strang[] args){ //创建键盘接收对象 Scanner sc = new (System.in); System.out.print("请输入._从控制台接收2个考试的整数分数