BFC — 张天禹

news2024/11/15 10:52:02

文章目录

  • 学习链接
  • BFC
    • 1. 什么是BFC
      • W3C 上对 BFC 的定义
      • MDN 上对 BFC 的描述
      • 更加通俗的描述
    • 2. 开启了BFC能解决什么问题
    • 3. 如何开启BFC
  • 演示
    • 演示1
      • 子元素margin塌陷问题
      • 使用BFC解决问题
      • 完美解决塌陷问题
    • 演示2
      • 被浮动元素覆盖问题
      • 使用BFC解决问题
        • 例1
        • 例2
        • 例3
        • 例4
          • 延申(左右布局)
    • 演示3
      • 浮动造成父元素高度塌陷问题
      • 使用BFC解决问题

学习链接

什么是BFC?看这一篇就够了

BFC

1. 什么是BFC

W3C 上对 BFC 的定义

原文:Floats, absolutely positioned elements, block containers (such as inline-blocks, tablecells, and table-captions) that are not block boxes, and block boxes with ‘overflow’ other than ‘visible’ (except when that value has been propagated to the viewport) establish new block formatting contexts for their contents.

译文:浮动绝对定位元素不是块盒子的块容器(如 inline-blocks 、 table-cells 和table-captions ),以及 overflow 属性的值除 visible 以外的块盒,将为其内容建立新的块格式化上下文

MDN 上对 BFC 的描述

块格式化上下文(Block Formatting Context,BFC) 是 Web 页面的可视 CSS 渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。

更加通俗的描述

  1. BFC 是 Block Formatting Context (块级格式上下文),可以理解成元素的一个“特异功能”。

  2. 该 “特异功能”,在默认的情况下处于关闭状态;当元素满足了某些条件后,该“特异功能被激活

  3. 所谓激活“特异功能”,专业点说就是:该元素创建了 BFC (又称:开启了 BFC )。

2. 开启了BFC能解决什么问题

  1. 元素开启 BFC 后,其子元素不会再产生 margin 塌陷问题。
  2. 元素开启 BFC 后,自己不会被其他浮动元素所覆盖。
  3. 元素开启 BFC 后,就算其子元素浮动,元素自身高度也不会塌陷。

3. 如何开启BFC

  • 根元素
  • 浮动元素
  • 绝对定位、固定定位的元素
  • 行内块元素
  • 表格单元格: table 、 thead 、 tbody 、 tfoot 、 th 、 td 、 tr 、 caption
  • overflow 的值不为 visible 的块元素
  • 伸缩项目
  • 多列容器
  • column-span 为 all 的元素(即使该元素没有包裹在多列容器中)
  • display 的值,设置为 flow-root

演示

演示1

子元素margin塌陷问题

  • outer仅设置宽度
  • inner设置宽度和高度,以及margin
  • 可以看到子元素把父元素给拉下来了,最后1个子元素的margin-bottom也给父元素剥夺了

在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>01_BFC_演示1</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        /* outer仅设置宽度 */
        .outer {
            width: 400px;
            background-color: #888;
           
        }
        
        /* inner设置宽度和高度,以及margin */
        .inner {
            width: 100px;
            height: 100px;
            margin: 20px;
        }
        
        .inner1 {
            background-color: orange;
        }
        
        .inner2 {
            background-color: green;
        }
        
        .inner3 {
            background-color: deepskyblue;
        }
    </style>
</head>
<body>
    <div class="outer">
        <div class="inner inner1"></div>
        <div class="inner inner2"></div>
        <div class="inner inner3"></div>
    </div>
    <hr style="height: 50px; background-color: red;">
</body>
</html>

使用BFC解决问题

  • 使用以下任意方式都能解决问题
  • 其中,伸缩项目是通过设置body为flex,则body的直接子元素变成伸缩项目了
  • display设置为flow-root;是新定义出来的属性值
  • overflow设置只要不为visible,包括auto都可以开启BFC

在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>01_BFC_演示1</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body {
            /* display: flex; */
        }
        .outer {
            width: 400px;
            background-color: #888;
            float: left; 
            /* position: absolute; */
            /* display: inline-block; */
            /* display: table; */
            /* overflow: auto; */
            /* column-count: 1; */
            /* display: flow-root; */
        }
        .inner {
            width: 100px;
            height: 100px;
            margin: 20px;
        }
        .inner1 {
            background-color: orange;
        }
        .inner2 {
            background-color: green;
        }
        .inner3 {
            background-color: deepskyblue;
        }
    </style>
</head>
<body>
    <div class="outer">
        <div class="inner inner1"></div>
        <div class="inner inner2"></div>
        <div class="inner inner3"></div>
    </div>
    <hr style="height: 50px; background-color: red;">
