写页面时会遇到:

  1. 子元素float父元素的高度不会撑开;
  2. 在布局时,box1and box2,其中box1 float:left,这是box2会在box1下面,(如果文字过多就会形成文字环绕效果),但我就是想要box2在box1的右侧;
  3. 又或是上下两个box的margin重叠。

这些问题除了其他一些方法解决外,都可以利用加上overflow:hidden,但是why?其实 BFC的作用呢。
BFC??啥?
BFC这个词....

BFC:全称box formatting context;即块格式上下文,block-level元素参与;

那么什么是block-level呢?
等等 等等...
'W3C' CSS2.1规范:
Block-level elements are those elements of the source document that are formatted visually as blocks (e.g., paragraphs). The following values of the 'display'property make an element block-level: 'block', 'list-item', and 'table'.
块级元素是源文档中被视为块(例如段落)可视化格式的那些元素。 'display'属性的以下值构成一个块级别:'block','list-item'和'table'。

那它是怎么形成的呢?

以下情况之一:

  • float值不为none
  • position:fixed / absolute
  • display:table-cell / table-caption /inline-block / flex / inline-flex.
  • overflow属性不为visible

我们知道了什么是BFC,如何形成BFC,接下来就要说BFC的布局规则
滴滴滴...

  1. 内部的box会一个接一个地垂直布局。
  2. 两个相邻box的垂直距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
  3. 每个盒子的左外边框紧挨着左边框的包含块(从左往右的格式化时,否则相反)。即使存在浮动也是如此
  4. BFC的区域不会与float box重叠。
  5. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
  6. 计算BFC的高度时,浮动元素也参与计算.

该知道的理论也差不多了,该解答了~
问题1:子元素float父元素的高度不会撑开

 <section class="container">
<style>
.container{
color:#FFF;
width: 300px;
margin:100px auto;
border:1px solid #330033;
}
.left{
float: left;
width: 100px;
height: 80px;
background: #FF0066;
}
.right{
background: #FFCCFF;
}
</style>
<div class="left">我是left</div>
<div class="right">我是right</div>
</section>

效果:

我们看到container只是right的高,而left中float使该元素脱离了文档流它的高没有计算在内,现在要想left的高度计算在内,根据BFC布局规则6就可以,形成一个BFC区不就可以计算float的高度喽,来,上码:

.container{
color:#FFF;
width: 300px;
margin:100px auto;
border:1px solid #330033;
overflow: hidden;
}


果真嘿,其实,这里不止加overflow:hidden,加上边介绍任何一种可以形成BFC区奏行,比如:overflow: auto; / float: left; /display: flex;等等,根据项目中的实际需求。

2.问题2:box2在box1右侧
在问题1里的代码基础上,把right区增加一个高度比如300px,就可以看到效果liu

           .right{
background: #FFCCFF;
height: 300px;
overflow: hidden;
}

由于left块float的原因,导致right在left下面,解决此问题
根据BFC布局规则4 :BFC的区域不会与float box重叠,那么right形成BFC区
效果:

哇,好了呀!

问题3:magin重叠问题

   <section class="container">
<style>
.container{
color:#FFF;
width: 300px;
margin:100px auto;
border:1px solid #330033;
overflow: auto;
}
.box1,.box2{
height: 50px;
}
.box1{
background: #FF0066;
margin-bottom:20px;
}
.box2{
background: #FFCCFF;
margin-top:50px;
}
</style>
<div class="box1">我是box1</div>
<div class="box2">我是box2</div>
</section>


我们大多以为是80px,可结果却是50px!
why?
BFC原则2指明了同一个BFC区的margin垂直重叠,不在同一个是不是就不重叠了,来来来

        ...
.wrapper{
overflow:hidden;
}
...
<div class="wrapper">
<div class="box1">我是box1</div>
</div>
<!-- <div class="wrapper"> -->
<div class="box2">我是box2</div>
<!-- </div> -->

ok!通过给box1或box2添加一个父元素形成和另一个不在同一区。

关于垂直margin折叠

  • 两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值;
  • 两个相邻的外边距都是负数时,折叠结果是两者绝对值的较大值;
  • 两个外边距一正一负时,折叠结果是两者的相加的和;

最后的最后,欢迎指正~

最新文章

  1. Linux简介及常用命令使用5--linux shell编程入门
  2. Java 高精度数字
  3. 《Java4Android》视频学习笔记——抽象类和抽象函数
  4. 并发编程 13—— 线程池的使用 之 配置ThreadPoolExecutor 和 饱和策略
  5. GitHub 教程 in Ubuntu
  6. JVM学习笔记(三)------内存管理和垃圾回收
  7. IC芯片
  8. Java程序员容易犯的10个错误
  9. 【转】ubuntu设置PATH----不错
  10. poj 1018 Communication System_贪心
  11. Form表单中method=post/get两种数据传输的方式的区别
  12. Mysql之库表操作(胖胖老师)
  13. 数据结构C++实现代码-顺序表
  14. PHP手册-函数参考-加密扩展
  15. bzoj5045: 打砖块
  16. HTML5标签canvas制作平面图
  17. 【WPF】UserControl 的 Load事件
  18. [one day one question] 部分ios版本 在display: inline-block时候不支持flex
  19. mac ASP.NET5
  20. Requests中文乱码解决方案

热门文章

  1. AtCoder Beginner Contest 077
  2. Python 从大型csv文件中提取感兴趣的行
  3. 【BZOJ-4289】Tax 最短路 + 技巧建图(化边为点)
  4. 解决sudo用户找不到环境变量的问题
  5. [JavaScript] es6规则总结
  6. 单元测试 - tox 使用
  7. LNMP完整安装教程
  8. PHP之常用第三方库
  9. openlayers 添加标记点击弹窗 定位图标闪烁
  10. java 返回输入中出现次数最多的字符串