zoukankan      html  css  js  c++  java
  • BFC是什么

    BFC  (Block Fomatting Context)

    一、定义

    块级格式化上下文。 block-level box(块级元素) + formatting context(一个决定如何渲染文档的容器) 。

    它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

    Box 定义:

    css布局的对象和基本单位。不同类型box内的元素会以不同的方式渲染。

    Box分类:

    1、display属性为 block, list-item, table 的元素,会生成block-level box;并且参与 block fomatting context

    2、display 属性为 inline, inline-block, inline-table 的元素,会生成inline-level box。并且参与 inline formatting context

    Fomatting Context 

    Formatting context是W3C CSS2.1规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系、相互作用。

    最常见的 Formatting context 有 Block fomatting context (简称BFC)Inline formatting context(简称IFC)

    二、BFC布局规则

    1、内部的Box会在垂直方向上一个接一个的放置。

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

    3、每个元素的左外边距与包含块(父元素)的左边界相接触(从左向右时),即使浮动元素也是如此。

    4、BFC的区域不会与float的元素区域重叠

    5、计算BFC的高度时,浮动子元素也参与计算

    6、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素,反之亦然。

    三、BFC的创建

    1、float的值不是none。

    2、position的值不是static或者relative。

    3、display的值是inline-block、table-cell、flex、table-caption或者inline-flex    注:display:table也认为可以生成BFC,主要原因在于table会默认生成一个匿名的table-cell,正是这个匿名的table-cell生成了BFC

    4、overflow的值不是visible

    5、根元素会自动创建BFC

    语言描述:浮动元素和绝对定位元素,非块级盒子的块级容器,以及overflow值不为“visiable”的块级盒子,都会为他们的内容创建新的BFC(块级格式上下文)。

    四、BFC的应用

    1、利用BFC避免margin重叠

      场景:一个div内俩个p子元素设置了margin:10px,结果会显示俩个子元素垂直方向间距为10px,实际应为20px  注意:如果第一个p子元素margin:8px;那么子元素垂直方向间距为10px,以最大数值为准。      

      原因:属于同一个BFC的两个相邻的Box会发生margin重叠     

      解决:将第二个子元素放进新的div标签内,相当于激活第二个子元素在一个新的BFC内    或者  将2个子元素设置display:inline-block;此时每个子元素都生成一个BFC  

      解决原理:生成 BFC 的元素不会和在流中的子元素发生空白边折叠

    2、自适应俩栏布局

      场景:一个div内有div.left和div.right,其中.left设置width,height,float:left; .right只设置高度,会出现div.left和div.right的左上角是重合的。

      原因:每个盒子的margin box的左边,与包含块(父块)border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此(尽管一个元素的内容区域会由于浮动而压缩–包裹性)。

      解决:.right添加overflow:hidden,使之单独成为一个BFC。 同时.right会自动的适应宽度,这时候就形成了一个两栏自适应的布局。

      解决原理:BFC的区域不会与float box重叠。

      多栏布局同理,可以.left{float:left;xxpx;} .right{float:right;xxpx;}  .center{overflow:hidden;height:yypx;}  会实现 左右两栏宽度固定,中间栏根据浏览器宽度自适应。

    3、清除浮动

      场景:父元素div只设置width,俩个div子元素设置width,height,float:left; 会出现父元素高度未随子元素展开。

      原因:当不给父节点设置高度,子节点设置浮动的时候,会发生高度塌陷

      解决:清除浮动,给父元素设置overflow:hidden;

      解决原理:计算BFC的高度时,浮动子元素也参与计算。

    总结:BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。

    因为BFC内部的元素和外部的元素绝对不会互相影响,因此, 当BFC外部存在浮动时,它不应该影响BFC内部Box的布局,BFC会通过变窄,而不与浮动有重叠。同样的,当BFC内部有浮动时,为了不影响外部元素的布局,BFC计算高度时会包括浮动的高度。避免margin重叠也是这样的一个道理。

     

  • 相关阅读:
    SVD与PCA
    Service(二):通信
    Service(一):认识service、绑定Service
    计划(四)
    Android studio 安装过程中遇到的问题
    UFLDL 教程学习笔记(四)
    opencv之dft及mat类型转换
    《第一行代码》(四)
    《第一行代码》
    计划(三)
  • 原文地址:https://www.cnblogs.com/redFeather/p/15109429.html
Copyright © 2011-2022 走看看