CSS教程:認真學習haslayout

2021-01-10 站長之家

要想更好的理解 css, 尤其是 IE 下對 css 的渲染,haslayout 是一個非常有必要徹底弄清除的概念。大多IE下的顯示錯誤,就是源於 haslayout。

什麼是 haslayout ?

haslayout 是Windows Internet Explorer渲染引擎的一個內部組成部分。在Internet Explorer中,一個元素要麼自己對自身的內容進行計算大小和組織,要麼依賴於父元素來計算尺寸和組織內容。為了調節這兩個不同的概念,渲染引擎採用 了 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」。

負責組織自身內容的元素將默認有一個布局,主要包括以下元素(不完全列表):

* body and html

* table, tr, th, td

* img

* hr

* input, button, file, select, textarea, fieldset

* marquee

* 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。

zoom 總是可以觸發 hasLayout,但是在 IE5.0 中不支持。

具有「layout」 的元素如果同時 display: inline ,那麼它的行為就和標準中所說的 inline-block 很類似了:在段落中和普通文字一樣在水平方向和連續排列,受 vertical-align 影響,並且大小可以根據內容自適應調整。這也可以解釋為什麼單單在 IE/Win 中內聯元素可以包含塊級元素而少出問題,因為在別的瀏覽器中 display: inline 就是內聯,不像 IE/Win 一旦內聯元素擁有 layout 還會變成 inline-block。

haslayout 問題的調試與解決

當網頁在 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;)。

haslayout 問題引起的常見 bug

IE6 及更低版本的雙空白邊浮動 bug

bug 修復: display:inline;

IE5-6/win 的 3 像素偏移 bug

bug 修復: _height:1%;

E6 的躲躲貓(peek-a-boo) bug

bug 修復: _height:1%;

