haslayout 是Windows Internet Explorer渲染引擎的一個內部組成部分。在InternetExplorer中,一個元素要麼本身對自身的內容進行計算大小和組織,要麼依賴於父元 素來計算尺寸和組織內容。爲了調節這兩個不一樣的概念,渲染引擎採用了 hasLayout 的屬性,屬性值能夠爲true或false。當一個元素的 hasLayout屬性值爲true時,咱們說這個元素有一個佈局(layout)css
要想更好的理解 css, 尤爲是 IE 下對 css 的渲染,haslayout 是一個很是有必要完全弄清楚的概念。大多IE下的顯示錯誤,就是源於 haslayout。若是它設置成了true,它就不得不去渲染它本身,所以元素不得不擴展去包含它的流出的內容。例如浮動或者很長很長的沒有截斷的單 詞,若是haslayout沒有被設置成true,那麼元素得依靠某個祖先元素來渲染它。這就是不少的ie bugs誕生的地方。html
當一個元素有一個佈局時,它負責對本身和可能的子孫元素進行尺寸計算和定 位。簡單來講,這意味着這個元素須要花更多的代價來維護自身和裏面的內容,而不是依賴於祖先元素來完成這些工做。所以,一些元素默認會有一個佈局。當咱們 說一個元素「擁有layout」或「獲得layout」,或者說一個元素「has layout」 的時候,咱們的意思是指它的微軟專有屬性 hasLayout 被設爲了 true。一個「layout元素」能夠是一個默認就擁有 layout 的元素或者是一個經過設置某些 CSS 屬性獲得 layout的元素。經過 IE Developer Toolbar 能夠查看 IE 下 HTML元素是否擁有haslayout,在 IE Developer Toolbar 下,擁有 haslayout的元素,一般顯示爲「haslayout = -1」。css3
負責組織自身內容的元素將默認有一個佈局,主要包括如下元素(不徹底列表):瀏覽器
* body and htmlapp
* table, tr, th, td佈局
* img性能
* hrui
* input, button, file, select, textarea, fieldsetspa
* marqueeorm
* frameset, frame, iframe
* objects, applets, embed
對於並不是全部的元素都默認有佈局,微軟給出的主要緣由是「性能和簡潔」。若是全部的元素都默認有佈局,會對性能和內存使用上產生有害的影響。
如何激發 haslayout?
大部分的 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 外任意值)
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 盒模型中的屬性,目前還未被瀏覽器普遍支持。
對於內聯元素(默認即爲內聯的元素,如 span,或 display:inline; 的元素),
width 和 height 只在 IE5.x 下和 IE6 或更新版本的 quirks 模式下觸發 hasLayout 。而對於IE6,若是瀏覽器運行於標準兼容模式下,內聯元素會忽略 width 或 height 屬性,因此設置 width 或 height不能在此種狀況下令該元素具備 layout。
對 IE7 來講,最好的方法是設置元素的最小高度爲 0 (min-height:0;)。
haslayout 問題引發的常見 bug:
E6 及更低版本的雙空白邊浮動 bug
bug 修復: display:inline;
IE5-6/win 的 3 像素偏移 bug
bug 修復: _height:1%;
IE6 的躲躲貓(peek-a-boo) bug
bug 修復: _height:1%;
IE6/7負margin隱藏Bug:
bug 修復:去掉父元素的hasLayout;或者賦hasLayout給子元素,並添加position:relative;
須要注意的是,hasLayout屬性是微軟特有的過期屬性,在IE八、IE9中,hasLayout屬性已經被廢棄。上文中的InternetExplorer都是指IE七、IE6及如下版本。