HTML5標準學習 – DOCTYPE

來源:互聯網
上載者:User
文章目錄
  • HTML4的DOCTYPE
  • 現實是不同的
  • HTML5的DOCTYPE
  • 現實的細節

上一篇文章主要講述了HTML文檔的構成,同時膚淺地接觸了“標籤省略”這一概念,本文會從概念上介紹HTML文檔中第一個出現的重要元素 - DOCTYPE。

所謂DOCTYPE,最初是XML的概念,即通過一種特定的文法,作為一種中繼資料,來描述XML文檔中允許出現的元素,以及各元素的組成、嵌套規則等。具體的概念可以在WIKI中中得到一個更詳細的結果。

但是在HTML中,DOCTYPE又有著一些不同的效果,其中之一就是著名的觸發瀏覽器標準模式的功能。即如果沒有DOCTYPE,瀏覽器會進入一種被稱為Quirks模式的怪異狀態,在該模式下,瀏覽器的盒模型、樣式解析、布局等都與標準規定的存在差異。

需要注意的是,所謂的HTML標準、DOM標準等,只規定了在標準模式下的概念和行為,正如文檔構成中提到的,DOCTYPE是一個HTML文檔絕對不可以省略的部分,因此就根本不存在“Quirks模式”這樣的概念。也正是因為標準中沒有對Quirks模式做出任何的規定,因此不同瀏覽器在Quirks模式下的處理也是不同的,應用Quirks模式可謂難上加難。

HTML4的DOCTYPE

在HTML4的標準中,DOCTYPE被歸屬於“HTML版本資訊”一章中。在該章節中,標準指定了3種DOCTYPE:

  • strict 模式:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  • 過渡模式:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  • 架構模式:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">

在HTML4的標準中,每一個DOCTYPE對應的dtd檔案都是有合法的URL指定的,可以通過互連網進行下載。瀏覽器可以根據URL獲得到dtd的具體內容,並根據內容的規定來解析文檔。

現實是不同的

HTML4如同XML一樣,是一個相當理想化的標準。但是,現實往往並沒有這麼理想,試想下面的HTML文檔:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"                       "http://www.w3.org/TR/html4/frameset.dtd"><html>    <head>        <title>I'm not a frameset</title>    </head>    <body>        <p>So what?</p>    </body></html>

這個文檔採用了一個架構模式的DOCTYPE,但其本文確沒有使用任何<frame>元素,相對應地使用了應該由strict 模式或者過渡模式指定的,標準的HTML結構。那麼在這種情況下,瀏覽器能做什麼呢?

拒絕渲染該頁面?不,瀏覽器不敢這麼做,在激烈的市場競爭之中,如果因此而導致部分頁面無法渲染的話,就只能眼睜睜看著市場份額注入別家田了。所以瀏覽器頂多弱弱地報一個警告以示抗議,卻依舊得乖乖地解析出這個文檔並正確渲染。

這就是所謂的瀏覽器的“容錯性”,事實上無論你的DOCTYPE是什麼,瀏覽器都會以最大的相容能力去解析一個文檔,並以最大的努力讓這個文檔顯示得符合開發人員的預期。而瀏覽器的這一特性,也逐漸讓標準制定者開始意識到,DOCTYPE似乎真的不怎麼重要。因此,在HTML5中,DOCTYPE發生了一次重大的變化……

HTML5的DOCTYPE

到了HTML5了,這一變化相信多數人已經知道,就是HTML5將DOCTYPE的聲明簡化了,只需要<!DOCTYPE html>即可。

正好前文所述,在HTML4時代,標準制定者已經認識到,DOCTYPE對瀏覽器的渲染並沒有太大的協助,除了給無聊的w3c驗證器看以外,DOCTYPE似乎只有觸發瀏覽器安全色模式的作用。於是標準工作群組採取了非常實際的態度,測試了所有課程順觸發標準模式的最簡DOCTYPE,最終得出了這一結論。

但是故事不會這麼簡單,標準工作群組也不是完成這麼簡單的動作就撒手不管的無賴分子,事實上他們還是很盡責任地考慮到了向後相容性、可擴充性等一系列的事情,最後將DOCTYPE一章用了大量文字來進行描述,得到一個非常詳實的結果。

HTML5的參考手冊相關章節中,將DOCTYPE分為3類:

普通DOCTYPE - normal doctype

普通DOCTYPE就是我們所見的最簡形式,即<!DOCTYPE html>,他的真正組成是這樣的:

  1. 一段文本,即<!DOCTYPE,大小寫不敏感。
  2. 1個或多個空格,關於空格的定義請參照簡介中的解釋。
  3. 字元HTML,同樣大小寫不敏感。
  4. 1個或多個空格。
  5. 結束標記,即>
不再推薦的DOCTYPE - deprecated doctype

即所謂HTML4時代的幾個DOCTYPE,其組成如下:

  1. 一段文本,即<!DOCTYPE,大小寫不敏感。
  2. 1個或多個空格。
  3. 字元HTML,同樣大小寫不敏感。
  4. 1個或多個空格。
  5. 字元PUBLIC,大小寫不敏感。
  6. 繼續1個或多個空格。
  7. 一對引號或單引號(必須前後匹配),引號中放一個Public ID。
  8. 可選內容:
    1. 1個或多個空格。
    2. 一對引號或單引號(必須前後匹配),引號中放一個與前面的Public ID對應的System ID。
  9. 1個或多個空格。
  10. 結束標記,即>

在標準中,Public ID和System ID是有嚴格的對應關係的,如果規定的System ID不能有Public ID,則上面的第8項可選內容也就不能存在。HTML5徹底放棄了HTML4中的過渡型和架構型的DOCTYPE,同時整合了XHTML的DOCTYPE聲明,得出以下6種組合方式:

  • <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN">
  • <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
  • <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
  • <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
遺留工具DOCTYPE - leagacy tool compatible doctype

顧名思義,完全是為了相容久遠時代的曆史遺產而準備的DOCTYPE,甚至都已經沒辦法考證什麼樣的“工具”會搞出這種DOCTYPE來……遺留工具型的DOCTYPE的組成如下:

  1. 一段文本,即<!DOCTYPE,大小寫不敏感。
  2. 1個或多個空格。
  3. 字元HTML,同樣大小寫不敏感。
  4. 1個或多個空格。
  5. 字元SYSTEM,大小寫不敏感。
  6. 繼續1個或多個空格。
  7. 一對引號或單引號(必須前後匹配),引號中放一段文本about:legacy-compat,注意這段文本是大小寫敏感的。
  8. 1個或多個空格。
  9. 結束標記,即>

比如這樣的DOCTYPE就屬於此類:<!doctype HTML system "about:legacy-compat">,基本上除了大小寫,沒有什麼值得改變的。

現實的細節

對於DOCTYPE的作用,在真正的瀏覽中,僅僅起到觸發瀏覽器的標準模式的作用。雖然根據標準,一個HTML文檔中,DOCTYPE前可以有其他的元素,如一個U+FFEF的BOM,幾個注釋,一點空格,但是在當前的狀態下,並沒有這麼理想:

  • 對於IE6-9,如果DOCTYPE前存在注釋,會進入Quirks模式。
  • 對於IE6,如果DOCTYPE前存在一個XML聲明,會進入Quirks模式。

寫完才發現,問題又全出在IE下……關於DOCTYPE的問題糾結至此,下一章主要講述編碼聲明的問題。

本文永久地址:http://www.otakustay.com/learning-html5-doctype/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.