BFC(Block Formatting Context)基础分析

本文探讨了BFC(块格式化上下文)在CSS布局中的应用,包括防止外边距折叠、使容器正确包含浮动元素及阻止文字环绕。通过具体实例展示了如何利用BFC特性优化网页布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

W3C官方对于BFC的描述只有3小段,强烈建议想理解BFC的朋友先去看看,链接见文末。

常见的文档流分为:定位流、浮动流、普通流3种。BFC是普通流中的一种。

本文提出3个问题并给出使用BFC来解决这些问题的方法,这3个问题是:

  1. 外边距折叠(Collapsing Margins)
  2. 让一个没有设置高度的容器包含浮动元素
  3. 阻止文字环绕

什么是BFC

根据W3C对BFC的描述,可以总结出:BFC是一个具有特殊CSS样式的HTML盒子,比如div
标签就经常用来当盒子用。
这些特殊样式如下,下面的样式只要满足一项,就说明这个盒子是BFC

  • float: left | right
  • position: fixed | absolute
  • display: inline-block | table-cell | table-caption | flex | inline-flex
  • overflow: hidden | scroll | auto

外边距折叠

外边距折叠有很多种情况,最简单的就是上下两个盒子,上面的设置了margin-bottom
下面的设置了margin-top,这时候总的外边距并不是两者相加,而是取最大的外边距作
为总的外边距。(假设外边距的设置为正值)
下面的代码发生了外边距折叠。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>外边距折叠</title>
    <style>
    .container { background-color: red; width: 200px; }
    p { background-color: lightgreen; margin: 10px 0; }
    </style>
</head>
<body>

<div class="container">
    <p>Sibling 1</p>
    <p>Sibling 2</p>
</div>

</body>
</html>

下面的代码通过使用overflow: hidden;新创建一个BFC,从而实现阻止外边距折叠。
overflow: hidden;本来的含义是:如果盒子的内容超出盒子,则这部分内容隐藏。)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>使用BFC阻止外边距折叠</title>
    <style>
    .container { background-color: red; width: 200px; }
    p { background-color: lightgreen; margin: 10px 0;}
    .newBFC {overflow: hidden; /* 这条样式专门用来创建BFC */}
    </style>
</head>
<body>

<div class="container">
    <p>Sibling 1</p>
    <div class="newBFC">
        <p>Sibling 2</p>
    </div>
</div>

</body>
</html>

发生了外边距折叠(左),使用BFC阻止外边距折叠(右)。
img img

容器无高度包含浮动元素

先看以下无BFC,容器无高度包含浮动元素会发生什么。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>无BFC容器无高度包含浮动元素</title>
    <style>
    .container { 
        width: 200px;
        background-color: green; 
        outline: 1px dashed red;
    }

    .container div {
        float: left; 
        background-color: lightgreen;
        margin: 10px;
    }
    </style>
</head>
<body>

<div class="container">
    <div>Sibling 1</div>
    <div>Sibling 2</div>
</div>

</body>
</html>

上述代码运行效果如下:

img

可以看到,由于浮动元素是脱离普通文档流的,所以.container盒子发生了塌陷,高度
变为0。如何阻止这种情况发生呢,请看下面的代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>有BFC容器无高度包含浮动元素</title>
    <style>
    .container { 
        width: 200px;
        background-color: blueviolet; 
        outline: 1px dashed red;
        overflow: hidden; /* 创建BFC */
    }

    .container div {
        float: left;
        background-color: lightgreen;
        margin: 10px;
    }
    </style>
</head>
<body>

<div class="container">
    <div>Sibling 1</div>
    <div>Sibling 2</div>
</div>

</body>
</html>

上面的代码给.container盒子添加了一条样式overflow: hidden;,解决了容器盒子
塌陷的问题。运行效果图如下:

img

阻止文字环绕

左图右文,文字环绕图片,代码实现如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>左图右文 - 文字环绕图片</title>
    <style>
    .container { 
        background-color: gainsboro; 
        width: 500px;
        min-height: 400px;
        padding: 10px
    }

    .pic {
        float: left;
        margin-right: 10px;
    }
    </style>
</head>
<body>

