2024 CSS保姆级教程二 - BFC详解

前言 - CSS中的文档流

在介绍BFC之前,需要先给大家介绍一下文档流。​
我们常说的文档流其实分为定位流、浮动流、普通流三种。​

1. 绝对定位(Absolute positioning)​
如果元素的属性 position 为 absolute 或 fixed,它就是一个绝对定位元素。​
在绝对定位布局中,元素会整体脱离普通流,因此绝对定位元素不会对其兄弟元素造成影响,而元素具体的位置由绝对定位的坐标决定。​
它的定位相对于它的包含块,相关CSS属性:top、bottom、left、right;​
对于 position: absolute,元素定位将相对于上级元素中最近的一个relative、fixed、absolute,如果没有则相对于body;​
对于 position:fixed,正常来说是相对于浏览器窗口定位的,但是当元素祖先的 transform 属性非 none 时,会相对于该祖先进行定位。​

2. 浮动 (float)​
在浮动布局中,元素首先按照普通流的位置出现,然后根据浮动的方向尽可能的向左边或右边偏移,其效果与印刷排版中的文本环绕相似。​

3. 普通流 (normal flow)​
普通流其实就是指BFC中的FC。FC(Formatting Context),直译过来是格式化上下文,它是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其他元素之间的关系和作用。​
在普通流中,元素按照其在 HTML 中的先后位置至上而下布局,在这个过程中,行内元素水平排列,直到当行被占满然后换行。块级元素则会被渲染为完整的一个新行。​
除非另外指定,否则所有元素默认都是普通流定位,也可以说,普通流中元素的位置由该元素在 HTML 文档中的位置决定。

BFC定义:

先看下MDN上关于BFC的定义:​

块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视CSS渲染的一部分,是块盒子的布局过程发生的区域

,也是浮动元素与其他元素交互的区域。​

具有 BFC 特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且 BFC 具有普通容器所没有的一些特性。​
通俗一点来讲,可以把 BFC 理解为一个封闭的大箱子,箱子内部的元素无论如何翻江倒海,都不会影响到外部。​
除了 BFC,还有:​

  • IFC(行级格式化上下文)- inline 内联​
  • GFC(网格布局格式化上下文)- display: grid​
  • FFC(自适应格式化上下文)- display: flex或display: inline-flex​
    注意:同一个元素不能同时存在于两个 BFC 中。

BFC的触发方式​
MDN上对于BFC的触发条件写的很多,总结一下常见的触发方式有(只需要满足一个条件即可触发 BFC 的特性):​

  • 根元素,即 ​
  • 浮动元素:float 值为 left 、right​
  • overflow 值不为 visible,即为 auto、scroll、hidden​
  • display 值为 inline-block、table-cell、table-caption、table、inline-table、- – flex、inline-flex、grid、inline-grid​
  • 绝对定位元素:position 值为 absolute、fixed

BFC的特性​

  • BFC 是页面上的一个独立容器,容器里面的子元素不会影响外面的元素。​
  • BFC 内部的块级盒会在垂直方向上一个接一个排列​
  • 同一 BFC 下的相邻块级元素可能发生外边距折叠,创建新的 BFC 可以避免外边距折叠​
  • 每个元素的外边距盒(margin box)的左边与包含块边框盒(border box)的左边相接触(从右向左的格式的话,则相反),即使存在浮动​
  • 浮动盒的区域不会和 BFC 重叠​
  • 计算 BFC 的高度时,浮动元素也会参与计算

应用​
BFC是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素,反之亦然。我们可以利用BFC的这个特性来做很多事。
自适应两列布局​
左列浮动(定宽或不定宽都可以),给右列开启 BFC。

<div><div class="left">浮动元素,无固定宽度</div><div class="right">自适应</div></div>
* {margin: 0;padding: 0;}​
.left {float: left;height: 200px;margin-right: 10px;background-color: red;}​
.right {overflow: hidden;height: 200px;background-color: yellow;}

在这里插入图片描述
将左列设为左浮动,将自身高度塌陷,使得其它块级元素可以和它占据同一行的位置。​

  • 右列为 div 块级元素,利用其自身的流特性占满整行。​
  • 右列设置overflow: hidden,触发 BFC 特性,使其自身与左列的浮动元素隔离开,不占满整行。​
  • 这即是上面说的 BFC 的特性之一:浮动盒的区域不会和 BFC 重叠

防止外边距(margin)重叠​
兄弟元素之间的外边距重叠

<div><div class="child1"></div><div class="child2"></div></div>
* {margin: 0;padding: 0;}​
.child1 {width: 100px;height: 100px;margin-bottom: 10px;background-color: red;}​
.child2 {width: 100px;height: 100px;margin-top: 20px;background-color: green;}

在这里插入图片描述
两个块级元素,红色 div 距离底部 10px,绿色 div 距离顶部 20px,按道理应该两个块级元素相距 30px 才对,但实际却是取距离较大的一个,即 20px。​

块级元素的上外边距和下外边距有时会合并(或折叠)为一个外边距,其大小取其中的较大者,这种行为称为外边距折叠(重叠),注意这个是发生在属于同一 BFC 下的块级元素之间​

