前端必知必会-BFC案例剖析

简介: 前端必知必会-BFC案例剖析

前端必知必会-BFC案例剖析

简介

在说 BFC 之前,我们先来了解一下标准文档流,标准文档流是指在页面中所有的元素按照从左到右,从上到下这样的一个顺序来进行排列的。

这里的标准文档流其实就是格式化上下文( Formatting Context ),那么什么又是格式化上下文呢,让我们接着往下看。

格式化上下文(Formatting Context)

格式化上下文,简单来说就是一个独立的渲染区域,在这个渲染区域中的元素会按照它的一个渲染规则来进行排列。

标准文档流中的盒子其实就是格式化上下文,只不过它包括块级格式化上下文以及行级格式化上下文,不同格式化上下文的渲染规则不同,它决定了它的子元素按照什么样的规则来排列,以及和其他元素的关系和相互作用。这里需要注意的就是不同的格式化上下文所针对的元素种类也不同。

常见的格式化上下文有以下四种。

  • 【Block formatting context】 BFC 块级格式化上下文

这里的BFC就是我们今天的重点,BFC只针对块级元素

  • 【Inline formatting context】(IFC) 行级格式化上下文

IFC只针对行级元素

  • 【Grid formatting context】(GFC) 网格布局格式化上下文

我们可以在网格容器上定义网格行和网格列

  • 【Flex formatting context】(FFC) 自适应格式上下文

当我们使用 Flex 弹性盒子布局实际上就是声明创建了 FFC

什么是BFC?

说了那么多的废话终于到我们今天的主题了,相信看了上面的一些介绍大家应该对 BFC 多多少少有一些了解了吧。

没错, BFC 块级格式化上下文,页面中独立的一块渲染区域,只作用于块级元素,内部的所有块级元素会按照它的一套渲染规则来排列。

如何创建BFC?

既然知道 BFC 是什么了,那么如何创建一个 BFC 呢?

我们来看看 w3cBFC 的定义

Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, 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.

看不懂没关系,我们来简单的罗列一下。只要满足下面的任何一个条件都可以触发 BFC

  • body 根元素
  • 浮动元素:floatnone 以外的值
  • 绝对定位元素:position ( absolute、fixed )
  • displayinline-block、table-cells、flex
  • overflow 除了 visible 以外的值 ( hidden、auto、scroll )

BFC特性

说了这么多东西,那么有的人可能会问了,BFC 到底可以用来干什么呢,或者说它可以解决什么问题,当我们了解了它的特性就会清楚了。

  • 内部的 Box 会在垂直方向上一个接一个的放置
  • 块级格式化上下文中相邻的盒子之间的垂直边距折叠
  • 每个元素的左外边距与包含块的左边界相接触(从左向右),即使浮动元素也是如此。(这说明 BFC 中子元素不会超出他的包含块,而positionabsolute 的元素可以超出他的包含块边界)
  • BFC的区域不会与 float 的元素区域重叠
  • 计算 BFC 的高度时,浮动子元素也参与计算
  • BFC 就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素,反之亦然

BFC的作用及会产生的问题

上下margin合并

.box1{
            width: 200px;
            height: 200px;
            background: cyan;
            margin-bottom: 30px;
            text-align: center;
        }
.box2{
            width: 200px;
            height: 200px;
            margin-top: 20px;
            background: cyan;
            text-align: center;
        }
<div class="box1">第一个盒子</div>
    <div class="box2">第二个盒子</div>

在上面的例子中我们可以看到,我们给第一个盒子设置下边距 30px ,第二个盒子上边距设置 20px ,按照理论来说,这两个盒子的实际间距应该为 30+20 也就是 50px ,但事实上是这两个盒子的距离只有 30px ,为什么呢。

首先我们的节点是添加在 body 下的,这时候其实已经创建了 BFC 的渲染区域,然后再来看 BFC 特性第二条,块级格式化上下文中相邻的盒子之间的垂直边距折叠,也就是说这时候的上下 margin 发生了重叠,并且只会选用较大的 margin

那么怎么解决这个问题呢,这时候我们只要给其中一个元素创建一个 BFC 的渲染区域就可以,为什么?我们来看 BFC 特性最后一条,每个 BFC 都是独立的,不会与外界元素互相影响。我们直接给 box2 上添加一个 position: absolute 就可以了

高度塌陷

.box{
      background: red;
     }
 .item{
        width: 100px;
        height: 100px;
        float: left;
      }
<div class="box">
        <div class="item">内部的盒子</div>
    </div>

这个问题应该遇到的会比较多点,子元素浮动之后撑不开父元素的高度,这时候我们给父元素创建一个 BFC 就可以了。运用的是 BFC 特性的第5条,计算BFC的高度时,浮动子元素也会计算。我们这里给父元素添加一个 overflow:hidden 这时候父元素的高度就会有了。

