普通流(normal flow,國內有人翻譯爲文檔流):將窗體自上而下分紅一行一行,
塊級元素從上至下、 行內元素在每行中按從左至右的挨次排放元素,即爲文檔流。
瞭解文檔流是css佈局的基礎。雖然 普通流 很基礎, 但資料較少,以前對這個概念模糊,現總結以下,歡迎拍。css
html元素根據普通流佈局特性分爲塊級元素(block)和內聯元素(inline)html
塊級元素在佈局的特性顯示爲:獨佔一行,下一個元素另起新行, 好比網頁的div標籤它默認佔用的寬度位置是一整行,p標籤默認佔用寬度也是一整行,由於div標籤和p標籤是塊狀對象。表現爲如下特性:瀏覽器
塊級元素: p、h一、div、 ul、ol、li、 table、 form
display爲block的元素ide
說到普通流塊的佈局,不得不說BFC了,
關於BFC這篇文章( http://www.w3ctech.com/topic/865 )解釋的很清楚了。
總結來講,就是如下兩點:
BFC佈局規則:佈局
內部的Box會在垂直方向,一個接一個地放置。flex
哪些元素會產生BFCspa
內聯元素,表現爲行內樣式,噹噹前行放不下的時候,再另起新行.表現爲如下特性:翻譯
input、 a、 img、 span
display爲inline的元素3d
一樣相對BFC,行內元素有IFCcode
IFC佈局規則
詳細可查看:inline-formatting: http://www.w3.org/TR/CSS2/visuren.html#inline-formatting
有三種狀況將使得元素脫離文檔流而存在,分別是浮動,絕對定位, 固定定位,隱藏元素。
浮動元素不佔任何正常文檔流空間, 而浮動元素的定位照樣基於正常的文檔流父級元素 ,而後從文檔流中抽出並儘可以遠的挪動至左側或許右側。當一個元素脫離正常文檔流後,依然在文檔流中的其餘元素將忽略該元素並填補其原先的空間。
但浮動元素,與行內元素相遇, 行內元素 並不會佔用浮動元素的空間. 用浮動實現佈局,父級元素 塌縮就是由於浮動元素不在正常流中。
The float CSS property specifies that an element should be taken from the normal flow and placed along the left or right side of its container, where text and inline elements will wrap around it .
基於文檔流,理解如下的定位形式:
相對定位:元素框偏移某個距離。元素仍保持其未定位前的形狀,它本來所佔的空間仍保留。
絕對定位:即徹底離開文檔流, 相關於position屬性非static值的比來父級元素進行偏移。
absolute:絕對定位。將對象從文檔流中拖出,使用left,right,top,bottom等屬性相對於其最接近的一個最有定位設置的父對象進行絕對定位。若是不存在這樣的父對象,則依據body對象。而其層疊經過z-index屬性定義
注:當只設置position:absolute
,不設置 left,right,top,bottom時,元素的位置,仍是在原來的位置。
CSS
<divclass="a">
<divclass="b">b</div>
<divclass="c">c</div>
</div>
HTML
.a
{
position:relative;
width:300px;
border:1px solid blue;
padding:3px;
}
.b,.c
{
height:50px;
border:1px solid red;
background-color:#eee;
}
.c
{
width:100%;
position:absolute;
/*top:0;*/
}
顯示效果以下:
當.c類加了top:0;
顯示效果以下。
固定定位:即徹底離開文檔流,相關於視區進行偏移。
對於定位要注意:
display:none
不在渲染樹中,確定不在文檔流中。
diplay:none和visibility:hidden的區別:
文檔流是css佈局的基礎,以上簡單介紹了的文檔流的概念,根據文檔流元素的的分類,什麼會脫離文檔流,和BFC等佈局特性,可能會有錯誤,歡迎指正。
[1].文檔流與div定位http://www.cnblogs.com/tim-li/archive/2012/07/09/2582618.html
[2].普通流http://www.w3.org/html/ig/zh/wiki/CSS2/visuren#block-formatting
[3].inline-formatting: http://www.w3.org/TR/CSS2/visuren.html#inline-formatting