</body>
</html>

完美解决塌陷问题

  • 注意:给outer设置border,也能解决父子元素垂直外边距塌陷的问题,但这并没有开启BFC。并且设置border相当于改了盒子尺寸了,这是个副作用,其实就相当于让父子元素外边距不相邻了
  • 其实,不用上面的BFC也能完美解决这个问题,效果如下:

在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>01_BFC_演示1</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        .outer {
            width: 400px;
            background-color: #888;
            
        }

		/* 既能解决父子元素相邻外边距问题,
		   又能解决子元素浮动造成父元素高度的塌陷问题 */
        .clearfix::before,
        .clearfix::after {
            content: "";
            display: table;
            clear: both;
        }


        .inner {
            width: 100px;
            height: 100px;
            margin: 20px;
        }
        .inner1 {
            background-color: orange;
        }
        .inner2 {
            background-color: green;
        }
        .inner3 {
            background-color: deepskyblue;
        }
    </style>
</head>
<body>

    <div class="outer clearfix">
        <div class="inner inner1"></div>
        <div class="inner inner2"></div>
        <div class="inner inner3"></div>
    </div>
    
    <hr style="height: 50px; background-color: red;">
</body>
</html>

演示2

被浮动元素覆盖问题

  • box1浮动起来,这样,自然box2就顶山去了,但是box1盖在了box2的上面,这样就是1个问题了
    在这里插入图片描述
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>02_BFC_演示2</title>
    <style>
    
        body {
            margin: 0;
        }
        .outer {
            border: 2px solid red;
        }
        
        .box1 {
            width: 100px;
            height: 100px;
            background-color: orange;
            float: left;
        }
        
        .box2 {
            width: 120px;
            height: 120px;
            background-color: green;
            
        }
    </style>
</head>
<body>
    <div class="outer">
        <div class="box1"></div>
        <div class="box2"></div>
    </div>
</body>
</html>

使用BFC解决问题

例1
  • 让box2也浮动起来,这样box1就盖不到box2(纳闷:这不就2个浮动的么,开啥BFC),反正box2是通过浮动开启了BFC,box1就休想盖到box2上面,这也符合BFC解决问题的范畴
    在这里插入图片描述
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>02_BFC_演示2</title>
    <style>
        body {
            margin: 0;
        }
        .outer {
            border: 2px solid red;
        }
        .box1 {
            width: 100px;
            height: 100px;
            background-color: orange;
            float: left;
        }
        .box2 {
            width: 120px;
            height: 120px;
            background-color: green;
            float: left;
        }
    </style>
</head>
<body>
    <div class="outer">
        <div class="box1"></div>
        <div class="box2"></div>
    </div>
</body>
</html>
例2
  • box2直接设置绝对定位,box1确实无法盖住box2,因为box2已经把box1给盖住了
    在这里插入图片描述
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>02_BFC_演示2</title>
    <style>
        body {
            margin: 0;
        }
        .outer {
            border: 2px solid red;
        }
        .box1 {
            width: 100px;
            height: 100px;
            background-color: orange;
            float: left;
        }
        .box2 {
            width: 120px;
            height: 120px;
            background-color: green;
            
            position: absolute;
            opacity: 0.6;
           
        }
    </style>
</head>
<body>
    <div class="outer">
        <div class="box1"></div>
        <div class="box2"></div>
    </div>
</body>
</html>
例3
  • 现在给box2设置inline-block,由于box2开启了BFC,那么box1就无法盖住box2(浮动本来就是用来作文字环绕的),但是下面有1个小缝
    在这里插入图片描述
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>02_BFC_演示2</title>
    <style>
        body {
            margin: 0;
        }
        .outer {
            border: 2px solid red;
        }
        .box1 {
            width: 100px;
            height: 100px;
            background-color: orange;
            float: left;
        }
        .box2 {
            width: 120px;
            height: 120px;
            background-color: green;
           
            display: inline-block;
           
        }
    </style>
</head>
<body>
    <div class="outer">
        <div class="box1"></div>
        <div class="box2"></div>
    </div>
</body>
</html>
例4
  • 给box2设置overflow为auto,浮动的box1没有盖住box2,并且下面也是没有缝隙的(相比例3中中设置box2的display为inline-block)

在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>02_BFC_演示2</title>
    <style>
        body {
            margin: 0;
        }
        .outer {
            border: 2px solid red;
        }
        .box1 {
            width: 100px;
            height: 100px;
            background-color: orange;
            float: left;
        }
        .box2 {
            width: 120px;
            height: 120px;
            background-color: green;
          
            overflow: auto;
          
        }
    </style>
