1.问题起源

在平时的业务开发写CSS中,为了满足页面布局,元素的浮动特性我们用的不能再多了。使用浮动的确能够解决一些布局问题,但是也带了一些副作用影响,比如,父元素高度塌陷,我们有好几种可以清除浮动的方法,最常用的就是设置父元素的overflow:hidden这个属性,每次在写代码的时候总是这样写,但是,自己从没深度思考过这些写为什么能够清除浮动,最近,自己也查阅了一些资料,谈谈自己的理解。

2.情景再现

先上代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>清除浮动</title>
<style>
.container{
border: 1px solid #000;
   background: #0f0;
}
.child{
float: left;
}
</style>
</head>
<body>
<div class="container">
<div class="child">
你好
</div>
</div>
</body>
</html>

代码很简单,就是父元素container里面包含了一个子div元素child,然后我们使子元素的div向左浮动,结果来看,父元素只显示了四个方向边框的高度,背景颜色未显示,这是因为子元素浮动脱离文档流造成父元素高度塌陷。

3.解决方法

.container{
border: 1px solid #000;
background: #0f0;
overflow: hidden;
}

只在container父元素加了一行overflow:hidden

父元素高度被撑起来了,背景颜色也显示出来了。

4.BFC概念

我们先了解一个名词:BFC(block formatting context),中文为“块级格式化上下文”。

先记住一个原则: 如果一个元素具有BFC,那么内部元素再怎么翻江倒海,翻云覆雨,都不会影响外面的元素。所以,BFC元素是不可能发生margin重叠的,因为margin重叠会影响外面的元素的;BFC元素也可以用来清除浮动带来的影响,因为如果不清楚,子元素浮动则会造成父元素高度塌陷,必然会影响后面元素的布局和定位,这显然有违BFC元素的子元素不会影响外部元素的设定。

以下情况会触发BFC:

  • <html>根元素
  • float的值不为none
  • overflow的值为auto,scroll,hidden
  • display的值为table-cell,table-caption和inline--block中的任何一个
  • position的值不为relative和static

显然我们在设置overflow值为hidden时使container元素具有BFC,那么子元素child浮动便不会带来父元素的高度坍塌影响。

利用BFC可以闭合浮动,防止与浮动元素重叠。

5.总结

设置overflow为hidden使元素具有BFC而不会受子元素的影响,但是当子元素过多需要滚动显示时,我们可以设置overflow的值为auto或acroll,超出父元素之外的元素会被隐藏。使用overflo:hidden也具有一定的局限性,所以我们应该根据具体的业务场景来选择合适的方法。

参考网址:

https://www.jb51.net/css/648048.html

https://blog.csdn.net/qq_41638795/article/details/83304388

https://www.cnblogs.com/GP-233/p/7140611.html

最新文章

  1. java基础1_Java数据类型
  2. SQL更改表字段为自增标识
  3. android 绘图之Path与Paint详解
  4. 解决android SwipeRefreshLayout recyclerview 不能下拉
  5. php基础08:改变数据类型
  6. Postfix Completion 的使用
  7. C++一个简单的类
  8. 学习Ember遇到的一些问题
  9. 如何用js实现自适应,原来只是几行代码的事(╯‵□′)╯︵┻━┻
  10. POJ-1556 The Doors---线段相交+最短路
  11. Android Multimedia框架总结(九)Stagefright框架之数据处理及到OMXCodec过程
  12. 返回present的根
  13. vue + element + 初始化项目
  14. Math对象小笔记
  15. Ubuntu18.04下安装MySQL
  16. 一篇对OAuth2.0开发实例的介绍
  17. 前端学PHP之正则表达式函数
  18. MYSQL学习笔记 (一)
  19. springboot的Scheduled定时器不工作
  20. 第七章--Java基础类库--与用户的互动

热门文章

  1. Android架构(一)MVP架构在Android中的实践
  2. Ubuntu + Apache2 环境下用C编写 一个简单的cgi脚本
  3. osgViewer:: Viewer::advance() osg多线程与智能指针
  4. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_07-Feign远程调用-Feign测试
  5. 使用注解注入properties中的值的简单示例
  6. Jsoup-简单爬取知乎推荐页面(附:get_agent())
  7. (错误)在VMmare中安装centos后不能联网
  8. Docker 镜像小结---操作指令介绍(七)
  9. 三节课MINI计划第三周
  10. C++中pair详解