過去一直聽說舊版本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-block
或min-width:0
或min-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。
一 資料探勘(DM)到底是何方神聖?
在此借助 5w1h 的思想,從整體上了解下資料探勘,比如什麼是資料探勘 為什麼要做資料探勘 在哪些場景下用資料探勘,以及怎麼做資料探勘。隨著網際網路技術的發展,資料的生產 收集和儲存也越來越方便。面對海量的資料,通常其維度眾多,涉及的問題又複雜,我們需要一種規範的解決方案,能夠利用並且充分利用這些資...
this到底是誰
js中函式的4種呼叫方式 1.作為普通函式來呼叫 alert window.xx undefined function t t alert window.xx 333 解釋 作為普通函式來呼叫this時,this的值指向 windwo,準確的說,this為null,但被解釋成window,在ecma...
Segmentation fault到底是何方妖孽
那麼對於任何沒有經過 mmu對映過的虛擬空間的位址,不管程序是執行寫操作還是讀操作,作業系統都會捕捉到這個錯誤的非法訪問,然後輸出乙個 segmetation fault 的錯誤提示資訊並強行終止程序。程式之所以會時不時的出現 segmetation fault 的根本原因是程序訪問到了沒有訪問許可...