【Web前端HTML5CSS3】09、高度塌陷与 BFC

news2025/4/8 20:22:56

九、高度塌陷与 BFC

1、高度塌陷

在浮动布局中,父元素的高度默认是被子元素撑开的

当子元素浮动后,其会完全脱离文档流,子元素从文档流中脱离将会无法撑起父元素的高度,导致父元素的高度丢失

父元素高度丢失以后,其下的元素会自动上移,导致页面的布局混乱

所以高度塌陷是浮动布局中比较常见的一个问题,这个问题我们必须要进行处理!

别急,我们接着往下看

2、BFC

BFC(Block Formatting Context)块级格式化环境

  • BFC 是一个 CSS 中的一个隐含的属性,可以为一个元素开启 BFC
  • 开启 BFC 该元素会变成一个独立的布局区域

元素开启 BFC 后的特点:

  • 不会被浮动元素覆盖
  • 父子元素外边距不会重叠
  • 可以包含浮动的元素

可以通过一些特殊方式来开启元素的 BFC:

  • 设置为浮动(不推荐):很明显下方元素被覆盖了,总不能让所有元素都浮动吧
  • 设置为行内块元素(不推荐):不再独占一行,宽度变了,同时与下方元素产生了一点空隙

  • 可以通过变成浮动元素,来防止自身被浮动元素覆盖(有点“以毒攻毒”那味了)

  • 可以设置行内块,来防止自身及其他元素被浮动元素覆盖(如果说浮动是“独善其身”,那行内块就有点“兼济天下”的意思)

  • 可以设置overflow属性,包含浮动元素(既“独善其身”,又“兼济天下”,但仍有缺陷)

我们可以打开Zeal/Dash手册(《02-前端开发准备》有介绍),查看关于 BFC 的说明文档

打开Block formatting context模块后,可以看到有很多开启 BFC 的方式

我这里大概翻译了一下,并整理了一份表格,应该看起来更直观一点(有些概念因为还没有学习,翻译和理解有误的地方还望谅解)

