包含塊css
浮動元素的特性html
浮動元素的擺放規則segmentfault
浮動元素的幾種行爲佈局
清除浮動spa
全部元素的佈局都是依賴於包含塊的。3d
舉個例子來講code
<body> <div class="parent"> <div class="child"></div> </div> </body>
div.child
的包含塊就是div.parent
,也就是說div.child
位置的擺放是依賴於div.parent
。div.parent
的包含塊就是body
。htm
一句話總結:浮動元素的包含塊定義爲最近
的塊級祖先
元素。blog
那麼body
的包含塊html
的包含塊是誰呢?爲了方便閱讀,這個問題將在下次的文章中介紹。ip
爲了便於閱讀,請先了解行內元素的相關概念以及外邊距合併的原理。
浮動元素會從文檔的正常流(簡稱文檔流)
中脫離,但仍會影響
佈局。
正常流(文檔流):這是指西方語言文本從左到右,從上到下顯示。簡單來講就是一種自上而下自左而右到一種閱讀方式
浮動元素的外邊距不會合並
若是確實要浮動一個非替換元素,則必須爲該元素聲明一個width,不然根據CSS規範,元素寬度
趨於0
舉個例子:
<body> <div></div> </body>
如今對代碼進行修改,給div加個浮動
<body> <div style="float:left;"></div> </body>
1)浮動元素的左(或右)外邊界不能超出其包含塊的左(或右)內邊界。
這裏的左(或右)是指浮動方向。
<div class="wrap" style="width:400px;height:200px;border:1px solid;"> <div class="box" style="float:left;width:100px;height:100px;background-color:red;"> </div> </div>
2)浮動元素的左(或右)外邊界必須是源文檔中以前出現的左浮動(或右浮動)元素的左(右)邊界,除非後出現浮動元素的頂端在先出現浮動元素的底端下面。
該規則主要針對多個浮動元素,而且防止它們發生覆蓋。
<style type="text/css"> div{width:100px;height:100px;} .wrap{width:400px;height:200px;border:1px solid;} .box0{background-color:red;} .box1{background-color:blue;} .box2{background-color:green;} .fl{float:left;} .special{width:300px;height:100px;background:gray;} </style> </head> <body> <div class="wrap"> <div class="box0 fl"></div> <div class="box1 fl"></div> <div class="box2 fl"></div> <div class="special fl"></div> </div> </body>
3)左浮動元素的右外邊界不會在其右邊右浮動元素的左外邊界的右邊。一個右浮動元素的左外邊界不會在其左邊任何左浮動元素的右外邊界的左邊。這條規則比較繞,我的理解就是多個子元素一塊兒浮動時,在有限的寬度裏不會發生重疊。
<style type="text/css"> div{width:300px;height:100px;} .wrap{width:400px;height:200px;border:1px solid;} .box0{background-color:red;} .box1{background-color:blue;} .fl{float:left;} </style> </head> <body> <div class="wrap"> <div class="box0 fl"></div> <div class="box1 fl"></div> </div> </body>
123總結:通常狀況下,浮動元素不會發生重疊
或覆蓋
,水平
方向上也不會超出父元素邊界。
4)一個浮動元素的頂端
不能比其父元素的內頂端
更高。若是一個浮動元素在兩個合併外邊距
之間,放置這個浮動元素時就好像在兩個元素之間有一個塊級父元素。
內頂端
在這裏的意思就是content
的頂部。也就是下圖箭頭所指藍色區域
的頂端。
<style type="text/css"> .wrap{width:200px;height:200px;border:1px solid;padding:20px;} .child{width:50px;height:50px;float:right;background-color:red;} </style> </head> <body> <div class="wrap"> <div class="child"> </div> </div> </body>
那麼這條規則的第一句話意思就是浮動元素的頂端不會比父元素的content區頂端高。
第二句話不太好理解,先看段代碼。
<style type="text/css"> div{margin:8px 0;} </style> </head> <body> <div>First</div> <div style="float:left">Float Div</div> <div>Last Div</div> </body>
效果是這樣的。
第二句話的意思我的理解
爲:元素浮動後外邊距再也不合並,而LastDiv
依然處在正常流中(會與First
發生合併),因此出現FloatDiv
低於LastDiv
現象。
5)浮動元素的頂端不能比以前全部浮動元素
或塊級元素
的頂端更高。
這條規則比較好理解。注意這裏的浮動元素和塊級元素都是同級別
的。
6)若是源文檔中一個浮動元素以前出現另外一個元素
,浮動元素的頂端不能比包含
該元素所生成框的任何行框
的頂端更高。
一張圖理解該規則
紅色區域是浮動元素所在行的行框
456總結:這三條規則以遞進的方式來描述浮動元素在垂直向上
方向的位置擺放問題。分別介紹浮動元素與包含塊的位置關係,浮動元素與同級元素的位置關係以及浮動元素與其所在行框的位置關係。
高度超出包含塊的高度時會發生什麼?常說的高度塌陷就是這裏產生的。
在前面的規則中並無對該狀況進行處理。
CSS2.1 中對此行爲進行了說明,浮動元素會延伸,從而包含其全部後代浮動元素。因此經過將父元素設爲浮動元素,就能夠把浮動元素包含在其父元素內。
<style type="text/css"> .wrap{border:1px solid;float:left;} .child{width:100px;height:300px;background:red;float:left;} </style> </head> <body> <div class="wrap"> <div class="child"></div> The content <strong>after</strong> float element.The content <strong>after</strong> float element.The content <strong>after</strong> float element.The content <strong>after</strong> float element.The content <strong>after</strong> float element.The content <strong>after</strong> float element. </div> </body>
浮動元素的規則對浮動元素在水平以及垂直朝上方向的位置擺放進行了嚴格限制。然而,當margin設爲負值時,確實超出了包含塊的邊界。
稍加修改樣式
.child{width:100px;height:300px;background:red;float:left;margin:-50px 0 0 -50px;} body{padding:50px;}
浮動元素過寬時,此時會哪邊會超出包含塊邊界,則是由浮動方向決定了。由於規則1裏說的浮動元素的左(或右)邊界(浮動方向)不會超過包含塊的左(或右)邊界。
a.向左浮動時
b.向右浮動時
a)行內元素
行內框與一個浮動元素重疊時,其邊框
、背景
和內容
都在該浮動元素「之上」顯示。
b)塊級元素
塊框與一個浮動元素重疊時,其邊框
和背景
都在該浮動元素「之下」顯示,而內容
在浮動元素「之上」顯示。
<style type="text/css"> .box{width:200px;height:200px;background-color:#af3;float:left;margin-right:-30px;} span{border:1px solid;background-color:#3fa;} p{border:1px solid;background-color:#f3a;} </style> </head> <body> <div class="wrap"> <div class="box"></div> <span>This is inline element</span> <p>This is block element</p> </div> </body>
一圖勝千言。
CSS1
和CSS2
中對clear工做是這樣描述的:增長元素的上外邊距
,使之最後落在浮動元素
的下面。這也就是說清除元素的上外邊距可能會調整。
CSS2.1
中,引進了一個清除區域
(clearance)。清除區域時在元素的上外邊距增長的額外間隔
,不容許任何浮動元素
進入這個範圍內。這意味着在給元素設置clear時,它的外邊距並不改變。之因此發生下移是這個清除區域形成的。
這是未設置clear屬性時的效果。
<style type="text/css"> .wrap{width:400px;height:200px;} div{width:100px;height:98px;border:1px solid;} div.fir{background-color:#af3;float:left;} div.sec{background-color:#3fa;width:300px;} </style> </head> <body> <div class="wrap"> <div class="fir"></div> <div class="sec"></div> </div> </body>
給sec設置clear屬性時,是這樣的。紅色區域是清除區域。
div.sec{background-color:#3fa;width:300px;clear:left;}
關於清除區域大小:我的理解這個區域的大小是不固定的,這個大小是由清除元素前面所要清除的浮動元素的大小來決定的。而且浮動元素和清除元素的方向是要保持一致的。