根据 BFC 特性,创建一个新的 BFC 就不会发生 margin 折叠了。比如我们在他们两个 div 外层再包裹一层容器,加属性 overflow: hidden,触发 BFC,那么两个 div 就不属于同个 BFC 了。

<div><div class="parent"><div class="child1"></div></div><div class="parent"><div class="child2"></div></div></div>
<div>​<div class="parent">​<div class="child1"></div>​</div>​<div class="parent">​<div class="child2"></div>​</div>​
</div>

在这里插入图片描述
这个关于兄弟元素外边距叠加的问题,除了触发 BFC 也有其他方案,比如你统一只用上边距或下边距,就不会有上面的问题。​

父子元素的外边距重叠​
这种情况存在父元素与其第一个或最后一个子元素之间(嵌套元素)。​
如果在父元素与其第一个/最后一个子元素之间不存在边框、内边距、行内内容,也没有创建块格式化上下文、或者清除浮动将两者的外边距 分开,此时子元素的外边距会“溢出”到父元素的外面。

<div id="parent"><div id="child"></div></div>
* {margin: 0;padding: 0;}​
#parent {width: 200px;height: 200px;background-color: green;margin-top: 20px;}​
#child {width: 100px;height: 100px;background-color: red;margin-top: 30px;}

在这里插入图片描述
如上图,红色的 div 在绿色的 div 内部,且设置了 margin-top 为 30px,但我们发现红色 div 的顶部与绿色 div 顶部重合,并没有距离顶部 30px,而是溢出到父元素的外面计算。即本来父元素距离顶部只有 20px,被子元素溢出影响,外边距重叠,取较大的值,则距离顶部 30px。​
解决办法:​

  • 给父元素触发 BFC(如添加overflow: hidden)​
  • 给父元素添加 border​
  • 给父元素添加 padding​
    这样就能实现我们期望的效果了:
    在这里插入图片描述
    清除浮动解决令父元素高度坍塌的问题​
    当容器内子元素设置浮动时,脱离了文档流,容器中总父元素高度只有边框部分高度
<div class="parent"><div class="child"></div></div>
* {margin: 0;padding: 0;}​
.parent {border: 4px solid red;}​
.child {float: left;width: 200px;height: 200px;background-color: blue;}

在这里插入图片描述
解决办法:给父元素触发 BFC,使其有 BFC 特性:计算 BFC 的高度时,浮动元素也会参与计算

.parent {overflow: hidden;border: 4px solid red;}

在这里插入图片描述
上面我们都是用的 overflow: hidden 触发 BFC,因为确实常用,但是触发 BFC 也不止是只有这一种方法。​
如上面写的所示,可以设置float: left;,float: right;,display: inline-block;,overflow: auto;,display: flex;,display: table;,position 为 absolute 或 fixed 等等,这些都可以触发,不过父元素宽度表现不一定相同,但父元素高度都被撑出来了。​
当然实际运用可不是随便挑一个走,还是根据场景选择。

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

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

相关文章

el-table 滚动条重置 手动控制滚动条

最近在使用 el-table 的时候&#xff0c;出现一个问题&#xff1a; 表头过长的时候&#xff0c;会有左右滑动的操作&#xff0c;当我们把表格拉到最右侧&#xff0c;这个时候重新请求数据的话&#xff0c;表格位置还是在最右侧&#xff0c;不会恢复原位。 那我们想恢复原位&a…

【Android】View的事件分发机制

文章目录 分发顺序ActivityViewGroupView 协作方法整体流程注意 Activity事件分发ViewGroup事件分发View点击事件总结 分发顺序 Activity->ViewGroup->View Activity 分发事件&#xff1a;Activity 通过 dispatchTouchEvent 方法分发事件&#xff0c;首先尝试将事件传递…

基于vue框架的的考研网上辅导系统ao9z7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,公告信息,课程分类,考研资料,考研视频,课程信息,院校建议,教师 开题报告内容 基于Vue框架的考研网上辅导系统开题报告 一、研究背景与意义 随着高等教育的普及和就业竞争的加剧&#xff0c;考研已成为众多大学生提升学历、增强就…

分析 std::optional 的使用与常见错误

文章目录 引言常见错误及解决方案1. 错误使用 std::optional 变量进行算术运算2. 错误检查 std::optional 是否有值3. 忽视 std::optional 的默认值 结论 引言 std::optional 是 C17 引入的一个模板类&#xff0c;用于表示可能有也可能没有值的情况。它特别适用于函数返回值&a…

本地搭建php包依赖管理工具,使用satis搭建私有composer仓库

一、总体设计 dns服务器nginxsatis web 静态页面satis manage 管理程序 二、nginx配置 1、nginx.conf # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://ngi…

软件测试学习笔记丨SeleniumPO模式

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22525 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…

Ubuntu-22.04 虚拟机安装

