深入学习前端开发笔记2--BFC

本文深入探讨了BFC(块级格式化上下文)的概念及其在CSS布局中的应用,包括解决margin重叠、浮动元素引起的布局问题等。通过理解Box与Formatting Context,读者将掌握如何利用BFC进行更高效的网页设计。

先看下面这个例子:

<div class="parent">
   <div class="child"></div>
</div>
       .parent{

            background: bisque;
            min-height: 20px;
            border: 10px solid red;
        }
        .child{
            width: 500px;
            height: 300px;
            padding: 3px;
            background: blueviolet;
        }

运行结果如下,子元素把父元素撑开,被父元素包裹在内部。

假设给子元素一个float,

可以看到子元素脱离了文档流,但我们仍然希望父元素包裹住子元素怎么办?

让父元素产生一个BFC。

什么是BFC?

 

在解释 BFC 是什么之前,需要先介绍 Box、Formatting Context的概念。

  Box: CSS布局的基本单位

  Box 是 CSS 布局的对象和基本单位, 直观点来说,就是一个页面是由很多个 Box 组成的。元素的类型和 display 属性,决定了这个 Box 的类型。 不同类型的 Box, 会参与不同的 Formatting Context(一个决定如何渲染文档的容器),因此Box内的元素会以不同的方式渲染。让我们看看有哪些盒子:

  • block-level box:display 属性为 block, list-item, table 的元素,会生成 block-level box。并且参与 block fomatting context;
  • inline-level box:display 属性为 inline, inline-block, inline-table 的元素,会生成 inline-level box。并且参与 inline formatting context;
  • run-in box: css3 中才有, 这儿先不讲了。

  Formatting context

  Formatting context 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。最常见的 Formatting context 有 Block fomatting context (简称BFC)和 Inline formatting context (简称IFC)。

  CSS2.1 中只有 BFC 和 IFCCSS3 中还增加了 GFC 和 FFC。

BFC 定义

  BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

 

BFC布局规则:

  1. 内部的Box会在垂直方向,一个接一个地放置。
  2. Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
  3. 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  4. BFC的区域不会与float box重叠。
  5. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
  6. 计算BFC的高度时,浮动元素也参与计算

哪些元素会生成BFC?

  1. 根元素自带隐藏BFC属性
  2. float属性不为none
  3. position为absolute或fixed
  4. display为inline-block, table-cell, table-caption, flex, inline-flex

BFC 特性(功能)

  1. 使 BFC 内部浮动元素不会到处乱跑;
  2. 和浮动元素产生边界。

BFC可以解决的问题:

1.(BFC与margin)同一个父级块框下,兄弟元素和父子元素的margin会发生重叠问题

2.(BFC与float)父元素高度塌陷问题、兄弟元素覆盖问题

BFC与margin

margin重叠的解决方法:让元素处于不同的BFC属性环境下。

兄弟元素

在同一个父级块框下,兄弟元素和父子元素的margin会发生重叠,并且这种重叠会遵循一定得规则:同号取大,异号相加。具体可以看看关于margin的介绍。传送门:CSS margin

兄弟元素的margin重叠的解决方法:任一个兄弟元素的属性设置如下:

float:left|right或者position:absolute|fixed或者display:inline-block|table-cell|table-caption

父子元素

父子元素的margin重叠解决方法:父元素设置以下任意属性:overflow:hidden|auto|scroll,或者给父元素设置paddingborder属性。

如果元素没有垂直border或者padding,那么父元素的高度就是它包含的子元素的顶部和底部边框边缘之间的距离。因此,包含的子元素的顶部和底部外边距就突出到容器元素的外边。因此,可以通过添加垂直border或者padding,外边距就不会叠加了,而且父元素的高度就是它包含的子元素的顶部和底部外边距边缘之间的距离。

.father { 
    backgrund:blue;
    width:500px;
    height:50px;
    margin-top:15px;
    overflow:hidden; //padding:1px;  //border:1px solid green;
}
.child {
    height:30px;
    width:500px;
    background:pink;
    margin-top:15px;    
}


BFC与浮动

兄弟元素

在两个兄弟元素a和b中,如果a元素设置了float属性,b元素的布局会受到影响,此时a元素会覆盖在b元素上,如果b元素存在文字,那么文字会环绕a元素显示。

<div class="float"></div>
<div class="clearfloat">
    没有设置overflow:hidden|auto|scroll;没有设置overflow:hidden|auto|scroll;没有设置overflow:hidden|auto|scroll;
</div>

<div class="float"></div>
<div class="clearfloat">
    设置overflow:hidden|auto|scroll设置overflow:hidden|auto|scroll设置overflow:hidden|auto|scroll空空空空补充内容
</div>

使其中一个兄弟元素触发BFC之后就不会被其浮动元素覆盖,使用这种float+overflow的方式可以实现一侧固定,一侧自适应的布局效果。

父子元素

BFC与浮动如果针对父子元素,当然是解决父元素高度塌陷的问题了。

在W3C中指出 'Auto' heights for block formatting context roots。

也就是BFC会根据子元素的情况自动适应高度,即使其子元素中包括浮动元素。

给父元素设置以下任意属性,触发BFC隐藏属性: overflow:hidden|auto|scroll 、 position:absolutefloat:left|rightdisplay:inline-block

父元素触发BFC隐藏属性前

父元素触发BFC隐藏属性后

 

源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值