淺談CSS浮動的特性
本文介紹了CSS浮動的特性,分享給大家,順便給自己留個筆記
浮動具有以下特性:
- 蓋不住的文本
- 浮動元素后面不是塊級元素,后面的元素將會和它并排(除非設(shè)置了元素的寬度,并且屏幕放不下時將會換行)
- 浮動元素的上一個元素如果沒有浮動,浮動只在當(dāng)前行浮動;當(dāng)浮動遇到浮動,它們將在一行排序,除非沒有位置了
- 當(dāng)元素設(shè)置定位值為absolute、fixed時,浮動將被忽略
- float引起父元素高度塌陷
- 浮動元素會被后一個元素的margin-top影響
蓋不住的文本
<style>
body,div{
margin:0;
padding:0;
}
div{
width:100px;
height:100px;
}
.item1{
float:left;
background-color: pink;
}
.item2{
background-color: #58d3e2;
}
</style>
<div class="item1">item1</div>
<div class="item2">item2</div>

可以看到,item2的div除了文本,其他的內(nèi)容都看不見了,因為它跑到item1下面了。為什么文字不會被浮動的元素蓋住呢?因為浮動的本質(zhì)就是用來實現(xiàn)文字環(huán)繞的。
從上面也可以得出:浮動元素后面的塊級元素會占據(jù)浮動元素的位置,并且浮動元素總是在標(biāo)準(zhǔn)流元素上面。
浮動元素后面不是塊級元素,后面的元素將會和它并排(除非設(shè)置了元素的寬度,并且屏幕放不下時將不會換行)
<style>
body,div{
margin:0;
padding:0;
}
div{
width:100px;
height:100px;
}
.item1{
float:left;
background-color: pink;
}
.item2{
display: inline-block;
background-color: #58d3e2;
}
</style>
<div class="item1">item1</div>
<div class="item2">item2</div>

浮動元素的上一個元素如果沒有浮動,浮動只在當(dāng)前行浮動;當(dāng)浮動遇到浮動,它們將在一行排序,除非沒有位置了
<style>
body,div{
margin:0;
padding:0;
}
div{
width:100px;
height:100px;
}
.item1{
background-color: pink;
}
.item2{
float:left;
background-color: #58d3e2;
}
</style>
<div class="item1">item1</div>
<div class="item2">item2</div>
<div class="item3">item3</div>

<style>
body,div{
margin:0;
padding:0;
}
div{
width:400px;
height:100px;
float: left;
}
.item1{
background-color: pink;
}
.item2{
background-color: #58d3e2;
}
.item3{
background-color: #61dafb;
}
.item4{
background-color: #e9203d;
}
</style>
<div class="item1">item1</div>
<div class="item2">item2</div>
<div class="item3">item3</div>
<div class="item4">item4</div>

可以設(shè)置width為百分比來實現(xiàn)自適應(yīng)
div{
width:25%;
height:100px;
float: left;
}

當(dāng)元素設(shè)置定位值為absolute、fixed時,浮動將被忽略
<style>
body,div{
margin:0;
padding:0;
}
div{
position: absolute;
float: left;
width:100px;
height:100px;
border: 1px solid red;
}
</style>
<div class="item1">浮動遇上定位</div>

行內(nèi)元素使用浮動以后生成一個塊框,因此它就可以使用width,height,margin,padding等屬性了
<style>
body,div{
margin:0;
padding:0;
}
[class^='item']{
float: left;
width:100px;
height:100px;
line-height: 100px;
text-align: center;
}
.item1{
float: left;
background-color: pink;
}
.item2{
display: inline-block;
background-color: #58d3e2;
}
</style>
<span class="item1">item1</span>
<div class="item2">item2</div>

float引起父元素高度塌陷
在網(wǎng)頁設(shè)計中,很常見的一種情況是給內(nèi)容一個div作為包裹容器,而這個包裹容器不設(shè)置高度,而是讓里面的內(nèi)容撐開包裹容器的高度。如果不給子元素設(shè)置浮動的話,并不會出現(xiàn)什么問題,而一旦給子元素設(shè)置了浮動,父元素會無法自適應(yīng)浮動元素的高度,會出現(xiàn)父元素高度為0,從而背景色什么的都不能展示了。原因是:
因為沒有預(yù)先設(shè)置div高度,所以div高度由其包含的子元素高度決定。而浮動脫離文檔流,所以子元素并不會被計算高度。此時的div中,相當(dāng)于div中子元素高度為0,所以發(fā)生了父元素高度塌陷現(xiàn)象。
<style>
body,div{
margin:0;
padding:0;
}
.item{
float: left;
width:100px;
height:100px;
background-color: pink;
}
</style>
<div class="box">
<div class="item"></div>
</div>