<div class="container">
    <div class="pic">
        <img src="5.jpg" alt="小王子">
    </div>

    <div class="text">
        《小王子》是法国作家安托万·德·圣·埃克苏佩里于1942年写成的著名儿童文学短篇小说。
        本书的主人公是来自外星球的小王子。书中以一位飞行员作为故事叙述者,讲述了小王子
        从自己星球出发前往地球的过程中,所经历的各种历险。作者以小王子的孩子式的眼光,
        透视出成人的空虚、盲目,愚妄和死板教条,用浅显天真的语言写出了人类的孤独寂寞、
        没有根基随风流浪的命运。同时,也表达出作者对金钱关系的批判,对真善美的讴歌。
        《小王子》是法国作家安托万·德·圣·埃克苏佩里于1942年写成的著名儿童文学短篇小说。
        本书的主人公是来自外星球的小王子。书中以一位飞行员作为故事叙述者,讲述了小王子
        从自己星球出发前往地球的过程中,所经历的各种历险。作者以小王子的孩子式的眼光,
        透视出成人的空虚、盲目,愚妄和死板教条,用浅显天真的语言写出了人类的孤独寂寞、
        没有根基随风流浪的命运。同时,也表达出作者对金钱关系的批判,对真善美的讴歌。
    </div>
</div>

</body>
</html>

运行效果如下:

img

有时候我们不需要文字环绕,就想让文字老老实实待在右边。
左图右文,文字不环绕图片代码实现如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>左图右文 - 文字不环绕图片</title>
    <style>
    .container { 
        background-color: gainsboro; 
        width: 500px;
        min-height: 400px;
        padding: 10px
    }

    .pic {
        float: left;
        margin-right: 10px;
    }

    .text {
        overflow: hidden;
    }
    </style>
</head>
<body>

<div class="container">
    <div class="pic">
        <img src="5.jpg" alt="小王子">
    </div>

    <div class="text">
        《小王子》是法国作家安托万·德·圣·埃克苏佩里于1942年写成的著名儿童文学短篇小说。
        本书的主人公是来自外星球的小王子。书中以一位飞行员作为故事叙述者,讲述了小王子
        从自己星球出发前往地球的过程中,所经历的各种历险。作者以小王子的孩子式的眼光,
        透视出成人的空虚、盲目,愚妄和死板教条,用浅显天真的语言写出了人类的孤独寂寞、
        没有根基随风流浪的命运。同时,也表达出作者对金钱关系的批判,对真善美的讴歌。
        《小王子》是法国作家安托万·德·圣·埃克苏佩里于1942年写成的著名儿童文学短篇小说。
        本书的主人公是来自外星球的小王子。书中以一位飞行员作为故事叙述者,讲述了小王子
    </div>
</div>

</body>
</html>

运行效果如下:

img

总结

  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素是不会影响到外面的元素。
  • BFC的区域不会与其它float的元素区域重叠。
  • 计算BFC的高度时,浮动子元素也参与计算。
资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 HttpServletRequestWrapper 是 Java Servlet API 中的一个工具类,位于 javax.servlet.http 包中,用于对 HttpServletRequest 对象进行封装,从而在 Web 应用中实现对 HTTP 请求的拦截、修改或增强等功能。通过继承该类并覆盖相关方法,开发者可以轻松地自定义请求处理逻辑,例如修改请求参数、添加请求头、记录日志等。 参数过滤:在请求到达处理器之前,可以对请求参数进行检查或修改,例如去除 URL 编码、过滤敏感信息或进行安全检查。 请求头操作:可以修改或添加请求头,比如设置自定义的 Content-Type 或添加认证信息。 请求属性扩展:在原始请求的基础上添加自定义属性,供后续处理使用。 日志记录:在处理请求前记录请求信息,如 URL、参数、请求头等,便于调试和监控。 跨域支持:通过添加 CORS 相关的响应头,允许来自不同源的请求。 HttpServletRequestWrapper 通过继承 HttpServletRequest 接口并重写其方法来实现功能。开发者可以在重写的方法中添加自定义逻辑,例如在获取参数时进行过滤,或在读取请求体时进行解密。当调用这些方法时,实际上是调用了包装器中的方法,从而实现了对原始请求的修改或增强。 以下是一个简单的示例,展示如何创建一个用于过滤请求参数的包装器: 在 doFilter 方法中,可以使用 CustomRequestWrapper 包装原始请求: 这样,每当调用 getParameterValues 方法时,都会先经过自定义的过滤逻辑。 HttpServletRequestWrapper 是 Java Web 开发中一个强大的工具,它提供了灵活的扩展性,允许开发者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值