1. 程式人生 > >浮動(float)以及消除浮動流

浮動(float)以及消除浮動流

語法:float: left / right;

可能的值

描述
left 元素向左浮動。
right 元素向右浮動。
none 預設值。元素不浮動,並會顯示在其在文字中出現的位置。
inherit 規定應該從父元素繼承 float 屬性的值。

功能:無論是display為inline,inline-block,還是block,float都可以讓他站隊

example:

第一種:(下面是inline-block元素)

html程式碼:

<div class="wrapper">

<img src="img/taobaowang.png" >

<img src="img/taobaowang.png" >

<img src="img/taobaowang.png" >

<img src="img/taobaowang.png" >

<img src="img/taobaowang.png" >

<img src="img/taobaowang.png" >

</div>

css程式碼;

*{

margin:0;

padding:0;

list-style:none;

text-decoration:none;

}

.wrapper{

height:450px;

border:1px solid black;

}

img{

width:100px;

border:1px solid black;

}

執行結果:每個img圖片之間有空隙,(下,右右空隙)

當img變成float元素,之間的空隙沒有了

float會讓圖片向左靠齊,之間的空隙也會消失

第二種:(下面是block元素)

html程式碼:

<div class="wrapper">

<div class="con">1</div>

<div class="con">2</div>

<div class="con">3</div>

<div class="con">4</div>

<div class="con">5</div>

<div class="con">6</div>

<div class="con">7</div>

<div class="con">8</div>

<div class="con">9</div>

</div>

css程式碼:

*{

margin:0;

padding:0;

list-style:none;

text-decoration:none;

}//初始化標籤多餘屬性,每次都得寫

.wrapper{

width:350px;

height:350px;

border:1px solid black;

}

.con{

width: 100px;

height:100px;

line-height:100px;

text-align:center;

border:1px solid black;

}

執行結果:

當給每個div增加一個float為float;

執行結果為:

分析:元素設定為float:left,元素會向左浮動,如果父級的寬度不夠(因為這裡的div寬高為100px,父級寬高為350px,寬只能放三個div子元素),那麼元素向下繼續向左浮動

如果上面的div子元素設定為float:right;

執行結果變為:

分析:元素設定為float:right,元素會向右浮動,如果父級的寬度不夠,那麼元素向下繼續向右浮動

如果元素設定為float:none或者float:inherit(此時子元素繼承的是父元素的flat,因為父級沒有float屬性,所以子元素也會沒有float屬性)

浮動流以及浮動流的消除

浮動元素產生了浮動流,塊級元素,看不到他們,他們分層了,產生了bfc的元素和文字類屬性的元素和文字元素可以看到浮動元素

產生原因:父級包住具有浮動元素(子元素都是浮動元素),父級元素且有border屬性,父級的下邊框會包不住子元素,前提是父級元素不設定寬高

html程式碼:

<div class="wrapper">

<div class="con">1</div>

<div class="con">2</div>

<div class="con">3</div>

<div class="con">4</div>

<div class="con">5</div>

<div class="con">6</div>

<div class="con">7</div>

<div class="con">8</div>

<div class="con">9</div>

</div>

css程式碼:

*{

margin:0;

padding:0;

list-style:none;

text-decoration:none;

}

.wrapper{

border:1px solid black;

}

.con{

float:left ;

width: 100px;

height:100px;

line-height:100px;

text-align:center;

border:1px solid black;

}

執行結果:

在下面增加一個<div class="class" style="width:100px;height:100px;background-color:#f00;">我要自由</div>,

本來我們想這樣顯示:

但是卻是這樣顯示:

是不是很搞怪

所以我們必須消除浮動流,下面及介紹集中清除浮動流的方式

第一種:在子元素最後加一個p標籤

在html程式碼變成了:

<div class="wrapper">

<div class="con">1</div>

<div class="con">2</div>

<div class="con">3</div>

<div class="con">4</div>

<div class="con">5</div>

<div class="con">6</div>

<div class="con">7</div>

<div class="con">8</div>

<div class="con">9</div>

<p></p>

</div>

css程式碼中增加:

p{

clear:both;

}

缺點:在程式設計時不能隨便增加一個結構(html標籤就是結構)

第二種:使用偽元素(規範的)

先介紹一下偽元素,偽元素:一個標籤剛出生時,在邏輯的最前面和最後面就已經有兩個偽元素了,只不過不操作他,就看不到

例如在html中寫一個<div>123</div>那麼這個div就有div::before和div::after,這兩個屬性和clear:both;content=""配合使用

在css中寫:

div::before{

content:"前端還是很有意思的呀"

}

div::after{

content:"是的呀";

}

執行結果:

清除浮動流:

html程式碼:

<div class="wrapper">

<div class="con">1</div>

<div class="con">2</div>

<div class="con">3</div>

<div class="con">4</div>

<div class="con">5</div>

<div class="con">6</div>

<div class="con">7</div>

<div class="con">8</div>

<div class="con">9</div>

</div>

<div class="class" style="width:100px;height:100px;background-color:#f00;">我要自由</div>

css程式碼:

*{

margin:0;

padding:0;

list-style:none;

text-decoration:none;

}

.wrapper{

border:1px solid black;

}

.con{

float:left ;

width: 100px;

height:100px;

line-height:100px;

text-align:center;

border:1px solid black;

}

.class{

width:100px;

height:100px;

background-color:#f40;

}

.wrapper::after{

display:block;

clear:both;

content:"";

}

執行結果:

第三種:使用bfc清除浮動(將父元素變成bfc元素)

bfc(black format context)塊級格式化上下文,把html中的每一個標籤都當作一個盒子,每個盒子都有一套渲染規則,bfc可以通過特定的手段,改變盒子內部結構(改變盒子的語法結構)

如何觸發一個盒子的bfc:

A: position:absolute;

B:display:inline-block;

C: float:left / right;

D: overflow:hidden;

這裡的話把偽元素清除浮動css程式碼總的偽元素程式碼改變成:

.wrapper{

float:left;

}

執行結果:

分析:雖然父級解決了邊框包住子級,但是由於父級現在是float元素,對後面的元素還是會產生影響

如果把float變成position:absolute

執行結果:

這樣也不行

如果把position:absolute變成display:inline-block;

執行結果:

這樣好像可以,但是因為父級是inline-block,帶有文字特性,下面會有空隙,還是不行

如果把display:inline-block變成overflow:hidden

執行結果:

這個可以

注意:消除浮動流我們只用偽元素,而且如果元素設定position:absolute或者float:left/right時,那麼這個元素會變成inline-block

例如:

html程式碼:

<span>123</span>

span本來是inline元素

css程式碼:

span{

position:absolute;或者float:left;

width:100px;

height:100px;

background-color:#f40;

}

執行結果:

分析:由於span標籤設定了position:absolute;span本來是行級元素,不可以改變寬高,現在變成了行級塊元素,可以設定寬高