1. Ubuntu安装方式 1.1. 基于物理介质安装 光盘安装&#xff1a;通过将 Ubuntu 镜像刻录到光盘&#xff0c;在计算机 BIOS/UEFI 中设置光盘为第一启动项&#xff0c;然后按照安装程序的提示进行语言选择、分区、用户信息设置等操作来完成安装。这种方式需要有光盘刻录设备和空…

软件设计师-上午题-12、13 软件工程(11分)

软件工程题号一般为17-19和29-36题&#xff0c;分值一般为11分。 目录 1 软件过程 1.1 CMM(能力成熟度模型) 1.1.1 真题 1.2 CMMI(能力成熟度模型集成) 1.2.1 真题 2 软件过程模型 2.1 瀑布模型 2.2 V模型 2.2.1 真题 2.3 增量模型 2.3.1 真题 2.4 演化模型 2.5 …

Bartender 5 for Mac 菜单栏管理软件 安装教程【保姆级教程,操作简单小白轻松上手使用】

Mac分享吧 文章目录 Bartender 5 for Mac 菜单栏管理软件 安装完成&#xff0c;软件打开效果一、Bartender 5 菜单栏管理软件 Mac电脑版——v5.2.3⚠️注意事项&#xff1a;1️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件3️⃣&#xff1a;打开软件&#xff0c;根据自己…

C#/.NET/.NET Core优秀项目和框架2024年10月简报

前言 每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架&#xff08;每周至少会推荐两个优秀的项目和框架当然节假日除外&#xff09;&#xff0c;推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等&#xff08;打不开或者打开GitHub很慢的同学可以优先查看…

OWASP TOP10 OSS 风险:开源软件安全指南

OWASP OSS 列表提供了旨在绕过 CVE 目录等滞后指标的建议&#xff0c;并为安全从业者提供了安全使用 OSS 组件的指南。 在最近的一些暴露的漏洞和风险之后&#xff0c;对开源软件 &#xff08;OSS&#xff09;的安全和使用方式进行批判性审视的呼声越来越高&#xff0c;特别是 …

数据转换 | Matlab基于SP符号递归图(Symbolic recurrence plots)一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式 基本介绍 Matlab基于SP符号递归图&#xff08;Symbolic recurrence plots&#xff09;一维数据转二维图像方法 符号递归图(Symbolic recurrence plots)是一种一维时间序列转图像的技术&#xff0c;可用于平稳和非平稳数据集;对噪声具有…

01.如何用DDD重构老项目

学习资料来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 动机DDD与重构实践重构? 重写从一开始就采用DDD重构步骤1. 添加领域模块2.分离出有价值的代码3.迁移到领域模块4.重复2,3 动机 …

【uni-app】创建自定义模板

1. 步骤 打开自定义模板文件夹 在此文件夹下创建模板文件&#xff08;注意后缀名&#xff09; 重新点击“新建页面” 即可看到新建的模板 2. 注意事项 创建的模板必须文件类型对应&#xff08;vue模板就创建*.vue文件, uvue模板就创建*.uvue文件&#xff09;

本地部署开源在线即时通讯软件Fiora打造个人私密聊天室

文章目录 前言1.关于Fiora2.安装Docker3.本地部署Fiora4.使用Fiora5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 相信大家在聊天时候总是很没安全感&#xff0c;比如在和小姐妹背着男朋友聊一些不能说的坏话&#xff0c;或者背着女朋友和兄…

【开发工具——依赖管理工具——Maven】

1. Maven介绍 Apache Maven 的本质是一个软件项目管理和理解工具。基于项目对象模型 (Project Object Model&#xff0c;POM) 的概念&#xff0c;Maven 可以从一条中心信息管理项目的构建、报告和文档。 对于开发者来说&#xff0c;Maven 的主要作用主要有 3 个&#xff1a; …

bootstrap应用2——计算第n个观测在(or 不在)自助法样本里的概率

#计算第四个观测在自助法样本里的概率 store<-rep(NA,10000) for (i in 1:10000){store[i]<-sum(sample(1:100,repTRUE)4)>0 } #讨论第四个观测 mean(store) #计算第n个观测在自助法样本里的概率 boot <- function(n, N){return(1-(1-1/N)^N) }#计算第n个观测在自助…

基于 GADF+Swin-CNN-GAM 的高创新扰动信号识别模型!

往期精彩内容&#xff1a; Python-电能质量扰动信号数据介绍与分类-CSDN博客 Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(三)基于Transformer的一…

Docker可视化工具 Portainer 安装及配置

文章目录 拉取镜像安装和启动容器访问 Portainer设置密码完后即代表安装完毕安装完成 拉取镜像 rootyx-PowerEdge-R730:~# docker pull portainer/portainer Using default tag: latest latest: Pulling from portainer/portainer Digest: sha256:47b064434edf437badf7337e516…

废品回收小程序搭建,互联网回收行业的特点

随着社会经济的快速发展&#xff0c;人们的生活水平大幅提高&#xff0c;废品、可回收物也在逐年增加&#xff0c;为行业的发展提高了基础。同时&#xff0c;国家对回收行业的扶持力度在不断增加&#xff0c;废品回收市场拥有广阔的发展机遇。对于入局者来说&#xff0c;行业隐…