一:传统网页布局的三种方式
- 标准流
- 浮动 float
- 定位 position
1 标准流
- 元素按照其在HTML中的先后位置从上到下进行布局
- 行内元素水平排列,块级元素被渲染成完整的新行
2 浮动 float
根据浮动的方向改变元素在标准流中的位置,其他盒子会占用它原来的位置
float: none 元素不浮动
float: left 元素向左浮动
float: right 元素向右浮动
3 定位 position
position: static 默认 不会脱离原文档流
position: relative 相对定位 不会脱离原文档流
position: absolute 绝对定位 会脱离原文档流
position: fixed 固定定位 固定在页面中的某个位置
二:BFC
1 BFC 是什么?
BFC - Block Formatting Context 块级格式化上下文 BFC的定义,它是一个独立的渲染区域。一个BFC区域包含创建该上下文元素的所有子元素,但是不包括创建了新的BFC的子元素的内部元素
如代码所示, .box是一个 BFC 区域,它包含item1 item2 item3 但是不包含 item3 下的两个 p 标签
<div class="box">
<div class="item1"></div>
<div class="item2"></div>
<div class="item3">
<p></p>
<p></p>
</div>
</div>
2 BFC 触发条件是什么?
只有当这个元素满足下面的任意一个条件,才能被当作是BFC区域
- body 根元素
- 设置浮动,不包括 none
- 设置定位,absoulte 或者 fixed
- 行内块显示模式,inline-block
- 设置overflow,即hidden,auto,scroll
- 表格单元格,table-cell
- 弹性布局,flex
3 BFC 解决哪些问题?
3.1 margin塌陷
正常情况下,两个盒子之间的 margin 应该是 50*2 = 100px,最终只显示了 50px,这就是 margin 塌陷,这个时候只需要给两个盒子设置 BFC,就不会相互影响
3.2 包含塌陷
给子元素添加 margin-top时,父子一起向下移动
给父元素设置BFC独立区域
3.3 清除浮动
以上代码,父元素没有设置高度,子元素自动撑开父元素
当子元素全部设置浮动时,父元素失去了原有的高度
这个时候给父元素设置BFC,清除浮动