相關焦點

  • CSS Grid Layout一些有趣的事情(1)
    可能grid-row-end和grid-column-end會使用小於-1的負值在許多代碼示例和教程中,您可能看到過可以使用grid-column-start:1;和grid-column-end:-1;(或者簡寫grid-column: 1 / -1;),從第一列網格線到第二列網格線創建一個網格標籤(創建一個跨列網格)。
  • 這些資源讓你成為CSS專家 (二)​
    qq群(群號:574388536)文件裡,裡面有很多同行朋友分享的學習資料,我們也會定期整理,如果你願意分享,願意跟大家一起學習進步,也歡迎你的加入。http://www.subcide.com/tutorials/csslayout/59、CSS 教程 — 來自 W3Schools 的完整教程。http://www.w3schools.com/css/60、樣式表 — 另一個非常全的CSS教程。
  • 【教程】html+css零基礎入門教程之CSS邊框
    border-width: 20px;border-color: #000;B、border-style: none; border-width: 20px;C、border-style: none; border-color: #000;D、border-style: solid;border-color: #000;相關文章【教程
  • 【教程】html+css零基礎入門教程(九)
    在前面我們一起將HTML的基礎知識學習完了,我想你應該知道怎麼寫基礎的HTMl代碼了
  • DIV+CSS教程_DIV+CSS布局_DIV+CSS實例教程手冊
    第1天:XHTML CSS基礎知識文件類型2.語言編碼3. html標籤4. css風格5. css優先權6.派生選擇器4,css選擇器的分組5,垂直二級清單6,相對定位和絕對定位第5天:Hyperlink偽類
  • 【教程】html+css零基礎入門教程(十)
    ()A、white-space:preB、white-space:nowrap相關文章【教程】html+css零基礎入門教程(一)【教程】html+css零基礎入門教程(二)【教程】html+css零基礎入門教程(三)【教程】html+css零基礎入門教程(四)
  • 網頁設計基礎:Div+CSS布局入門教程
    首頁 > 教程 > 關鍵詞 > 最新資訊 > 正文 網頁設計基礎:Div+CSS布局入門教程
  • CSS中內聯元素與塊級元素
    首頁 > 教程 > 關鍵詞 > CSS最新資訊 > 正文 CSS中內聯元素與塊級元素
  • 提高CSS文件可維護性的五種方法
    首頁 > 教程 > 關鍵詞 > CSS最新資訊 > 正文 提高CSS文件可維護性的五種方法
  • CSS margin屬性與用法教程
    margin 屬性是css用於在一個聲明中設置所有 margin 屬性的簡寫屬性,margin是css控制塊級元素之間的距離
  • 資源放送:6個值得收藏CSS學習資源網站
    下面是6個非常有用的 CSS 資源網站,包括 CSS 學習技巧、CSS 文章、CSS 高級文檔等。  A List Apart https://www.alistapart.com/topics/code/css/  A List Apart 是一個非常有用的 CSS 資源文章,發布了來自很多優秀設計師的 CSS 文章、 CSS 教程、技巧等內容
  • 網頁設計:關於CSS框架網頁的設計!
    b) 布局 layout.css   定義頁面是二欄還是三欄,是全屏還是1024×768……   一個網站的設計可能有很多種布局,但是大多數都是由幾個具有復用性的布局組成,選擇性的引入所需要的布局,可以很快地應用所期望的頁面布局。
  • 前端開發必備的CSS命名規範與常用CSS代碼集合
    但如果是自己在個人學習的時候,又特別不了解應該怎麼對CSS命名的話,我今天把自己之前學習的一些資料重新整理了一份CSS命名規範,方便自己與大家學習查閱使用。雖然說,命名沒有什麼特別要求,但是為了體現一個人技術素養,我建議大家還是按照以下常規規範來。
  • div+css對SEO的影響-專業SEO技術教程(35)
    div+css對SEO的影響-專業SEO技術教程(35)首先,使用div+css設計的網站有助於提升搜尋引擎spider提升爬行效率。div+css的代碼精簡是table無法比擬的,即使div+css的HTML加上對應css文件一般都小於table的HTML文件。div+css實現了樣式和布局完全分離,前臺垃圾代碼大量減少,內容更加突出,讓蜘蛛在你的網站上快速爬行,短時間內爬完你的網站。
  • 「教程篇」Hexo+ NexT 博客美化配置教程|第七篇
    嗨,大家好,今天還是繼續next主題的美化教程。加油。教程:1.修改主題頁面布局為圓角修改主題頁面為圓角,有兩種方法:第一種:打開文件,路徑:/themes/next/source/css/_variables/custom.styl複製粘貼以下代碼:
  • 104道 CSS 面試題,助你查漏補缺(上)
    詳細資料可以參考:《Flex 布局教程:語法篇》[63]《Flex 布局教程:實例篇》[64]14.用純 CSS 創建一個三角形的原理是什麼?採用的是相鄰邊框連接處的均分原理。清除浮動,觸發hasLayout;zoom屬性是IE瀏覽器的專有屬性,它可以設置或檢索對象的縮放比例。解決ie下比較奇葩的bug。譬如外邊距(margin)的重疊,浮動清除,觸發ie的haslayout屬性等。
  • CSS入門
    -- <link rel="stylesheet" href="style.css"> 導入css文件--> <link rel="stylesheet" href="style.css"></head><body><h1>hello world!
  • div+css布局時比較好的命名
    download   投票:vote   合作夥伴:partner   友情連結:link   版權:copyright   (四)class的命名:   (1)標題欄樣式,使用"類別+功能"的方式命名,如   .barNews { }   .barProduct { }   (2)模塊結構css
  • Div+css教程之製作html的工具
    此文章主要為大家介紹了Div+css教程之製作html的工具,具有一定的參考價值,學習覺得挺不錯的,分享給大家。創業項目優選 好項目來A5招商 ,點擊入駐!>在和有的朋友交流時,有的居然不知道有個叫firebug的東東,這也太無語,網頁調試工具當然選擇ff(火狐瀏覽器)的插件firebug,沒有此插件的可以在ff-菜單欄-工具-附加組件-搜索firebug,然後添加到firefox重啟ff就可以用了,按F12可以調出firebug界面,用時可以按快捷鍵ctrl+shift+c滑鼠左鍵點要查看代碼的位置,firebug面板裡就會出現html代碼及對應的css
  • CSS工程化
    css文件細分問題在大型項目中,css也需要更細的拆分,這樣有利於css代碼的維護。Modifier一個完整的BEM類名:block__element_modifier,例如:banner__dot_selected,可以表示:輪播圖中,處於選中狀態的小圓點三個部分的具體含義為:Block :頁面中的大區域,表示最頂級的劃分,例如:輪播圖(banner)、布局(layout