元素或属性说明
<html>文档根元素
float: left float: right浮动元素(float不为none
position: absolut position: fixed绝对定位元素
display: inline-block行内块元素
display: table-cell表格单元,默认值
display: table-caption表格标题,默认值
display: table display: table-row display: table-row-group display: table-header-group display: table-footer-group display: inline-table匿名的表格单元,分别是 HTML 表格、表行、表体、表头和表脚的默认值
overflow: hidden overflow: scroll overflow: autooverflow不为visibleclip的块元素
display: flow-root
contain: layout contain: content contain: paint
display: flex display: inline-flex的直接子元素Flex 项,如果它们本身既不是flex,也不是gridtable容器
display: grid display: inline-grid的直接子元素Grid 项,如果它们本身既不是flex,也不是gridtable容器
column-count不为auto column-width不为autoMulticol 容器,包含column-count: 1
column-span: all应该总是创建一个新的格式化上下文,即使column-span: all元素不在 multicol 容器中

但是,注意不管哪种方式,多多少少都会有些隐患、缺陷或者说“副作用”

3、clear

我们这里设计三个兄弟元素,对前两个元素进行float的浮动属性设置,看下效果

由于 box1 的浮动,导致 box3 位置上移也就是 box3 受到了 box1 浮动的影响,位置发生了改变(注意,这里文字并没有被覆盖,《09-浮动》一节说过浮动的特点,其中第 7 点就是“文字环绕”的问题)

如果我们不希望某个元素因为其他元素浮动的影响而改变位置,可以通过clear属性来清除浮动元素对当前元素所产生的影响

clear作用:清除浮动元素对当前元素所产生的影响(本质是为元素添加一个margin-top属性,值由浏览器自动计算)

可选值:

  • left 清除左侧浮动元素对当前元素的影响
  • right 清除右侧浮动元素对当前元素的影响
  • both 清除两侧中影响较大一侧元素的影响(注意,这里不是同时清除两侧的影响)

4、after

我们学习了上面知识后,了解了高度塌陷问题的解决方式,其中主要有

  • 通过overflow: hidden等可以为元素开启 BFC

答案当然是:有!

我们直接上效果图

Q1:这里使用了一个伪元素选择器::after,那有人会问了,跟在 box2 下直接定义一个 box3 有什么区别呢?

A:我们知道,网页的结构思想是:结构+表现+行为。在 box2 下直接定义一个 box3,属于结构;而使用伪元素选择器,属于表现

而高度塌陷问题属于表现问题,定义 box3 的目的是为了撑起 box1 的内容,属于表现,而不是结构,所以在 css 中定义::after更符合网页的编程思想

Q2:为什么需要使用display: block呢?

A:因为默认情况下,::after伪元素是一个行内元素,如果不转为块元素,将仍然撑不起 box1 的高度

5、clearfix

我们在前面《06-盒模型》一节中说过垂直布局中边距重叠的问题:相邻的垂直方向外边距会发生重叠现象

如上图所示,子元素设置了一个margin-top之后,父元素跟随子元素一起进行了移动

即我们之前说的父子元素间相邻外边距,子元素会传递给父元素(上外边距)

聪明的小伙伴已经想到了,用刚才说的伪元素选择器啊

好,我们先来看下效果

貌似是没有任何变化,到底是什么地方不对呢?

我们再来回顾下使用after伪元素的心路历程:

  • 使用无内容的 box3 撑起 box1 ==》表现代替结构(::after代替 box3)
  • clear清除浮动对元素产生的影响(还记得clear的原理么?)

其实就是给元素设置了一个margin-top属性,不过这个在开发者工具中是看不到的

既然如此,就相当于在 box2 下面添加一个 box3,然后给 box3 设置一个margin-top属性

到此为止,

∵ 相邻的垂直方向外边距 这个条件仍然满足

∴ 会发生重叠现象这个结论也依然成立

具体点就是,父子元素间相邻外边距,子元素会传递给父元素(上外边距),表现为 box1 和 box2 同步往下移动

那我们应该怎么做才能解决这个问题? 凭你们朴素的情感,应该怎么判? 当然就是让上述条件不满足呗!

怎么能够不满足?当然是让两个元素垂直外边距不相邻啊!

好,多说无益,我们直接上代码看效果!

我们用了before伪元素选择器,目的当然是让 box1 和 box2 的外边距不相邻,但是好像并没有效果

我们再换成display: inline-block属性看看

好像是解决了父元素布局的问题,但是子元素怎么还往下跑了一段距离? 是谁给的勇气?

因为inline-block兼顾行内元素和块元素的特点,既可以设置宽高也不独占一行

在没有设置宽高时,会存在一个默认高度,所以inline-block仍然行不通

还有一个属性,display: table

Bingo!实现了我们最终想要的效果

Q1:为什么没有使用 clear 属性?

A:不是说了吗?clear是为了清除浮动对布局的影响,我们现在没有浮动的元素啊,我们要讨论的也不是浮动的问题

Q2:display 不是还有一个none属性么,为什么不用呢?

A:none属性是不占据位置,但是也不能让元素相邻的外边距分离啊

Q3:为什么table值就可以呢?

A:这个问题问的非常好,算是问到点上了!我们上面在讲开启 BFC 的一些方法的时候,也提到了该属性。而且,应该牢记的是,元素开启 BFC 后的其中一个特点就是 父子元素外边距不会重叠。当然,这里也需要合理选择伪元素选择器,使其外边距不相邻才行

另外,总结一下:

  • 高度塌陷问题,一般用::after
  • 外边距重叠问题,一般用::before

不知道到这里,大家能不能想明白这两件事情

那么问题来了,有没有一个两全其美的办法,既可以解决高度塌陷,又可以解决外边距重叠呢?

当然有!clearfix 这个样式就可以同时解决高度塌陷和外边距重叠的问题

当你在遇到这些问题时,直接使用clearfix这个类即可,他就可以帮你轻松搞定 css 中的两大难题

.clearfix::before,
.clearfix::after {content: "";display: table;clear: both;
} 

其中.clearfix::before是为了解决外边距重叠问题

.clearfix::before {content: "";display: table;
} 

.clearfix::after是为了解决高度塌陷问题

.clearfix::after {content: "";display: table;clear: both;
} 

两者合在一起,就可以完美地解决高度塌陷和外边距重叠这两大“世纪难题”了

`

其中.clearfix::before是为了解决外边距重叠问题

.clearfix::before {content: "";display: table;
} 

.clearfix::after是为了解决高度塌陷问题

.clearfix::after {content: "";display: table;clear: both;
} 

两者合在一起,就可以完美地解决高度塌陷和外边距重叠这两大“世纪难题”了

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/109604.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IU酒店释放轻中端投资活力,开启曲靖酒店新篇章

曲靖位于云南省东北部&#xff0c;是云南连接内地的重要陆路通道&#xff0c;素有“滇黔锁钥”、“入滇门户”、“云南咽喉”之称&#xff0c;是仅次于昆明的云南第二大城市。曾入选“中国十佳宜居城市”榜单10次的城市&#xff0c;拥有3000多年的文明史&#xff0c;早在三国魏…

mock功能

目标 了解mock的作用及使用场景&#xff1b; mock使用场景 mock&#xff1a;假的 前端程序员提到的mock数据的含义是&#xff1a;真的假数据 真的&#xff1a;符合接口规范要求的。 假数据&#xff1a;数据是人为创建出来的&#xff0c;不是真正的业务数据。 什么时候需要m…

客快物流大数据项目(九十七):ClickHouse的SQL语法

文章目录 ClickHouse的SQL语法 一、​​​​​​​常用的SQL命令 二、​​​​​​​​​​​​​​select查询语法 三、insert into语法 四、​​​​​​​​​​​​​​alter语法 ClickHouse的SQL语法 一、​​​​​​​常用的SQL命令 作用 SQL 列出所有数据库 s…

日本知名汽车零部件公司巡礼系列之株式会社135

株式会社135 业务内容&#xff1a; 各种齿轮零件加工(减速机零件) 齿轮马达的齿轮头零件组装加工 轮式起重机齿轮零件加工 其他部位、零件等的加工 公司简介&#xff1a; 资本金&#xff1a;3000万日元 员工数&#xff1a;41名&#xff08;男33名&#xff0c;女8名&#x…

N维码算法的探索(二),16色的16进制编码表达汉字的试探

前些天写了一篇《N维码算法的探索》&#xff0c;是利用颜色像素对n维码算法扩展的思考。读者非常有限&#xff0c;能够理解的可能需专业人士了。 这种研究的意义何在&#xff1f;不知道。用上了就是有用&#xff0c;用不上也就被历史淘汰了。普通人通常的逻辑是&#xff1a;既…

js获取某一时间到现在的总时间以及svg图标统一管理方法的封装

目录 js获取某一时间到现在的总时间方法封装 一、需求 二、方法 三、使用 js封装一个svg图标管理方法 一、需求 二、实现 三、使用 js获取某一时间到现在的总时间方法封装 一、需求 在做一些信息展示的时候&#xff0c;我们需要展示各种时间&#xff0c;有时是准确的创…

攻防世界-宜兴网信办-inget

题目 访问题目路径 这个题目的意思就是请输入ID&#xff0c;然后尝试绕过&#xff0c;那应该就是SQL注入&#xff0c;但是呢&#xff0c;我是个懒狗&#xff0c;我直接跑sqlmap 先跑数据库名 sqlmap "http://61.147.171.105:51322/?id1" --current-db 爆表 sqlma…

迅为3A5000开发板龙芯自主指令集从里到外100%全国产设计方案

迅为3A5000开发板龙芯处理器自主指令集架构从里到外100%全国产设计方案 iTOP-3A5000 开发板采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统&#xff08;LoongArch&#xff09;的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能…

低代码多分支协同开发的建设与实践

作者&#xff1a;黄也(胖丁) 引言 随着低代码的普及&#xff0c;在低代码平台上构建企业级应用逐渐成为生产趋势。同时&#xff0c;随着低代码技术的提升&#xff0c;越来越多的复杂应用在低代码平台中完成。在其研发生命周期中&#xff0c;低代码开发者就会面临多人协作、并…

卷积神经网络 CNN 基础概念

目录 一&#xff1a;卷积神经网络 二&#xff1a;局部感受野 三&#xff1a;卷积层 四&#xff1a;池化层 五&#xff1a;激活层 六&#xff1a;全连接层 七&#xff1a;卷积神经网络算法过程 一&#xff1a;卷积神经网络 卷积神经网络(Convolutional Neural Networks,C…

nor flash调试与使用总结

最近项目中使用到norflash&#xff0c;总结一下学习与使用经验 文章目录一、Flash基本概念存储器介绍与Flash在其中定位---非易失存储器类别中嵌入式领域常见设备Flash的典型分类---NorFlash&#xff08;贵/容量小/读快写慢&#xff09;与NandFlash&#xff08;便宜/容量大/读慢…

Zookeeper 4 Zookeeper JavaAPI 操作 4.9 模拟12306 售票案例

Zookeeper 【黑马程序员Zookeeper视频教程&#xff0c;快速入门zookeeper技术】 文章目录Zookeeper4 Zookeeper JavaAPI 操作4.9 模拟12306 售票案例4.9.1 Curator 实现分布式锁 API4.9.2 分布式锁案例 - 模拟12306 售票4 Zookeeper JavaAPI 操作 4.9 模拟12306 售票案例 4.…

企业经常会问到的软件测试面试题及答案,一定要好好记住

相信对于很多软件测试新手来说&#xff0c;技术项目的面试是十分让人头疼的&#xff0c;生怕没回答得好&#xff0c;就会跟这个offer失之交臂&#xff0c;因此&#xff0c;今天&#xff0c;我以身边朋友面试遇到过的几个问题以及刷过的软件测试题库柠檬班中的压中的题目&#x…

Maven 项目模板

Maven 项目模板 Maven 使用 archetype(原型) 来创建自定义的项目结构&#xff0c;形成 Maven 项目模板。 在前面章节我们学到 Maven 使用下面的命令来快速创建 java 项目&#xff1a; mvn archetype:generate 什么是 archetype&#xff1f; archetype 也就是原型&#xff…

终于有人把性能优化讲清楚了!阿里架构师推荐的Java性能权威指南

Java给大部分人的感觉就是慢&#xff0c;有严重的性能问题。其实程序慢的问题&#xff0c;与语言无关&#xff0c;与Java无关。Java应用的性能优化也是一个老生常谈的话题&#xff0c;但是只要我们深入的了解性能调优方法&#xff0c;走遍天下都不怕&#xff01; 大多数开发人…

mac系统M1pro芯片安装VMware Fusion虚拟机win11操作系统(原创详细版)

VMware22年11月份推出Fusion 13&#xff0c;这是Fusion虚拟软件的最新更新。它允许Mac用户操作虚拟机来运行非macOS操作系统&#xff0c;如Windows 11。 有了Fusion 13&#xff0c;英特尔和苹果芯片Mac用户可以访问Windows 11虚拟机。英特尔Mac提供对Windows 11的全面支持&…

webpack 构建脚手架

前言 1. 构建项目 2. 局部安装 3. webpack.config.js 4. 打包 css 文件 5. 打包 less 文件 6. 打包 vue 文件 7. loader 和 plugin 区别 8. 添加版权的插件 9. html-webpack-plugin 打包 html 的插件 10. 压缩文件 11. webpack-dev-server 搭建本地服务器 前言 本文记录 webpa…

基于鸽群算法改进的DELM预测 -附代码

鸽群算法改进的深度极限学习机DELM的回归预测 文章目录鸽群算法改进的深度极限学习机DELM的回归预测1.ELM原理2.深度极限学习机&#xff08;DELM&#xff09;原理3.鸽群算法4.鸽群算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理 ELM基础原理请参考&#xff1a;https:…

自学编程的人成千上万,为什么坚持下来的没几个?

在互联网职位薪资水涨船高的现下&#xff0c;越来越多的人都对此跃跃欲试&#xff0c;想要通过学习进入这个新兴的朝阳行业。但或因为现下工作&#xff0c;或因为各种压力&#xff0c;多数人并不能果断投入&#xff0c;自学成了常见的学习方式&#xff01; 但是据数据显示&…

PDF翻译怎么操作?教你几个PDF翻译的技巧

当你在查阅国外资料的时候&#xff0c;有没有发现很多资料都是以PDF格式来呈现的&#xff1f;毕竟&#xff0c;PDF文件方便查阅也不易出现格式混乱的状态。但是&#xff0c;这对于英语基础不好的小伙伴就有一定的影响了&#xff0c;而且如果一字一字去翻译解释&#xff0c;那也…