其实还有其他一些由于 BFC 引发的问题,由于时间原因,这里我就不一一举例了,有兴趣的朋友可以把其他情况通过邮箱告诉我,我会添加上去。

目录
相关文章
|
2月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
上下文选择器(迭代选择器):基于祖先或同胞元素选择一个元素 ID和类选择器:基于id#和class的属性值进行选择元素。 属性选择器:基于属性的有无和特征进行选择。 ①上下文选择器: 上下文选择器的语法格式:标签1 标签2{属性:值;} //注意:组合选择器和上下文选择器的区别,组合选择器以逗号隔开, 上下文选择器以空格隔开 ②特殊的上下文选择器 子选择器> : 语法格式:标签1>标签2 解释说明:标签1和标签2
225 0
|
前端开发 JavaScript
前端一键回到顶部案例
本文介绍了如何实现网页中的一键回到顶部功能,包括两种方法:第一种是通过HTML中的锚点跳转实现快速回到顶部;第二种是使用JavaScript的`scrollTo`方法结合`requestAnimationFrame`实现滚动动画效果,让页面滚动更加平滑自然。
478 1
前端一键回到顶部案例
|
前端开发 数据安全/隐私保护
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
本文档详细介绍了HTML表单的多种元素及其用法,包括下拉菜单(`&lt;select&gt;` 和 `&lt;option&gt;`)、文本域(`&lt;textarea&gt;`)、标签解释(`&lt;label&gt;`)、各类按钮(`&lt;button&gt;`)及表单重置功能、无语义布局标签(`&lt;div&gt;` 和 `&lt;span&gt;`)以及字符实体的应用。此外,还提供了一个完整的注册信息表单案例,涵盖个人信息、教育经历和工作经历等部分,展示了如何综合运用上述元素构建实用的表单。
285 6
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
2267 0
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
前端开发
【前端web入门第五天】03 清除默认样式与外边距问题【附综合案例产品卡片与新闻列表】
本文档详细介绍了CSS中清除默认样式的方法,包括清除内外边距、列表项目符号等;探讨了外边距的合并与塌陷问题及其解决策略;讲解了行内元素垂直边距的处理技巧;并介绍了圆角与盒子阴影效果的实现方法。最后通过产品卡片和新闻列表两个综合案例,展示了所学知识的实际应用。
336 11
|
JSON 前端开发 JavaScript
socket.io即时通信前端配合Node案例
本文介绍了如何使用socket.io库在Node.js环境下实现一个简单的即时通信前端配合案例,包括了服务端和客户端的代码实现,以及如何通过socket.io进行事件的发送和监听来实现实时通信。
303 2
|
JavaScript 前端开发
前端基础(十)_Dom自定义属性(带案例)
本文介绍了DOM自定义属性的概念和使用方法,并通过案例展示了如何使用自定义属性来控制多个列表项点击变色的独立状态。
199 0
前端基础(十)_Dom自定义属性(带案例)
|
前端开发 数据可视化 容器
前端基础(十六)_BFC、box-shadow(盒子阴影)、text-shadow(文字阴影)
本文介绍了前端开发中块级格式化上下文(BFC)的概念和作用,以及如何创建BFC。同时,文章还讲解了`box-shadow`和`text-shadow`属性的用法,包括如何为元素添加阴影效果,并通过示例代码展示了这些属性的具体应用。
234 0
前端基础(十六)_BFC、box-shadow(盒子阴影)、text-shadow(文字阴影)
|
JavaScript 前端开发
【前端web入门第一天】03 综合案例 个人简介与vue简介
该网页采用“从上到下,先整体再局部”的制作思路,逐步分析并编写代码实现个人简介页面。内容涵盖尤雨溪的背景、学习经历及主要成就,同时介绍其开发的Vue.js框架特点。代码结构清晰,注重细节处理,如使用快捷键提高效率,预留超链接位置等,确保最终效果符合预期。
293 7
|
前端开发
前端web入门第四天】03 显示模式+综合案例热词与banner效果
本文档介绍了HTML中标签的三种显示模式:块级元素、行内元素与行内块元素,并详细解释了各自的特性和应用场景。块级元素独占一行,宽度默认为父级100%,可设置宽高;行内元素在同一行显示,尺寸由内容决定,设置宽高无效;行内块元素在同一行显示,尺寸由内容决定,可设置宽高。此外,还提供了两个综合案例,包括热词展示和banner效果实现,帮助读者更好地理解和应用这些显示模式。
177 6

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
  • 10
    【面试题】20个常见的前端算法题,你全都会吗?
  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    510
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    191
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    189
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    145
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    251
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    359
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    157
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    95
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    160
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    225