美文网首页
CSS布局总结--BFC

CSS布局总结--BFC

作者: kim_jin | 来源:发表于2018-10-30 14:12 被阅读0次

小知识点(暖场):
overflow属性:规定当内容溢出元素框时发生的事情。

  • visible:默认值,内容不会被裁减,但是会显示在元素框外
  • hidden:内容会被裁减,其他的内容是不可见的
  • scroll:内容会被裁减,但是浏览器可以显示滚动条来显示余下的内容
  • auto:如果内容被裁减,浏览器会显示滚动条来方便查看余下的内容
  • inherit:规定应该从父元素继承overflow属性的值

display属性:规定元素应该生成框的类型

  • none:此元素不会被显示
  • block:此元素显示为块级元素,元素后面默认有换行符
  • inline:默认。此元素会被显示为行内元素,元素后默认
  • list-item:此元素作为列表显示
  • run-in:此元素会根据上下文作为块级元素或是行内元素显示
  • compactcss值中有compact,不过由于缺乏广泛支持,已删除
  • markercss值中有marker,不过由于缺乏广泛支持,已删除
  • table:此元素会作为块级表格来显示,表格的前后会带有换行符,类似<table>
    -inline-table:此元素会作为内联表格显示,表格前后没有换行符,类似<table>
  • table-row-group:此元素会作为一个或是多个分组来显示,类似<tbody>
  • table-header-group: 此元素会作为一个或多个行的分组来显示,类似 <thead>
  • table-footer-group:此元素会作为一个或多个行的分组来显,类似 <tfoot>
  • table-row:此元素会作为一个表格行显示,类似<tr>
  • table-column-group:此元素会作为一个或多个列的分组来显,类似<colgroup>
  • table-column:此元素会作为一个单元格列显示,类似<col>
  • table-cell:此元素会作为一个表格单元格显示,类似<td><th>
  • table-caption:此元素会作为一个表格标题显示,类似 <caption>
  • inherit:规定应该从父元素继承 display 属性的值。

position属性:属性规定元素的定位类型

  • absolute:生成绝对定位,相对于static定位以外的第一个父元素进行定位,元素位置通过left、right、top、bottom属性进行规定
  • fixed:生成绝对定位的元素,相对浏览器的窗口进行定位,元素位置通过leftrighttopbottom属性进行规定
  • relative:生成相对定位的元素,相对于其正常位置进行定位,因此left:20会向元素的左边添加20像素
  • static:默认值,没有定位,元素出现在正常流中(忽略top等属性)
  • inherit:规定从父级继承的position的位置

BFC简介

BFC:块级格式化上下文,它是指一个独立的块级渲染区域,只有Block-level 盒子参与,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。

BFC的生成

对于HTML文件来说,只要满足下面CSS声明中的一个就会产生BFC

  • 为根元素
  • float的值不为none
  • overflow值不为visible
  • display的值为inline-blocktable-celltable-caption
  • position的值为fixedabsolute

创建BFC的约束

  • 生成BFC元素的子元素会一个接一个的进行放置。垂直方向上他们的奇点是一个包含块的顶部,两个相邻子元素之间的垂直距离取决于margin特性,在BFC中相邻的块级元素的外边距会重叠
  • 生成BFC元素的子元素中,每一个子元素做外边距与包含块的左边界相接触,即使是浮动元素也是如此,除非这个子元素也创建一个新的BFC

详细描述:

  • 内部的盒子会在垂直的方向上一个接一个的放置。
  • 垂直方向上距离由margin决定(属于同一个BFC的两个相邻的boxmargin会发生重叠,与方向无关)
  • 每个元素的左边框与包含块的左边界接触(布局为从左到右),浮动元素也是这样的,也就是说BFC中元素不会超出他的包含块,而positionabsolute布局的元素可以超出包含块边界。
  • BFC的区域不会和float元素区域重合
  • 计算BFC高度的时候,浮动子元素也要参与到计算中
  • BFC就是页面上面的隔离的独立容器,容器中的子元素不会影响到外面的元素,同时外面的元素也不会影响容器里面的元素。

BFC的应用

放置margin的重叠
在同一个BFC中,两个相邻的Box才会发生重叠与方向没有关系,我们很少可以看到在水平方向的margin的重叠,但是在IE浏览器中,可以设置write-mode来实现水平方向的布局。

#green{
  margin:10px 10px 10px 10px;
  background:lightgreen;
  height:100px;
  width:100px;
}
#blue{
  margin:10px 10px 10px 10px;
  background:lightblue;
  height:100px;
  width:100px;
}
#red{
  margin:10px 10px 10px 10px;
  background:pink;
  height:100px;
  width:100px;
}
 body {
        writing-mode:tb-rl;
    }
<body>
  <div id="green"></div>
  <div id="blue"></div>
  <div id="red"></div>
</body>

现在两个盒子之间的margin值是10px而不是我们想象中的20px

margin在水平方向的重叠

如果我们希望阻止margin重叠的出现,就要将2个元素分别放在一个BFC中即可,但是在在上面的情景中阻止重叠看上去没有什么意义,我们主要将其用在嵌套。

 html, body {
  height: 100%;
  width: 100%;
  margin: 0;
  padding: 0;
}
.first{
  margin:20px;
  background:lightgreen;
  width:100px;
  height:100px;
}
ul{
  margin:10px;
  background:lightblue;
}
li{
  margin:25px;
}
<div class="first"></div>
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
</ul>
嵌套的margin覆盖问题

