## 一、什么是高度塌陷
在文档流中,若父元素未设置高度,那么父元素的高度默认是被子元素撑开的,即子元素多高,父元素就有多高。但是当子元素设置浮动之后,子元素就会完全脱离文档流,父元素还在文档流中,此时父元素的高度就没有子元素撑起(子元素无法撑起父元素的高度),从而导致父元素的高度塌陷。简单来说,就是包含含有浮动的元素的上一级元素的高度变为0了,下面的元素会上去,这样会导致页面布局混乱。
```
<div class="parent">
<div class="child"></div>
<div class="child"></div>
</div>
.parent {
width: 300px;
border: 5px solid #f00;
}
.child {
float: left;
width:100px;
height: 100px;
border: 5px solid #00f;
}
```
## 二、解决方法
#### 1、父元素结束之前添加一个标签 `<div style="clear:both;"></div>`
```
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div style="clear:both;"></div>
</div>
<div class="bottom"></div>
.parent {
border: 5px solid #f00;
}
.child {
float: left;
width: 100px;
height: 200px;
border: 5px solid #00f;
}
.bottom {
width: 200px;
height: 100px;
background: #0f0;
}
```
缺点:增加了无意义的标签
#### 2、让父元素本身也浮动 float:left;
```
<div class="parent">
<div class="child"></div>
<div class="child"></div>
</div>
<div class="bottom"></div>
.parent {
float: left;
border: 5px solid #f00;
}
.child {
float: left;
width: 100px;
height: 100px;
border: 5px solid #00f;
}
.bottom {
width: 200px;
height: 100px;
background: #0f0;
}
```
缺点:虽然可以撑开父元素,但是会导致父元素的宽度丢失,而且会导致下边的元素上移,使得跟父元素相邻的元素的布局受到影响
#### 3、给父元素一个固定高度,此方法适用于子元素高度已知并且固定的情况
```
<div class="parent">
<div class="child"></div>
<div class="child"></div>
</div>
<div class="bottom"></div>
.parent {
height: 100px;
border: 5px solid #f00;
}
.child {
float: left;
width: 100px;
height: 100px;
border: 5px solid #00f;
}
.bottom {
width: 200px;
height: 100px;
background: #0f0;
}
```
缺点:父元素与子元素的边框会重叠,无法自适应子元素的高度
#### 4、给父元素设置display: inline-block;
```
<div class="parent">
<div class="child"></div>
<div class="child"></div>
</div>
<div class="bottom"></div>
.parent {
display: inline-block;
border: 5px solid #f00;
}
.child {
float: left;
width: 100px;
height: 100px;
border: 5px solid #00f;
}
.bottom {
width: 200px;
height: 100px;
background: #0f0;
}
```
缺点:会导致父元素的宽度丢失,与相邻元素会产生额外的间距
#### 5、给父元素设置 overflow : hidden;
```
<div class="parent">
<div class="child"></div>
<div class="child"></div>
</div>
<div class="bottom"></div>
.parent {
overflow: hidden;
border: 5px solid #f00;
}
.child {
float: left;
width: 100px;
height: 100px;
border: 5px solid #00f;
}
.bottom {
width: 200px;
height: 100px;
background: #0f0;
}
```
缺点:要是子元素要margin负值定位或是负的position定位,溢出部分会被裁掉,如二级菜单的影响
#### 6、通过after伪类,after + zoom方法(推荐)
```
<div class="parent clearAll">
<div class="child"></div>
<div class="child"></div>
</div>
<div class="bottom"></div>
.parent {
border: 5px solid #f00;
}
.child {
float: left;
width: 100px;
height: 100px;
border: 5px solid #00f;
}
.bottom {
width: 200px;
height: 100px;
background: #0f0;
}
.clearAll:after {
content: '';
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearAll {
zoom : 1;
}
```
利用伪类来清除浮动,其效果跟创建一个空的div并设置其为 clear:both 是一样的,只不过这里用伪类代替了空的div元素,不会影响任何其他样式,通用性强,覆盖面广。
- 前言
- 一、css垂直居中的几种实现方法
- 二、简单说一下盒模型,说下如何利用BFC解决外边距重叠的问题
- 三、说一说产生塌陷的原因以及清除浮动的几种方法
- 四、伪类和伪元素的区别?聊一下css选择器的优先级
- 五、css中的过渡和动画效果了解吗
- 六、弹性盒模型了解吗
- 七、简单说下BOM和DOM的区别
- 八、如何解决浏览器的兼容性问题?浏览器调优都用到过哪些方法
- 九、之前写过h5吗?有遇到过哪些兼容性问题?说下怎么解决的
- 十、h5是如何做移动端适配的?折行的时候如何实现不断行
- 十一、聊一聊js中实现数组拷贝的常用方法
- 十二、聊聊js中的数据类型,如何用js实现一个对象的深拷贝
- 十三、伪数组和数组的区别?相互转化的方法有哪些
- 十四、请介绍Js中有哪些循环遍历的方法,关于数组常用的方法有哪些
- 十五、js中的reduce了解吗?都用他解决过什么问题
- 十六、事件冒泡和捕获的执行顺序了解吗?什么是事件委托
- 十七、call和apply的区别是什么?caller和callee的区别有哪些
- 十八、javascript中的this都有哪些用法
- 十九、怎么理解js中的原型链?如何实现继承?实现继承常用的方式有哪些
- 二十、聊一聊js的作用域和作用域链
- 二十一、js的闭包了解吗?闭包的常见用法说一下
- 二十二、setTimeout和setInterval的运行机制了解吗
- 二十三、函数的柯里化了解吗?说下函数柯里化应用的场景
- 二十四、用js写一个ajax的原生实现方法
- 二十五、js如何实现跨域?聊一聊你之前用到过的方法
- 二十六、聊一下cookie、session和token三者的区别及使用
- 二十七、用js实现一下数组去重和排序,有哪些方法可以实现
- 二十八、写一个方法,统计一下html文档的元素包括元素的数量
- 二十九、用js实现一个省市级联效果
- 三十、用js实现一个轮播图效果,简单说下原理
- 三十一、请你实现一个大文件上传和断点续传
- 三十二、什么是模块化开发?谈下AMD、CMD、CommonJs和ES6的区别
- 三十三、es6了解吗?说几个常见的新特性,set和weakSet的区别是什么
- 三十四、解构赋值的用法了解吗?如何实现对象和数组的嵌套和重命名
- 三十五、谈谈你对promise的用法和理解
- 三十六、谈谈你对es6中的Generator函数的认识
- 三十七、谈一下async-await的实现原理
- 三十八、用js实现一下观察者模式?简单说一下原理
- 三十九、了解JavaScript中的装饰器吗?聊一下JS中的getter与setter的用法
- 四十、聊一下正则表达式里的常见用法