低版本IE中CSS的bug之源「haslayout」

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及如下版本。

相關文章
相關標籤/搜索