## 一、什么是高度塌陷
在文檔流中,若父元素未設(shè)置高度,那么父元素的高度默認(rèn)是被子元素?fù)伍_的,即子元素多高,父元素就有多高。但是當(dāng)子元素設(shè)置浮動之后,子元素就會完全脫離文檔流,父元素還在文檔流中,此時(shí)父元素的高度就沒有子元素?fù)纹穑ㄗ釉責(zé)o法撐起父元素的高度),從而導(dǎo)致父元素的高度塌陷。簡單來說,就是包含含有浮動的元素的上一級元素的高度變?yōu)?了,下面的元素會上去,這樣會導(dǎo)致頁面布局混亂。
```
<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、父元素結(jié)束之前添加一個(gè)標(biāo)簽 `<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;
}
```
缺點(diǎn):增加了無意義的標(biāo)簽
#### 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;
}
```
缺點(diǎn):雖然可以撐開父元素,但是會導(dǎo)致父元素的寬度丟失,而且會導(dǎo)致下邊的元素上移,使得跟父元素相鄰的元素的布局受到影響
#### 3、給父元素一個(gè)固定高度,此方法適用于子元素高度已知并且固定的情況
```
<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;
}
```
缺點(diǎn):父元素與子元素的邊框會重疊,無法自適應(yīng)子元素的高度
#### 4、給父元素設(shè)置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;
}
```
缺點(diǎn):會導(dǎo)致父元素的寬度丟失,與相鄰元素會產(chǎn)生額外的間距
#### 5、給父元素設(shè)置 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;
}
```
缺點(diǎn):要是子元素要margin負(fù)值定位或是負(fù)的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;
}
```
利用偽類來清除浮動,其效果跟創(chuàng)建一個(gè)空的div并設(shè)置其為 clear:both 是一樣的,只不過這里用偽類代替了空的div元素,不會影響任何其他樣式,通用性強(qiáng),覆蓋面廣。
- 前言
- 一、css垂直居中的幾種實(shí)現(xiàn)方法
- 二、簡單說一下盒模型,說下如何利用BFC解決外邊距重疊的問題
- 三、說一說產(chǎn)生塌陷的原因以及清除浮動的幾種方法
- 四、偽類和偽元素的區(qū)別?聊一下css選擇器的優(yōu)先級
- 五、css中的過渡和動畫效果了解嗎
- 六、彈性盒模型了解嗎
- 七、簡單說下BOM和DOM的區(qū)別
- 八、如何解決瀏覽器的兼容性問題?瀏覽器調(diào)優(yōu)都用到過哪些方法
- 九、之前寫過h5嗎?有遇到過哪些兼容性問題?說下怎么解決的
- 十、h5是如何做移動端適配的?折行的時(shí)候如何實(shí)現(xiàn)不斷行
- 十一、聊一聊js中實(shí)現(xiàn)數(shù)組拷貝的常用方法
- 十二、聊聊js中的數(shù)據(jù)類型,如何用js實(shí)現(xiàn)一個(gè)對象的深拷貝
- 十三、偽數(shù)組和數(shù)組的區(qū)別?相互轉(zhuǎn)化的方法有哪些
- 十四、請介紹Js中有哪些循環(huán)遍歷的方法,關(guān)于數(shù)組常用的方法有哪些
- 十五、js中的reduce了解嗎?都用他解決過什么問題
- 十六、事件冒泡和捕獲的執(zhí)行順序了解嗎?什么是事件委托
- 十七、call和apply的區(qū)別是什么?caller和callee的區(qū)別有哪些
- 十八、javascript中的this都有哪些用法
- 十九、怎么理解js中的原型鏈?如何實(shí)現(xiàn)繼承?實(shí)現(xiàn)繼承常用的方式有哪些
- 二十、聊一聊js的作用域和作用域鏈
- 二十一、js的閉包了解嗎?閉包的常見用法說一下
- 二十二、setTimeout和setInterval的運(yùn)行機(jī)制了解嗎
- 二十三、函數(shù)的柯里化了解嗎?說下函數(shù)柯里化應(yīng)用的場景
- 二十四、用js寫一個(gè)ajax的原生實(shí)現(xiàn)方法
- 二十五、js如何實(shí)現(xiàn)跨域?聊一聊你之前用到過的方法
- 二十六、聊一下cookie、session和token三者的區(qū)別及使用
- 二十七、用js實(shí)現(xiàn)一下數(shù)組去重和排序,有哪些方法可以實(shí)現(xiàn)
- 二十八、寫一個(gè)方法,統(tǒng)計(jì)一下html文檔的元素包括元素的數(shù)量
- 二十九、用js實(shí)現(xiàn)一個(gè)省市級聯(lián)效果
- 三十、用js實(shí)現(xiàn)一個(gè)輪播圖效果,簡單說下原理
- 三十一、請你實(shí)現(xiàn)一個(gè)大文件上傳和斷點(diǎn)續(xù)傳
- 三十二、什么是模塊化開發(fā)?談下AMD、CMD、CommonJs和ES6的區(qū)別
- 三十三、es6了解嗎?說幾個(gè)常見的新特性,set和weakSet的區(qū)別是什么
- 三十四、解構(gòu)賦值的用法了解嗎?如何實(shí)現(xiàn)對象和數(shù)組的嵌套和重命名
- 三十五、談?wù)勀銓romise的用法和理解
- 三十六、談?wù)勀銓s6中的Generator函數(shù)的認(rèn)識
- 三十七、談一下async-await的實(shí)現(xiàn)原理
- 三十八、用js實(shí)現(xiàn)一下觀察者模式?簡單說一下原理
- 三十九、了解JavaScript中的裝飾器嗎?聊一下JS中的getter與setter的用法
- 四十、聊一下正則表達(dá)式里的常見用法