zoukankan      html  css  js  c++  java
  • BFC和IFC

    想要理解BFC与IFC,首先要理解另外两个概念:BoxFC(即 formatting context)。

    Box

    一个页面是由很多个 Box 组成的,元素的类型和 display 属性决定了这个 Box 的类型。不同类型的 Box,会参与不同的 Formatting Context。

    Block level的box会参与形成BFC,比如display值为block,list-item,table的元素。

    Inline level的box会参与形成IFC,比如display值为inline,inline-table,inline-block的元素。

     

    FC(Formatting Context)

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

    常见的Formatting Context 有:Block Formatting Context(BFC | 块级格式化上下文) 和 Inline Formatting Context(IFC |行内格式化上下文)。

    下面就来介绍IFC和BFC的布局规则。

     

    IFC布局规则:

    在行内格式化上下文中,框(boxes)一个接一个地水平排列,起点是包含块的顶部。水平方向上的 marginborderpadding在框之间得到保留。框在垂直方向上可以以不同的方式对齐:它们的顶部或底部对齐,或根据其中文字的基线对齐。包含那些框的长方形区域,会形成一行,叫做行框。

    BFC的布局规则

    BFC(Block Formatting Context) 块级格式化上下文。官方的大致解释:它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用,当涉及到可视化布局的时候,Block Formatting Context 提供了一个环境 HTML元素在这个环境中按照一定规则进行布局。

    总结一句话:BFC 的目的就是形成一个完全独立的空间,让空间中的子元素不会影响到外面的布局

    1.内部的盒子会在垂直方向,一个个地放置;

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

    3.每一个元素的左边,与包括的盒子的左边相接触,即使存在浮动也是如此;

    4.BFC的区域不会与float重叠;

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

    6.计算BFC的高度时,浮动元素也參与计算。

     

    如何形成BFC

    如何才能成形成这样一种独立的空间呢?

    通过为元素设置一些CSS属性就可以触发,最常见的触发规则有4种(都是让元素脱离文档流)。

    1. float不为none可

    2. position不为relative和static

    3. overflow为auto、scroll和hidden

    4. display的值为table-cell、inline-block或table-caption

     

    BFC可以解决什么问题

    1.解决浮动元素令父元素高度塌陷的问题

    假设页面中有一个父元素和几个子元素,几个子元素都设为浮动时, 就会产生父元素高度坍塌,这是因为浮动的子元素脱离的文档流,被提起来形成新的VIP队列,下方普通队列中的元素无法触及它,父元素也检测不到他的存在而无法被撑开,看起来就是父元素高度坍塌了,后面的布局也会乱掉。

     

    解决方法:

    1.给父元素添加属性使触发BFC

    overflow:hidden;/display:table-cell;/display:inline-block;/position:fixed/position:absolute;

    2.出于布局需要,可能无法给父元素设置这些属性,这时可采用其他方法

    1.让父元素也浮动起来,让父元素和子元素一起脱离文档流,这样父元素就能自适应子元素的高度。优点:代码量少,缺点:会影响之后的元素排列

    2.给父元素添加固定高度,这种只适用于已知子元素的高度,且不易维护,不推荐。

    3.在浮动的子元素后面增加一个空元素,设置clear:both来清除浮动,但会增加无意义的标签,不利于维护

    4.为浮动的最后一个子元素设置伪元素::after{clear:both}这个办法和前一个是同一原理,只不过用伪类替代了空元素。优点:结构和语义完全正确,缺点:复用不当会导致代码量增加。

    2.解决自适应布局的问题

    两栏布局(左侧边栏定宽,右侧主体随页面宽度自适应变化)

    这种布局通常使用浮动来实现的,它利用了块级元素会尽可能沾满一行的特性,使得右边的元素可以随着页面宽度变化而变化,右利用了浮动特性,让左侧元素覆盖在右侧元素上面,同时还能挤开下方元素里的内容,让页面看起来是两栏的效果。

    但随着右边元素里的文字增加,超出了左边的元素之后,文字就会流动到最左侧,看起来就是文字环绕左侧元素。

    因此这里为右侧元素触发BFC,触发了BFC的容器就是页面上的一个完全隔离开的容器,容器里的子元素绝对不会影响到外面的元素。

    还有其他方法可以做这样的自适应布局

     

     

     

    3.解决外边距垂直方向重合问题

    兄弟元素之间的外边距,在垂直方向会取最大值而不是取和。

    解决方法:触发BFC来防止他们之间的相互影响,比如为其中 一个p元素外面包裹一层父元素,并且触发父元素BFC比如overflow:hidden这样打破原有格局就不会再重叠了

    同样还有另外解决方案:用padding来替代margin,但是如果根据设计本来就需要设置padding样式,就没办法用了。

  • 相关阅读:
    理解二进制操作
    web前端代码重构
    Tomcat是一个Servlet容器?
    对于python命令行参数使用,你应该这么做才专业
    利用深度学习识别滑动验证码缺口位置
    机器学习笔记(十)---- KNN(K Nearst Neighbor)
    基于NB-IoT的智慧路灯监控系统(项目简介)
    【读一本书】《昇腾AI处理器架构与编程》--神经网络基础知识(2)
    高性能Web动画和渲染原理系列(4)“Compositor-Pipeline演讲PPT”学习摘要【华为云技术分享】
    华为云数据库亮相下一代数据技术发展论坛,助力“数字一带一路”
  • 原文地址:https://www.cnblogs.com/wahaha-/p/14267713.html
Copyright © 2011-2022 走看看