CSS haslayout 徹底了解

什么是 haslayout ?
haslayout 是Windows Internet Explorer渲染引擎的一個內(nèi)部組成部分。在InternetExplorer中,一個元素要么自己對自身的內(nèi)容進行計算大小和組織,要么依賴于父元素來計算尺寸和組織內(nèi)容。為了調(diào)節(jié)這兩個不同的概念,渲染引擎采用了 hasLayout 的屬性,屬性值可以為true或false。當(dāng)一個元素的 hasLayout屬性值為true時,我們說這個元素有一個布局(layout)
當(dāng)一個元素有一個布局時,它負責(zé)對自己和可能的子孫元素進行尺寸計算和定位。簡單來說,這意味著這個元素需要花更多的代價來維護自身和里面的內(nèi)容,而不是依賴于祖先元素來完成這些工作。因此,一些元素默認會有一個布局。當(dāng)我們說一個元素“擁有l(wèi)ayout”或“得到layout”,或者說一個元素“has layout” 的時候,我們的意思是指它的微軟專有屬性 hasLayout 被設(shè)為了 true。一個“layout元素”可以是一個默認就擁有 layout 的元素或者是一個通過設(shè)置某些 CSS 屬性得到 layout的元素。如果某個HTML元素擁有 haslayout 屬性,那么這個元素的 haslayout 的值一定只有 true,haslayout為只讀屬性 一旦被觸發(fā),就不可逆轉(zhuǎn)。通過 IE Developer Toolbar 可以查看 IE 下 HTML元素是否擁有haslayout,在 IE Developer Toolbar 下,擁有 haslayout的元素,通常顯示為“haslayout = -1”。
負責(zé)組織自身內(nèi)容的元素將默認有一個布局,主要包括以下元素(不完全列表):
* body and html
* table, tr, th, td
* img
* hr
* input, button, file, select, textarea, fieldset
* marquee
* frameset, frame, iframe
* objects, applets, embed
對于并非所有的元素都默認有布局,微軟給出的主要原因是“性能和簡潔”。如果所有的元素都默認有布局,會對性能和內(nèi)存使用上產(chǎn)生有害的影響。
如何激發(fā) haslayout?
大部分的 IE 顯示錯誤,都可以通過激發(fā)元素的 haslayout 屬性來修正??梢酝ㄟ^設(shè)置 css 尺寸屬性(width/height)等來激發(fā)元素的 haslayout,使其“擁有布局”。如下所示,通過設(shè)置以下 css 屬性即可。
* display: inline-block
* height: (任何值除了auto)
* float: (left 或 right)
* position: absolute
* width: (任何值除了auto)
* writing-mode: tb-rl
* zoom: (除 normal 外任意值)
Internet Explorer 7 還有一些額外的屬性(不完全列表):
* min-height: (任意值)
* max-height: (除 none 外任意值)
* min-width: (任意值)
* max-width: (除 none 外任意值)
* overflow: (除 visible 外任意值)
* overflow-x: (除 visible 外任意值)
* overflow-y: (除 visible 外任意值)
* position: fixed
其中 overflow-x 和 overflow-y 是 css3 盒模型中的屬性,目前還未被瀏覽器廣泛支持。
對于內(nèi)聯(lián)元素(默認即為內(nèi)聯(lián)的元素,如 span,或 display:inline; 的元素),
width 和 height 只在 IE5.x 下和 IE6 或更新版本的 quirks 模式下觸發(fā) hasLayout 。而對于IE6,如果瀏覽器運行于標準兼容模式下,內(nèi)聯(lián)元素會忽略 width 或 height 屬性,所以設(shè)置 width 或 height不能在此種情況下令該元素具有 layout。
zoom 總是可以觸發(fā) hasLayout,但是在 IE5.0 中不支持。
具有“layout” 的元素如果同時 display: inline ,那么它的行為就和標準中所說的 inline-block很類似了:在段落中和普通文字一樣在水平方向和連續(xù)排列,受 vertical-align影響,并且大小可以根據(jù)內(nèi)容自適應(yīng)調(diào)整。這也可以解釋為什么單單在 IE/Win 中內(nèi)聯(lián)元素可以包含塊級元素而少出問題,因為在別的瀏覽器中display: inline 就是內(nèi)聯(lián),不像 IE/Win 一旦內(nèi)聯(lián)元素擁有 layout 還會變成 inline-block。
haslayout 問題的調(diào)試與解決
當(dāng)網(wǎng)頁在 IE 中有異常表現(xiàn)時,可以嘗試激發(fā) haslayout 來看看是不是問題所在。常用的方法是給某元素 css 設(shè)定 zoom:1。使用 zoom:1 是因為大多數(shù)情況下,它能在不影響現(xiàn)有環(huán)境的條件下激發(fā)元素的 haslayout。而一旦問題消失,那基本上就可以判斷是haslayout 的原因。然后就可以通過設(shè)定相應(yīng)的 css 屬性來對這個問題進行修正了。建議首先要考慮的是設(shè)定元素的width/height 屬性,其次再考慮其他屬性。
對 IE6 及更早版本來說,常用的方法被稱為霍莉破解(Holly hack),即設(shè)定這個元素的高度為 1%(height:1%;)。需要注意的是,當(dāng)這個元素的 overflow 屬性被設(shè)置為 visible 時,這個方法就失效了?;蛘呤褂?IE的條件注釋。
對 IE7 來說,最好的方法時設(shè)置元素的最小高度為 0 (min-height:0;)。
haslayout 問題引起的常見 bug
IE6 及更低版本的雙空白邊浮動 bug
bug 修復(fù): display:inline;
IE5-6/win 的 3 像素偏移 bug
bug 修復(fù): _height:1%;
E6 的躲躲貓(peek-a-boo) bug
bug 修復(fù): _height:1%;
相關(guān)文章
- CSS Grid 是一種二維布局系統(tǒng),可以同時控制行和列,相比 Flex(一維布局),更適合用在整體頁面布局或復(fù)雜模塊結(jié)構(gòu)中,這篇文章主要介紹了前端CSS Grid 布局詳解,需要的朋2025-04-16
CSS Padding 和 Margin 區(qū)別全解析
CSS 中的 padding 和 margin 是兩個非?;A(chǔ)且重要的屬性,它們用于控制元素周圍的空白區(qū)域,本文將詳細介紹 padding 和 margin 的概念、區(qū)別以及如何在實際項目中使用它們2025-04-07- will-change 是一個 CSS 屬性,用于告訴瀏覽器某個元素在未來可能會發(fā)生哪些變化,本文給大家介紹CSS will-change 屬性詳解,感興趣的朋友一起看看吧2025-04-07
- 本文給大家分享在 CSS 中,去除a標簽(超鏈接)的下劃線的幾種方法,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧2025-04-07
- 在前端開發(fā)中,CSS(層疊樣式表)不僅是用來控制網(wǎng)頁的外觀和布局,更是實現(xiàn)復(fù)雜交互和動態(tài)效果的關(guān)鍵技術(shù)之一,隨著前端技術(shù)的不斷發(fā)展,CSS的用法也日益豐富和高級,本文將2025-04-07
css中的 vertical-align與line-height作用詳解
文章詳細介紹了CSS中的`vertical-align`和`line-height`屬性,包括它們的作用、適用元素、屬性值、常見使用場景、常見問題及解決方案,感興趣的朋友跟隨小編一起看看吧2025-03-26淺析CSS 中z - index屬性的作用及在什么情況下會失效
z-index屬性用于控制元素的堆疊順序,值越大,元素越顯示在上層,它需要元素具有定位屬性(如relative、absolute、fixed或sticky),本文給大家介紹CSS 中z - index屬性的作用2025-03-21- 文章詳細介紹了CSS中的打印媒體查詢@mediaprint包括基本語法、常見使用場景和代碼示例,如隱藏非必要元素、調(diào)整字體和顏色、處理鏈接的URL顯示、分頁控制、調(diào)整邊距和背景等2025-03-18
CSS模擬 html 的 title 屬性(鼠標懸浮顯示提示文字效果)
本文介紹了如何使用CSS模擬HTML的title屬性,通過鼠標懸浮顯示提示文字效果,通過設(shè)置`.tipBox`和`.tipBox.tipContent`的樣式,實現(xiàn)了提示內(nèi)容的隱藏和顯示,感興趣的朋友一起2025-03-10前端 CSS 動態(tài)設(shè)置樣式::class、:style 等技巧(推薦)
本文介紹了Vue.js中動態(tài)綁定類名和內(nèi)聯(lián)樣式的兩種方法:對象語法和數(shù)組語法,通過對象語法,可以根據(jù)條件動態(tài)切換類名或樣式;通過數(shù)組語法,可以同時綁定多個類名或樣式,此外2025-02-26