</head>
<body>
    <div class="outer">
        <div class="box1"></div>
        <div class="box2"></div>
    </div>
</body>
</html>
延申(左右布局)
  • 既然浮动元素不能盖住开启了BFC的元素,而且在例4中,我们看到浮动元素box1和overflow:hidden的box2元素处于同一行,那么如果我们不给box2设置宽度,又会怎么样呢?如下,我们可以做成基本的左右布局效果。
  • 下面,我们不设置box2的宽度(不要设置为100%),并且,设置box2的overflow:auto或hidden都可以
    在这里插入图片描述
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>02_BFC_演示2</title>
    <style>
        body {
            margin: 0;
        }
        .outer {
            border: 2px solid red;
        }
        .box1 {
            width: 100px;
            height: 100px;
            background-color: orange;
            float: left;
        }
        .box2 {
            height: 120px;
            background-color: green;
          
            overflow: auto;
          
        }
    </style>
</head>
<body>
    <div class="outer">
        <div class="box1"></div>
        <div class="box2"></div>
    </div>
</body>
</html>

演示3

浮动造成父元素高度塌陷问题

  • 当父元素未设置高度,子元素又都浮动起来,这个时候父元素的高度就会塌陷,这种情况,也可以使用上面提到的完美解决塌陷问题的方案,但在这里,我们通过开启父元素的BFC解决

使用BFC解决问题

在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>03_BFC_演示3</title>
    <style>
        body {
            margin: 0;
        }
        .outer {
            width: 400px;
            background-color: #888;
            /* float: left; */
            /* position: absolute; */
            /* display: inline-block; */
            /* display: table; */
            /* overflow: auto; */
            /* column-count: 1; */
            /* display: flow-root; */
        }
        .inner {
            width: 100px;
            height: 100px;
            float: left;
        }
        .inner1 {
            background-color: orange;
        }
        .inner2 {
            background-color: green;
        }
    </style>
</head>
<body>
    <div class="outer">
        <div class="inner inner1"></div>
        <div class="inner inner2"></div>
    </div>
</body>
</html>

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

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

相关文章

LeetCode 2415. 反转二叉树的奇数层:深度优先搜索(DFS)

【LetMeFly】2415.反转二叉树的奇数层&#xff1a;深度优先搜索(DFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/reverse-odd-levels-of-binary-tree/ 给你一棵 完美 二叉树的根节点 root &#xff0c;请你反转这棵树中每个 奇数 层的节点值。 例如&#xff0c…

leetcode面试经典二分系列刷题心得

闲来无事巩固算法基础&#xff0c;发现自己的二分几乎从来没系统刷过题&#xff0c;基础很是薄弱。 二分法不愧称为新人杀手&#xff0c;刷起来很是吃力&#xff0c;感觉明明学了几套二分模板&#xff0c;但是却不知道如何去运用&#xff0c;很多读者在初次尝试刷二分题时候&a…

“你基础不太行啊”

一、创建对象的五种方式 直接new关键字反序列化clone反射class.newInstance反射class.getConstructor 1.1、直接new关键字 1.2、Clone &#xff08;需要实现Cloneable接口&#xff09; 1.3、反射class.newInstance 1.4、反射class.getConstructor 1.5、反序列化 二、与equals…

bottom-up-attention-vqa-master 成功复现!!!

代码地址 1、create_dictionary.py 建立词典和使用预训练的glove向量 &#xff08;1&#xff09;create_dictionary() 遍历每个question文件取出所关注的question部分&#xff0c;qs 遍历qs&#xff0c;对每个问题的文本内容进行分词&#xff0c;并将分词结果添加到字典中&…

小红书商品详情API:电商助力

一、引言 随着互联网的普及和电商行业的快速发展&#xff0c;消费者对于商品信息的获取方式也在不断变化。小红书作为一款以内容分享为主的社交电商平台&#xff0c;吸引了大量用户。为了满足用户对商品信息的快速获取需求&#xff0c;小红书提供了商品详情API接口。本文将探讨…

离散型概率密度函数的分布列⇔分布函数

目录 一、super误区 1.分布函数的定义 二、分布列⇒分布函数 二、分布列⇐分布函数 一、super误区 我在读定义的时候陷入了一个误区&#xff0c;与大家分享一下。 1.分布函数的定义 由于是离散型的概率密度函数&#xff0c;我把他抽象到数轴上理解&#xff1a; 如下分布…

线程的介绍

首先我们来了解一下线程是什么&#xff1a; 首先我们介绍一下程序是什么&#xff1f;程序就是我们编写的代码就叫程序&#xff0c;当我们程序运行的时候则称为进程&#xff0c;在我们现实生活中哪些用到了进程&#xff0c;就比如说我们qq&#xff0c;微信&#xff0c;百度网盘…

