bfc

文章目录

BFC

display 为 block, list-item, table 都是块元素。

只有块元素才可能触发 BFC。

  • 根元素
  • float 不为 none (每个浮动元素都是一个独立的 BFC, 他们的 margin 不会重叠)
  • display 为 inline-block, table-cell, table-caption, flex, inline-flex
  • overflow 不是 visible
  • position 不为 static 或者 relative

特性

  1. BFC 中,盒子从顶部开始垂直一个一个排列。

  2. 垂直方向的距离由 margin 决定。属于同一个BFC的两个相邻盒子的 margin 会发生重叠

  3. BFC 中子元素的 margin-left 会碰到父元素的 margin-left

  4. 计算 BFC 高度时,浮动元素和定位元素也参与计算。

  5. BFC 的区域不会与浮动盒子产生重叠,而是紧贴浮动边缘。

  6. BFC 是一个独立容器,里面的元素不会影响到外面的元素,外面的也无法影响里面的

使用

  1. 清浮动

    只要把父元素设为 BFC 就可以清浮动了,因为计算BFC高度时,浮动元素也会参与到高度计算中

  2. 解决边距重合问题

    两个块元素垂直方向 margin 重叠,只要两个块元素不属于同一个 BFC 即可。 同一个 BFC,相邻的两个盒子 BFC 会发生重叠,因为一般两个盒子都在 <body> 这个 BFC 中,它默认就是一个 BFC 元素,所以里面的元素需要自己改成不同的 BFC

  3. 制作右侧自适应盒子

    普通流元素 BFC 后,为了不予浮动元素产生交集,会顺着浮动边缘形成自己的封闭上下文

    image-20200515111115694

    如图,p 元素变成 BFC 后,绕着绿色的浮动元素边缘。右侧宽度自适应,与浮动元素同行展示,

    image-20200515111746878

    这是不加 BFC 时,p 与浮动元素重叠了。

  4. 父元素与第一个子元素的上外边距发生合并

    给子元素或者父元素创建 BFC,子元素不能使用 overflow 生成 BFC,其他无限制,或给子元素外面套一个 BFC。能用这个方法解决的原因大概是 BFC 的内容不能影响到 BFC 之外的元素,网上搜了一圈没有找到解释,自己猜的

(或者给父元素添加 padding-top 或者 border-top,也可以解决。 因为第一个子元素的 border-top 会先去看看有没有能限制它位置的东西,先找父元素的 padding-top,再去找 border-top,如果都没有,那就肆无忌惮自己顶出去了。。所以只要给父元素加一个边界就能卡住子元素的外边距)

总结

BFC 就是页面上的独立容器,里面的元素不会影响外面的元素,了解了之后,就可以轻松解决浮动和外边距合并带来的布局问题,只要给他们都加上一个 BFC 的父元素,或者把它们变成 BFC 即可。

分享到:

评论完整模式加载中...如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理