学习过CSS,那你知道BFC是什么吗?(上)

简介: 虽然可能你没听过BFC是什么,但是你一定用过,其是一种在CSS中存在的技术,你可能只是一直不知道有这样一个专业名词,本文就来介绍一下到底什么是BFC

一、什么是BFC


首先引用一下WC3对BFC的专业解释


「BFC」(Block Formatting Context):翻译成中文叫做块级格式化上下文,它决定了元素如何对其内容进行定位,以及与其它元素的关系和相互作用,当涉及到可视化布局时,其提供了一个环境,元素在这个环境中按照一定的规则进行布局排列


换句话说,BFC就是为元素提供一个独立的容器,在该容器里按照一定的规则进行布局排列,该容器内的元素不会影响外部的元素,同理,外部的元素也不会影响内部的元素


二、如何触发BFC


先来了解一下有哪些条件可以触发BFC:


  1. float 不为 none


  1. positionabsolutefixed


  1. overflow 不为 visible


  1. displayinline-blocktableflow-root


后续的案例中,但凡遇到需要触发BFC的,都可以按照这四个条件来使用


三、BFC的相关案例


官方的解释非常的难以理解,那么我们就用几个例子来详细了解BFC的使用


(1)清除浮动


首先来看一个例子


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>浮动</title>
    <style>
        .parent{
            width: 350px;
            background-color: red;
        }
        .child{
            float: left;
            width: 100px;
            height: 100px;
            line-height: 100px;
            text-align: center;
            background-color: lightblue;
        }
    </style>
</head>
<body>
    <div class="parent">
        <div class="child1 child">1</div>
        <div class="child2 child">2</div>
        <div class="child3 child">3</div>
        <div class="child4 child">4</div>
    </div>
</body>
</html>


该html文档在浏览器中的样式如下图所示


5a4e4ee0718199c849f3751c642548f7.png


很明显,这是一个子元素浮动无法撑开父元素的例子


产生这种情况的原因很简单,有以下两点:


  1. 父元素没有设置 height


  1. 子元素设置了 float 浮动,脱离了文档流


因子元素脱离了文档流,父元素无法统计到子元素的大小,因此子元素无法将父元素撑开,所以我们就要将浮动清除


那么我们平时是如何「清除浮动」的呢?最常见的可能就是给父元素添加样式 overflow: hidden 了,其实这种方法就触发了BFC,在父元素内部形成了一个独立的环境,按照BFC的布局规则,该容器内的元素都会被统计到,因此浮动就被清除了


清除浮动后的效果如下图所示


520341ed820a7aeed8d325b86ba447c5.png


其实通过我们上述说到的触发BFC的条件都可以实现上述效果,这里就不做过多的展示了

既然讲到了清除浮动,我们就来看一下除了上述说到的方法,还会用到什么办法呢?


  1. 在最后一个子元素后面添加一个空元素,并给予样式 clear: both


  1. 给父元素设置一定的高度


(2)margin-top塌陷


另一个例子就是「margin-top塌陷」,如图


d1afba96910da8ac758a2827f3f2273e.png


当前子元素在父元素框内,并且上面紧贴父元素上边缘,此时我们想让子元素的上边缘与父元素的上边缘拉开一段距离,实现如下图所示的效果


36f1d3529d74f19f5a0964d2bcdd1841.png


因此我们第一个想到的就是给子元素添加 margin-top,可结果却不如人意,效果如下图所示


a7d6f89f06e55a724c8fc2abacae96c2.png


实际效果就是,我们给子元素添加了 margin-top,但却是父元素整体与上一个元素拉开了距离,这就是我们常见的 「margin-top塌陷」 的问题


很明显,对子元素进行布局时影响到了其它元素的布局,因此我们可以通过给父元素添加一定的样式来触发BFC,使其内部形成一个独立的环境,这样就不会影响到其它元素的布局了


这里再做一个补充,针对 「margin-top塌陷」,我们还可以对父元素设置一个大小不为0的边框 border,这样也能解决问题


相关文章
|
5月前
|
前端开发
5.CSS学习(浮动)
【7月更文挑战第29天】
40 4
学习CSS3 中的渐变、阴影与遮罩
CSS3的渐变、阴影和遮罩特性极大地丰富了网页设计。渐变让颜色平滑过渡,赋予页面流动美感;阴影增加元素立体感,引导视觉焦点;遮罩通过隐藏或显示部分元素创造独特视觉效果。这些特性组合使用,可打造丰富多彩、立体生动的视觉体验,并可通过CSS3动画增强动态效果,使网页更具活力。正确应用这些特性需考虑参数调整及跨浏览器兼容性,以确保最佳展示效果。
|
3月前
|
前端开发
|
3月前
|
Web App开发 移动开发 自然语言处理
|
5月前
|
前端开发
学习css的clip-path属性
【7月更文挑战第1天】了解CSS `clip-path`属性,用于定义元素显示区域的裁剪形状,如圆形、椭圆、多边形、矩形及SVG路径。通过配合过渡和动画,可创建动态交互效果。例如,`clip-path: circle(radius at center);`用于创建圆形裁剪,`polygon`用于自定义多边形。还可以使用`path()`引用SVG路径数据。[资源推荐:bennettfeely.com/clippy/](https://bennettfeely.com/clippy/),提供交互式工具测试不同形状。
93 0
学习css的clip-path属性
|
5月前
|
前端开发 JavaScript 开发者
学习CSS动画的高级技巧
【7月更文挑战第1天】学习CSS动画的高级技巧
49 2
|
5月前
|
前端开发 容器
css【详解】—— BFC 和 IFC
css【详解】—— BFC 和 IFC
43 1
|
5月前
|
前端开发 JavaScript 开发者
如何学习CSS动画?
【7月更文挑战第1天】如何学习CSS动画?
36 1
|
5月前
|
JavaScript 前端开发 Java
前端网页开发学习(HTML+CSS+JS)有这一篇就够!(二)
前端网页开发学习(HTML+CSS+JS)有这一篇就够!(二)
|
5月前
|
前端开发 数据安全/隐私保护
前端网页开发学习(HTML+CSS+JS)有这一篇就够!(一)
前端网页开发学习(HTML+CSS+JS)有这一篇就够!(一)