兼容性测试:确保系统在各种环境中正常运行

随着数字化时代的到来&#xff0c;软件应用在不同的设备、操作系统和浏览器上运行的需求变得日益重要。为了确保用户体验的一致性和系统的稳定性&#xff0c;兼容性测试变得至关重要。本文将介绍如何使用兼容性测试&#xff0c;以保证软件在各种环境中无缝运行。 1. 确定目标平…

ssl证书问题导致本地启动前端服务报500

报错如下&#xff1a;注意查看报错信息 问题&#xff1a;系统原是http&#xff0c;后台调整为https后&#xff0c;ssl证书有点问题&#xff0c; vue项目本地服务&#xff0c;使用代理&#xff0c;webpack默认&#xff0c;证书强校验&#xff0c;导致请求无法发出&#xff0c;后…

Linear classifiers——线性分类器

1.(Generalized) Linear classifiers——广义线性分类器 1.1 模型 假如有两类数据&#xff0c;类别标签为y 1和y -1 我们可以使用一个线性函数将其分类&#xff0c;二维形式 通常x增加一个恒等于1的维度&#xff0c;可以将b合并进w&#xff0c;于是更一般的形式为 ,就相当于…

centos离线安装mosquitto

1.x86_64架构centos7操作系统mosquitto包 本次真正要安装的机器是x86_64架构的AMD Ryzen 3 &#xff0c;操作系统是centos7 先找一台能联网的centos7机器 添加 EPEL 软件库 yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm下载rpm包 …

C++使用UDP

C使用UDP 对C使用UDP做了简单封装&#xff0c;可直接运行 头文件udp.h #pragma once #include <Winsock.h> #pragma comment(lib,"WS2_32.lib")#define LOCAL_IP_ADDR INADDR_ANY //当前应用程序接收的IP地址 #define LOCAL_PORT 9527 …

PixPin带有截图/贴图/长截图/文字识别/标注的截图工具,很好用

官网地址&#xff1a;PixPin 截图/贴图/长截图/文字识别/标注 | PixPin 截图/贴图/长截图/文字识别/标注 确实挺好用的&#xff0c;推荐一下

UE4 实用材质图形

渐变圆 光晕效果&#xff1a; 十字光晕&#xff1a;

1840_emacs org-mode babel的语言支持

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/g_org: my learning trip for org-mode 1840_emacs org-mode babel的语言支持 主题由来介绍 Babel是org-mode中支持文学式编程以及可重现研究的一个核心模块&#xff0c;之前看过这个插件的优点是功能完善且支持的语…

本地运行大语言模型并可视化(Ollama+big-AGI方案)

目前有两种方案支持本地部署&#xff0c;两种方案都是基于llamacpp。其中 Ollama 目前只支持 Mac&#xff0c;LM Studio目前支持 Mac 和 Windows。 LM Studio&#xff1a;https://lmstudio.ai/ Ollama&#xff1a;https://ollama.ai/download 本文以 Ollama 为例 step1 首先下…

在datagridview列显示下拉操作

DataGridViewComboBoxExColumn 设定好类型 需要设置的地方是&#xff1a; 绑定数据的操作&#xff1a; 因为此处绑定数据实际为数据 参数 显示的操作&#xff0c;不影响datasource的数据绑定 下一步 数据绑定&#xff1a; DGVCOrderZhuangtai.ValueType typeof(EOrderZhuan…

条件概率密度

设二维随机变量的概率密度为&#xff0c;关于的边缘概率密度为。若对于固定的&#xff0c;有&#xff0c;则称为在条件下的的条件概率密度&#xff0c;记为&#xff1a;

产业元宇宙推动内容供应链:元宇宙产业对企业商业性的影响

随着科技的迅速发展和创新&#xff0c;元宇宙产业已经成为全球关注的热点话题。元宇宙是一种虚拟的数字世界&#xff0c;通过各种技术和设备&#xff0c;人们可以在其中创建、体验和互动&#xff0c;为企业提供了前所未有的商业机会。本文将探讨产业元宇宙如何推动内容供应链&a…

函数和函数表达式

我们先来看三个式子 1️⃣ yf(x) 2️⃣ f(x)2x1 3️⃣ y2x1 先来明确一下概念&#xff0c;这三个式子的&#x1f7f0;两边总共有3种表达形式 y是函数最终输出的值f(x) 是整个函数运算过程2x1是具体的表达式 那么这三个式子分别是什么意思呢&#xff1f; yf(x)是对函数关系的…