我们发现上面的黄框区域的为25px,也就是说将ul的margin的值覆盖掉了,此时div与ul之间的垂直距离,取divulli三者之间的最大外边距。。我们如果要阻止元素的重叠,就要让url生成BFC即可

 html, body {
  height: 100%;
  width: 100%;
  margin: 0;
  padding: 0;
}
.first{
  margin:20px;
  background:lightgreen;
  width:100px;
  height:100px;
}
ul{
  display: inline-block;
  margin:10px;
  background:lightblue;
}
li{
  margin:25px;
}
html, body { height: 100%; width: 100%; margin: 0; padding: 0; }
.first{
  margin:20px;
  background:lightgreen;
  border: 2px solid lightgreen;
}
ul{
  overflow:hidden;
  margin:10px;
  background:lightblue;
  width:100px;
  height:200px;
  float: left;
}
li{
  margin:25px;
}
BFC的margin不覆盖

ps:如果为ul设置了border或padding,那元素的margin便会被包含在父元素的盒式模型内,不会与外部div重叠。

浮动问题
我们的父元素包含子元素,常见的方式是为父元素设置overflow:hidden或是浮动父级元素,根本原因在于创建BFC元素,子浮动元素也参与了高度的计算,就不会产生高度塌陷的问题,实际上只要让父级元素生成BFC就可以。也就是说浮动元素是会脱离文档流的(绝对定位元素会脱离文档流)。如果一个没有高度或者heightauto的容器的子元素是浮动元素,则该容器的高度是不会被撑开的。
所以我们解决的代码是

html, body { height: 100%; width: 100%; margin: 0; padding: 0; }
.first{
  margin:20px;
  background:lightgreen;
  border: 2px solid lightgreen;
  /*这四条代码都可以解决上面的问题*/
  display:inline-block;
  overflow:hidden;
  float: left;
  position:absolute;
}
ul{
  overflow:hidden;
  margin:10px;
  background:lightblue;
  width:100px;
  height:200px;
  float: left;
}
li{
  margin:25px;
}

多栏布局的实现
我们在上面已经总结了一条规律:与浮动元素相邻的已生成的BFC的元素不能和浮动元素之间相互覆盖,所以我们利用这个特性作为多栏布局的一种实现方式。

html, body { height: 100%; width: 100%; margin: 0; padding: 0; }
.left{
  background:pink;
  float: left;
  width:180px;
}
.center{
  background:lightyellow;
  overflow:hidden;      
}
.right{
  background: lightblue;
  width:180px;
  float:right;
}
<div class="container">
    <div class="left">
      <pre>
        .left{
        background:pink;
        float: left;
        width:180px;
      }
      </pre>
    </div>
    <div class="right">
       <pre>
        .right{
        background:lightblue;
        width:180px;
        float:right;
      }
      </pre>
    </div>
    <div class="center">
    <pre>
     .center{
      background:lightyellow;
      overflow:hidden;
      height:116px;
      }
      </pre>
    </div>
  </div>
BFC多栏布局样式

这种布局的特点在于左右两栏宽度固定,中间栏可以根据浏览器宽度自适应。

相关文章

  • CSS布局总结--BFC

    小知识点(暖场):overflow属性:规定当内容溢出元素框时发生的事情。 visible:默认值,内容不会被裁减...

  • 关于 BFC 的布局应用:清除浮动、文字环绕

    关于 BFC 的布局应用:清除浮动、文字环绕 参考文档:理解CSS中BFC BFC(Block Formattin...

  • CSS进阶(二)

    BFC 渐进增强和优雅降级 CSS验证 / 压缩 圣杯布局与双飞翼布局 BFC(块级格式化上下文) BFC(Blo...

  • BFC原理

    BFC是什么? 了解BFC之前,先了解Box,Formatting Content的概念 Box:CSS布局的基本...

  • 关于CSS的BFC

    参考:理解CSS布局和BFCCSS深入理解流体特性和BFC特性下多栏自适应布局 1、概念BFC(Block For...

  • 前端面试试题

    HTML 和 CSS 页面布局 css盒模型 BFC 页面布局 有5中可以解决: ​ 第一种:浮动 ....

  • CSS2.1

    CSS CSS2.1 固定定位的扩展理解 经典布局 BFC Box Formatting Context Bloc...

  • Day13:H5+JS+C3

    css布局中,什么是BFC BFC是Block formatting context的缩写,表示“块级格式化上下文...

  • 前端常见面试题目(四)

    一、 BFC 及其应用 1、BFC 概念 BFC 就是块级格式上下文,是页面盒模型布局中的一种 CSS 渲染模式,...

  • css布局总结1--BFC

    前言 以前对BFC有所了解,但是很久不看,就有些遗忘了,这次写一个总结,帮助自己回忆一下相关的内容,以及做为今后查...

网友评论

      本文标题:CSS布局总结--BFC

      本文链接:https://www.haomeiwen.com/subject/hjqbtqtx.html