要想更好的理解 css, 尤爲是 IE 下對 css 的渲染,haslayout 是一個很是有必要完全弄清除的概念。大多 IE
下的顯示錯誤,就是源於 haslayout。css
haslayout 是Windows Internet Explorer渲染引擎的一個內部組成部分。在Internet Explorer中,一個元素要麼本身對自身的內容進行計算大小和組織,要麼依賴於父元素來計算尺寸和組織內容。爲了調節這兩個不一樣的概念,渲染引擎採用了 hasLayout 的屬性,屬性值能夠爲true或false。當一個元素的 hasLayout 屬性值爲true時,咱們說這個元素有一個佈局(layout)html
當一個元素有一個佈局時,它負責對本身和可能的子孫元素進行尺寸計算和定位。簡單來講,這意味着這個元素須要花更多的代價來維護自身和裏面的內容,而不是依賴於祖先元素來完成這些工做。所以,一些元素默認會有一個佈局。當咱們說一個元素「擁有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」。css3
負責組織自身內容的元素將默認有一個佈局,主要包括如下元素(不徹底列表):瀏覽器
* body and html
* table, tr, th, td
* img
* hr
* input, button, file, select, textarea, fieldset
* marquee
* frameset, frame, iframe
* objects, applets, embedapp
對於並不是全部的元素都默認有佈局,微軟給出的主要緣由是「性能和簡潔」。若是全部的元素都默認有佈局,會對性能和內存使用上產生有害的影響。佈局
大部分的 IE 顯示錯誤,均可以經過激發元素的 haslayout 屬性來修正。能夠經過設置 css 尺寸屬性(width/height)等來激發元素的 haslayout,使其「擁有佈局」。以下所示,經過設置如下 css 屬性便可。性能
* display: inline-block
* height: (任何值除了auto)
* float: (left 或 right)
* position: absolute
* width: (任何值除了auto)
* writing-mode: tb-rl
* zoom: (除 normal 外任意值)ui
Internet Explorer 7 還有一些額外的屬性(不徹底列表):spa
* 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 盒模型中的屬性,目前還未被瀏覽器普遍支持。
對於內聯元素(默認即爲內聯的元素,如 span,或 display:inline; 的元素),
具備「layout」 的元素若是同時 display: inline ,那麼它的行爲就和標準中所說的 inline-block 很相似了:在段落中和普通文字同樣在水平方向和連續排列,受 vertical-align 影響,而且大小能夠根據內容自適應調整。這也能夠解釋爲何單單在 IE/Win 中內聯元素能夠包含塊級元素而少出問題,由於在別的瀏覽器中 display: inline 就是內聯,不像 IE/Win 一旦內聯元素擁有 layout 還會變成 inline-block。
當網頁在 IE 中有異常表現時,能夠嘗試激發 haslayout 來看看是否是問題所在。經常使用的方法是給某元素 css 設定 zoom:1 。使用 zoom:1 是由於大多數狀況下,它能在不影響現有環境的條件下激發元素的 haslayout。而一旦問題消失,那基本上就能夠判斷是 haslayout 的緣由。而後就能夠經過設定相應的 css 屬性來對這個問題進行修正了。建議首先要考慮的是設定元素的 width/height 屬性,其次再考慮其餘屬性。
對 IE6 及更早版原本說,經常使用的方法被稱爲霍莉破解(Holly hack),即設定這個元素的高度爲 1% (height:1%;)。須要注意的是,當這個元素的 overflow 屬性被設置爲 visible 時,這個方法就失效了。或者使用 IE 的條件註釋。
對 IE7 來講,最好的方法時設置元素的最小高度爲 0 (min-height:0;)。
bug 修復: display:inline;
bug 修復: _height:1%;
bug 修復: _height:1%;