CSS魔法堂 hasLayout原來是這樣

2021-09-22 11:20:42 字數 4018 閱讀 4183

過去一直聽說舊版本ie下很多詭異bug均由乙個神秘角色引起的,那就是haslayout。趁著最近突然發神經打算好好學習css,順便解答多年來的疑惑。

haslayout可以簡單看作是ie5.5/6/7中的bfc(block formatting context)。也就是乙個元素要麼自己對自身內容進行組織和尺寸計算(即可通過width/height來設定自身的寬高),要麼由其containing block來組織和尺寸計算。而ifc(即沒有擁有布局)而言,則是元素無法對自身內容進行組織和尺寸計算,而是由自身內容來決定其尺寸(即僅能通過line-height設定內容行距,通過行距來支撐元素的高度;也無法通過width設定元素寬度,僅能由內容來決定而已)

當haslayout為true時(就是所謂的"擁有布局"),相當於元素產生新bfc,元素自己對自身內容進行組織和尺寸計算;

當haslayout為false時(就是所謂的"不擁有布局"),相當於元素不產生新bfc,元素由其所屬的containing block進行組織和尺寸計算。

和產生新bfc的特性一樣,haslayout無法通過css屬性直接設定,而是通過某些css屬性間接開啟這一特性。不同的是某些css屬性是以不可逆方式間接開啟haslayout為true。並且預設產生新bfc的只有html元素,而預設haslayout為true的元素就不只有html元素了。

另外我們可以通過object.currentstyle.haslayout屬性來判斷元素是否開啟了haslayout特性。

到這裡我們應該了解到若要理解haslayout則必須理解bfc,因此這裡可參考css魔法堂:重新認識box model、ifc、bfc和collapsing margins

, 

, , , ,

, , ,,

, , , ,

display: inline-block

height: (除 auto 外任何值)

width: (除 auto 外任何值)

float: (left 或 right)

position: absolute

writing-mode: tb-rl

zoom: (除 normal 外任意值)

ie7 還有一些額外的屬性(不完全列表)可以觸發 haslayout :

min-height: (任意值)

min-width: (任意值)

max-height: (除 none 外任意值)

max-width: (除 none 外任意值)

overflow: (除 visible 外任意值,僅用於塊級元素)

overflow-x: (除 visible 外任意值,僅用於塊級元素)

overflow-y: (除 visible 外任意值,僅用於塊級元素)

position: fixed

ie6 以前的版本(也包括 ie6 及以後所有版本的混雜模式,其實這種混雜模式在渲染方面就相當於 ie 5.5), 通過設定任何元素的 'width' 或 'height'(非auto)都可以觸發 haslayout ; 但在 ie6 和 ie7 的標準模式中的行內元素上卻不行,設定 'display:inline-block' 才可以。

其中通過display:inline-blockmin-width:0min-height:0將不可逆地啟用haslayout特性。而在沒有其他屬性啟用haslayout時,可通過以下方式關閉haslayout

max-width, max-height (設為 "none")(在ie7中)

position

(設為 "static")

float

(設為 "none")

overflow

(設為 "visible")

(在ie7中)

zoom

(設為 "normal")

writing-mode

(從 "tb-rl" 設為 "lr-t")

而產生新bfc的css屬性

position:absolute/fixed

float:left/right

display:inline-block/table-cell/table-caption/flex/inline-flex

overflow:(除visible外任意值)

可以看到導致產生新bfc的方式和觸發haslayout==true的方式不完全重疊。因此haslayout==true所引發的問題,很大程度可以理解為在不應該的或沒有預料到的地方產生新的bfc導致的。

僅當乙個元素即在 ie 早期版本中觸發了 haslayout,又在其他瀏覽器中建立了 block formatting context 時,才能避免上述問題的發生。即同時啟用上述兩者以保證各瀏覽器的相容,或者相反,兩者皆不啟用。

使元素即生成了 block formatting context,又觸發了 haslayout

1.1 對於觸發 haslayout 的元素,通過 css 設定,使它產生 block formatting context;

1.2 生成 block formatting context 但是沒有觸發 haslayout 的元素,通過設定 'zoom:1',使其觸發 haslayout。

使元素即沒有觸發 haslayout,又沒有建立 block formatting context。

談談bfc與ie特有屬性haslayout

rm8002: 不能同時在 ie6 ie7 ie8(q) 中觸發 haslayout 並在其他瀏覽器中建立 block formatting context 的元素在各瀏覽器中的表現會有差異

如果您覺得本文的內容有趣就掃一下吧!捐贈互勉!

分類:

css好文要頂

關注我收藏該文

^_^肥仔john

關注 - 85

粉絲 - 707

+加關注 10

css魔法堂:重新認識box model、ifc、bfc和collapsing margins

css魔法堂:不得不說的containing block

posted @

2016-03-18 10:47

^_^肥仔john 閱讀(

0) 編輯收藏

重新整理頁面

返回頂部

登入 或

註冊,訪問**首頁。

【推薦】超50萬vc++原始碼: 大型工控、組態\**、建模cad原始碼2018!

最新it新聞:

· 京東宣布成立三大事業群 打造積木型組織擁抱無界零售變革

· 蘇寧宣布重磅福利:「7天無理由退貨」線上線下統一標準

· 興趣降溫 安卓廠商無意模仿iphone x推出3d識別

· 樂視雲更名新樂視雲聯:仍未獲雲服務牌照

· 微軟搜尋引擎bing改進航班 電影和比賽結果查詢

» 更多新聞...

最新知識庫文章:

· 步入雲計算

· 以作業系統的角度述說執行緒與程序

· 軟體測試轉型之路

· 門內門外看招聘

· 大道至簡,職場上做人做事做管理

»

肥仔john@github

本文**

CSS魔法堂 hasLayout原來是這樣的!

過去一直聽說舊版本ie下很多詭異bug均由乙個神秘角色引起的,那就是haslayout。趁著最近突然發神經打算好好學習css,順便解答多年來的疑惑。haslayout可以簡單看作是ie5.5 6 7中的bfc block formatting context 也就是乙個元素要麼自己對自身內容進行組織...

CSS魔法堂 hasLayout原來是這樣

過去一直聽說舊版本ie下很多詭異bug均由乙個神秘角色引起的,那就是haslayout。趁著最近突然發神經打算好好學習css,順便解答多年來的疑惑。haslayout可以簡單看作是ie5.5 6 7中的bfc block formatting context 也就是乙個元素要麼自己對自身內容進行組織...

CSS魔法堂 Position定位詳解

一 position各屬性值詳解 1.static 預設值,元素將按照正常文件流規則排列。2.relative 相對定位,元素仍然處於正常文件流當中,但可以通過left top right和bottom的css規則來改變元素的位置。注意點 a 元素原來位置將保留,不被其他元素所佔據 b 當使用lef...