深刻理解hasLayout屬性

解決IE兼容問題是比較頭疼的問題,無論你是新入門的菜鳥還是久經考驗的職業行家,兼容問題,特別是IE,IE6會讓你非常頭疼。很多時候,div CSS在IE下的解析十分奇怪,一個比較經典的bug就是設置border的時候,有時候border會斷開,刷新頁面或者滾動滾動條的時候,斷掉的部分又會連接起來。這些問題的根源很多時候來源於IE的一個特有屬性:hasLayout。hasLayout是一個非常有意思的學術研究,如何深刻理解hasLayout屬性,及他的使用方法,原理,解決IE的兼容問題非常有用處,下面來講解一下hasLayout的屬性,原理與使用方法。

 

這些詭異的問題往往大部分和IE下一個神祕的屬性相關——hasLayout。hasLayout是IE瀏覽器專有的一個屬性,用於CSS的解析引擎。有時候在IE下一些複雜的CSS設置解析起來會出現bug,其原因可能與hasLayout沒有被自動觸發有關,我們通過一些技巧,手動觸發hasLayout屬性就可以解決Bug了。這也算是針對IE下疑難雜症的特殊偏方了,很多時候,觸發了hasLayout就可以藥到病除了。

 

hasLayout的觸發方法有很多種,例如設置width,height值,設置position爲relative等。但如果設置了width,height,或position都會在觸發hasLayout的同時帶來一些副作用的。早期的一些工程師推薦使用“height:1%”來觸發hasLayout,那時還沒有出現IE7,而height屬性在IE6下其實是按照"min-height"來解析的,所以只要對IE6進行hack,"* html{height:1%}"就可以觸發hasLayout,同時又不帶來副作用了。後來出現的IE7仍然存在很多hasLayout的問題,但IE7已經能夠正確識別height屬性了,“height:1%”的方法已經不再適用了。

於是,一個更好的解決方法開始流行,它使用了一個生僻的CSS屬性zoom來觸發hasLayout——"zoom:1"。使用"zoom:1"可以觸發hasLayout,並且不會像height等屬性一樣引入副作用,更妙的是,我們可以不用CSS hack了。但"zoom:1"並不是一定可以觸發hasLayout的。在極少數特殊的情況下,例如非常複雜的CSS設置,特別是使用DHTML的時候,使用"zoom:1"有時候也會無效,這時,我們可能需要藉助更強大的"position:relative"來幫助觸發hasLayout。總之,”zoom“是最常用,最安全,成本最少的觸發hasLayout的方式,一般情況下,使用它就完全可以觸發hasLayout了。如果遇到特殊情況,"zoom:1"無效的情況下,我們可以通過設置"position:relative"來觸發hasLayout,儘管它會帶來一點副作用。

 

值得強調的是,hasLayout的設計初衷是用於輔助塊級元素的盒模型解析的,它是用於塊級元素的。如果用於行內元素,會引發一些特殊的效果,就會讓行內元素擁有一些塊級元素的特性。

 

如:display:inline-block;它是行內的塊級元素,它擁有塊級元素的特點,可以設置長寬,可以設置margin和padding值,但它卻不是獨佔一行的,它的寬度並不佔滿父元素,而是和行內元素一樣,可以和其他行內元素排在同一行裏。它集塊級元素和行內元素的特點於一身,是個非常有用的display類型。 

以上是hasLayout屬性,原理與使用方法總結講解一下,對於解決IE兼容問題幫助很大的,同學在平時做div+css的時候,要注意一下。

haslayout 是Windows Internet Explorer渲染引擎的一個內部組成部分。在InternetExplorer中,一個元素要麼自己對自身的內容進行計算大小和組織,要麼依賴於父元素來計算尺寸和組織內容。爲了調節這兩個不同的概念,渲染引擎採用了 hasLayout 的屬性,屬性值可以爲true或false。當一個元素的 hasLayout屬性值爲true時,我們說這個元素有一個佈局(layout)

 當一個元素有一個佈局時,它負責對自己和可能的子孫元素進行尺寸計算和定位。簡單來說,這意味着這個元素需要花更多的代價來維護自身和裏面的內容,而不是依賴於祖先元素來完成這些工作。因此,一些元素默認會有一個佈局。當我們說一個元素“擁有layout”或“得到layout”,或者說一個元素“has layout” 的時候,我們的意思是指它的微軟專有屬性 hasLayout 被設爲了 true。一個“layout元素”可以是一個默認就擁有 layout 的元素或者是一個通過設置某些 CSS 屬性得到 layout的元素。如果某個HTML元素擁有 haslayout 屬性,那麼這個元素的 haslayout 的值一定只有 true,haslayout爲只讀屬性 一旦被觸發,就不可逆轉。通過 IE Developer Toolbar 可以查看 IE 下 HTML元素是否擁有haslayout,在 IE Developer Toolbar 下,擁有 haslayout的元素,通常顯示爲“haslayout = -1”。

haslayout 問題的調試與解決

 當網頁在 IE 中有異常表現時,可以嘗試激發 haslayout 來看看是不是問題所在。常用的方法是給某元素 css 設定 zoom:1。使用 zoom:1 是因爲大多數情況下,它能在不影響現有環境的條件下激發元素的 haslayout。而一旦問題消失,那基本上就可以判斷是haslayout 的原因。然後就可以通過設定相應的 css 屬性來對這個問題進行修正了。建議首先要考慮的是設定元素的width/height 屬性,其次再考慮其他屬性。

發佈了11 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章