深入瞭解標準流以及脫標元素的特點
1.標準流(Normal Flow)
預設情況下,元素都是按照normal flow(標準流、常規流、正常流、文件流)進行排布的。
- 排布順序:在瀏覽器中從左到右,從上到下順序擺放;
- 預設情況下,元素互相之間不存在層疊現象;
2.什麼情況下元素會脫標?
脫離標準流(簡稱“脫標”),那麼什麼情況下元素會脫離標準流呢?常見有以下兩種:
- 元素設定position,並且position的值為fixed或absolute;
- 元素新增浮動float,並且float的值不為none;
3.脫標元素的特點
-
可以隨意設定寬高,寬高預設由內容決定。
-
塊級元素:
-
標準流下的展示(預設佔滿父元素的寬度);
-
脫標下的展示(寬高由內容撐開);
-
-
行內元素脫離標準流:
-
標準流下的展示(預設由內容撐開,且不能設定寬高);
-
脫標下的展示(寬高還是由內容撐開,但是可以設定寬高);
-
-
-
不再受標準流的約束。
-
不再給父元素彙報寬高資料,也就是不能將父元素撐開。
4.脫標和display有什麼關係?
根據以上脫標元素的特點,可能會有人認為脫標其實就是將元素轉換成了
inline-block
,因為其展示效果和設定display: inline-block;
效果一致,但是其中的原因卻不是這樣。
當不同元素進行了脫標,對應會展示成display的何種屬性值?在MDN和W3C官方網站上都有進行解釋,並且提供了參考表格:
-
MDN中,以搜尋float屬性為例;
-
在W3C官方文件中,有關於
display
、position
和float
之間的關係進行了說明;
總結:
- 大部分元素在脫標後都會轉換成
block
型別。 - 這裡可以丟擲一個疑問,
block
型別不是佔據父元素的寬度麼,為什麼脫標元素最終是由內容撐開的? - 解答:元素脫標後,已經不受標準流約束,其位置也是不侷限在父元素之內,很難說父元素是誰,且塊級(block)元素預設寬高都為
auto
,難以參考父元素寬度,所以最好的展示形式就是預設由內容撐開。