解決辦法,
1.給父元素增加“overflow:hidden"
當(dāng)然也可以是"overflow:auto"。但為了兼容IE最好用overflow:hidden。
.box{
overflow:hidden;
}
那么為什么“overflow:hidden"會解決這個問題呢?
是因為“overflow:hidden”會觸發(fā)BFC,BFC反過來決定了"height:auto"是如何計算的
,即計算BFC的高度時,浮動元素也參與計算,因此此時父元素會自適應(yīng)浮動元素的高度。
所以呢,也可以設(shè)置"display:inline-block"、"position:absolute"、"float:left"來解決父元素高度坍塌的問題。因為凡是能創(chuàng)建一個BFC,就能達到包裹浮動子元素的效果。因此網(wǎng)上都說成“BFC能包裹浮動元素”.
2.在父元素內(nèi)容的后面或者前面增加偽元素+清除浮動
可以給父元素的內(nèi)容添加一個偽元素,可以用::before或者::after,然后內(nèi)容為空,這樣就不會占據(jù)位置,最后為偽元素加上“clear:both"來清除浮動。
<style>
body,div{
margin:0;
padding:0;
}
.box::after{
content: '';
display: block;
clear:both;
}
.item{
float:left;
width:100px;
height: 100px;
background-color: deeppink;
}
</style>
<div class="box">
<div class="item"></div>
</div>

為什么這樣可以呢?
弄清原因需要知道兩點:一是偽元素的實際作用,二是css的清除浮動(clear)只能影響使用清除的元素本身,不能影響其他元素,并且清除浮動可以理解為打破橫向排列。
首先需要搞清除::after和::before起的作用,它們不是在一個元素的后面或者前面插入一個偽元素,而是會在元素內(nèi)容后面或者前面插入一個偽元素(是在元素里面),之前我一直以為:before和:after偽元素 插入的內(nèi)容會被注入到目標(biāo)元素的前或后注入,其實注入的內(nèi)容將是有關(guān)聯(lián)的目標(biāo)元素的子元素,但它會被置于這個元素的任何內(nèi)容的“前”或“后”。我們來舉個例子,可以看到.box的高度為300px,說明兩個偽元素已經(jīng)插入到.box內(nèi)容里了。
<style>
body,div{
margin:0;
padding:0;
}
.box::before{
content: 'before';
height: 100px;
width: 100px;
display: block;
clear:both;
background-color: #61dafb;
}
.box::after{
content: 'after';
width:100px;
height:100px;
display: block;
clear:both;
background-color: aquamarine;
}
.item{
float:left;
width:100px;
height: 100px;
background-color: deeppink;
}
</style>
<div class="box">
<div class="item"></div>
</div>

綜上,所以我們常用下列方式來清除浮動
.box::after{
content:'';
display:block;
clear:both;
}
或者
.box::before{
content:'';
display:block;
clear:both;
}
或者
.box::before,.box::after{
content:'';
display:block;
clear:both;
}
//::before和::after必須配合content屬性來使用,content用來定義插入的內(nèi)容,content必須有值,至少是空。默認(rèn)情況下,偽類元素的display是默認(rèn)值inline,可以通過設(shè)置display:block來改變其顯示。
在父元素的內(nèi)容前后插入一個偽元素,content為空可以保證不占據(jù)位置(高度為0)。"clear:both"可以清除父元素左右的浮動,導(dǎo)致.box::before和.box::after遇到浮動元素會換行,從而會撐開高度,父元素會自適應(yīng)這個高度從而不會出現(xiàn)高度坍陷。
其他解決高度坍塌的方法都是基于這兩個思想的,一個是觸發(fā)BFC,一個是添加元素+清除浮動(clear)。
浮動元素會被后一個元素的margin-top影響
<style>
body,div{
margin:0;
padding:0;
}
div{
width:100px;
height:100px;
}
div:nth-of-type(1){
float: left;
background-color: #61dafb;
}
div:nth-of-type(2){
margin-top: 100px;
background-color: #58d3e2;
}
</style>
<div >div1</div>
<div>div2</div>

可以看到第一個div也跟著下來了,解決辦法是給后一個元素設(shè)置clear,此時后一個元素的margin-top將無效
<style>
body,div{
margin:0;
padding:0;
}
div{
width:100px;
height:100px;
}
div:nth-of-type(1){
float: left;
background-color: #61dafb;
}
div:nth-of-type(2){
clear:both;
margin-top: 100px;
background-color: #58d3e2;
}
</style>
<div >div1</div>
<div>div2</div>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
這篇文章主要介紹了Css實現(xiàn)清除浮動的方法匯總,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-11
深入理解CSS overflow:hidden——溢出,坍塌,清除浮動
這篇文章主要介紹了深入理解CSS overflow:hidden——溢出,坍塌,清除浮動的相關(guān)資料,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-03- 這篇文章主要介紹了CSS清除浮動方法大全(小結(jié))的相關(guān)資料,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-19
這篇文章主要介紹了CSS3 清除浮動的方法示例的相關(guān)資料,通過本文,讓大家可以明白清除浮動的原理和幾種方法,最后得出一種本文認(rèn)為最好用的方法,感興趣的小伙伴們可以參考2018-06-01
這篇文章主要介紹了css布局之定位與浮動的相關(guān)資料,需要的朋友可以參考下2018-05-21
這篇文章主要介紹了CSS實現(xiàn)元素浮動和清除浮動的方法,簡單介紹了浮動的基本知識,通過截圖代碼的形式給大家介紹了css清除浮動的方法,需要的朋友可以參考下2019-12-05






