IE盒模型缺陷

IE盒模型缺陷

IE盒模型缺陷(Internet Explorer box model bug)是指早期版本的Internet Explorer調整網頁元素大小的方法,和W3C為層疊樣式表(CSS)語言推薦的標準方式不同。在Internet Explorer 6中,瀏覽器支持一種解決了這種差異的可選的渲染模式(叫做遵從標準模式)。然而,出於向後兼容的原因,所有版本的IE(截至IE 9及IE 10 Developer Preview)仍然默認表現為通常的,非標準的模式。Internet Explorer for Mac不受這種非標準行為影響。此外,Internet Explorer 10於其Consumer Preview之中也改變其默認怪異模式為一種更加符合規範的類似於非IE瀏覽器的怪異模式。

背景

層疊樣式表是一種為全球資訊網文檔添加樣式(如字型、顏色、空 間)的簡單機制 。CSS的規範描述了網頁的元素如何被圖形瀏覽器展現。CSS1的規範第四節定義了一個給塊級元素 - 比如說p和blockquote - 一個寬度和高度,和3個級別的環繞它的框 - padding, border,和margin - 的“格式化模型”。儘管該規範從來沒有明確使用過“盒模型”一詞,這個詞已經被網頁開發人員和網頁瀏覽器供應商廣泛使用。在HTML 4和CSS之前,很少HTML元素既支持border也支持padding,所以對一個元素的寬度和高度的定義並不是很有爭議。然而,它取決於元素的不同而變化。在HTML,table的width屬性定義了一個表格 - 包括其框線 - 的寬度。另一方面,圖像(img)的width屬性定義的則是這個圖像本身(在任何框線之內)的寬度。在早期的那些日子,支持padding屬性的元素就是表單元格。表單元格的寬度被定義為“以像素為單位的單元格內容的建議寬度,不包括填充”。在1996年,CSS[為多得多的元素引入了margin, border和padding屬性。它通過了一個對margin, border和padding的處理類似於表單元格的,相對於內容的寬度定義。從此這已成為著名的W3C盒模型。在那時,非常少瀏覽器供應商嚴格地實施了W3C盒模型。當時的兩種主要瀏覽器,Netscape 4.0和Internet Explorer 4.0均定義寬度和高度為框線到框線的距離。這已被稱為傳統或者Internet Explorer盒模型。

缺陷

根據由全球資訊網聯盟(W3C)於1996年發行並於1999年修訂的CSS1所指定的,當任意一個塊級元素的寬度或高度被顯式指定,它應當只確定這個可見元素自身的寬度或高度,而padding, border和margin隨後被套用。Internet Explorer在“怪異模式”(怪異模式)則把內容,內邊距(padding)和框線(border)全部包括在一個指定的寬度或高度之內;這導致它呈現出一個比遵從標準行為的結果更窄或者更短的盒子。

解決方法

如果頁面包含某些HTML檔案類型描述,則Internet Explorer 6及以上版本不受該缺陷的影響。然而這些版本由於向後兼容的原因,在quirks模式下維持這種錯誤的行為。例如,如下會觸發quirks模式:

•檔案類型描述缺失或不完整時;

•遇到一個HTML 3或者更早的文檔時;

•使用HTML 4.0 Transitional或Frameset的檔案類型描述且系統標識符(URI)不存在時;

•在DOCTYPE聲明之前出現SGML注釋或者其它無法識別的內容時;

•文檔任何地方有錯誤時;

•注釋符相遇時出現末尾文字重複;

•Internet Explorer 6也會在DOCTYPE聲明之前出現XML聲明時使用quirks模式。

各種解決方法已被制定以迫使Internet Explorer 5以及更早版本使用W3C盒模型顯示網頁。這些解決方法一般是利用Internet Explorer的CSS選擇器作用的無關的缺陷以從瀏覽器中隱藏某些規則。這些解決方法中,最為熟知的是由Tantek Çelik,一個工作於IE for Mac時發現這個主意的前微軟員工,開發的“盒模型hack”。它涉及到為IE for Windows指定一個寬度聲明,隨後使用另一個為CSS-兼容的瀏覽器指定的寬度重寫它。第二條聲明通過利用IE for Windows解析CSS規則的其它缺陷而從該瀏覽器中隱藏。這些CSS“hacks”的實施直到Internet Explorer 7的公開發行為止都被進一步兼容。IE 7隻修復了一部分問題,而不是其它的,這導致使用這些hacks的頁面出現一些意想不到的問題盒模型hacks已證明是不可靠的,因為它們依賴於瀏覽器對CSS支持的缺陷,而這些缺陷可能會在以後的版本中被修復。由於這個原因,一些網頁開發者改以推薦避免對同一個元素既指定width也指定padding或者使用條件注釋以及/或CSS filters以解決在較舊版本Internet Explorer上的盒模型缺陷。

對Internet Explorer盒模型的支持

網頁設計者Doug Bowman說過起初的Internet Explorer盒模型代表了一個更好,更有邏輯性的方法。Peter-Paul Koch則給出了一個物理上盒子的例子,其尺寸總是指盒子自身的,包括可能的內邊距 - padding,但是從來不是它的內容。他說這種盒模型對圖形化設計者來說更有用,他們創造基於盒子的可見寬度而不是其內容的寬度的設計。(使用過 VS 窗體設計器或類似工具的開發者會很容易理解 IE 盒模型的用意所在。)Bernie Zimmermann說Internet Explorer盒模型更接近於HTML表格模型中單元格的尺寸和填充。

W3C已在CSS3內包括了一個box-sizing屬性。當為一個元素指定box-sizing: border-box;時,該元素的任意padding或border都在指定的width和height的內部,“就像通常舊版HTML用戶代理所實施的那樣”。Internet Explorer 8,WebKit瀏覽器如Safari 5.1+和Google Chrome,Opera 7.0和以後版本,和Konqueror 3.3.2和以後版本均支持CSS3的box-sizing屬性。基於Gecko的瀏覽器如Mozilla Firefox使用廠商指定的-moz-box-sizing屬性以支持相同功能。

相關詞條

熱門詞條

聯絡我們