HTML 5標(biāo)準(zhǔn)學(xué)習(xí)入門之DOCTYPE
上一篇文章主要講述了HTML文檔的構(gòu)成,同時(shí)膚淺地接觸了“標(biāo)簽省略”這一概念,本文會(huì)從概念上介紹HTML文檔中第一個(gè)出現(xiàn)的重要元素 - DOCTYPE。
51CTO推薦專題:HTML 5 下一代Web開發(fā)標(biāo)準(zhǔn)詳解
所謂DOCTYPE,最初是XML的概念,即通過(guò)一種特定的語(yǔ)法,作為一種元數(shù)據(jù),來(lái)描述XML文檔中允許出現(xiàn)的元素,以及各元素的組成、嵌套規(guī)則等。具體的概念可以在WIKI中中得到一個(gè)更詳細(xì)的結(jié)果。
但是在HTML中,DOCTYPE又有著一些不同的效果,其中之一就是著名的觸發(fā)瀏覽器標(biāo)準(zhǔn)模式的功能。即如果沒有DOCTYPE,瀏覽器會(huì)進(jìn)入一種被稱為Quirks模式的怪異狀態(tài),在該模式下,瀏覽器的盒模型、樣式解析、布局等都與標(biāo)準(zhǔn)規(guī)定的存在差異。
需要注意的是,所謂的HTML標(biāo)準(zhǔn)、DOM標(biāo)準(zhǔn)等,只規(guī)定了在標(biāo)準(zhǔn)模式下的概念和行為,正如文檔構(gòu)成中提到的,DOCTYPE是一個(gè)HTML文檔絕對(duì)不可以省略的部分,因此就根本不存在“Quirks模式”這樣的概念。也正是因?yàn)闃?biāo)準(zhǔn)中沒有對(duì)Quirks模式做出任何的規(guī)定,因此不同瀏覽器在Quirks模式下的處理也是不同的,應(yīng)用Quirks模式可謂難上加難。
HTML4的DOCTYPE
在HTML4的標(biāo)準(zhǔn)中,DOCTYPE被歸屬于“HTML版本信息”一章中。在該章節(jié)中,標(biāo)準(zhǔn)指定了3種DOCTYPE:
•嚴(yán)格模式:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">。
•過(guò)渡模式:<!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的標(biāo)準(zhǔn)中,每一個(gè)DOCTYPE對(duì)應(yīng)的dtd文件都是有合法的URL指定的,可以通過(guò)互聯(lián)網(wǎng)進(jìn)行下載。瀏覽器可以根據(jù)URL獲得到dtd的具體內(nèi)容,并根據(jù)內(nèi)容的規(guī)定來(lái)解析文檔。
現(xiàn)實(shí)是不同的
HTML4如同XML一樣,是一個(gè)相當(dāng)理想化的標(biāo)準(zhǔn)。但是,現(xiàn)實(shí)往往并沒有這么理想,試想下面的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>
這個(gè)文檔采用了一個(gè)框架模式的DOCTYPE,但其正文確沒有使用任何<frame>元素,相對(duì)應(yīng)地使用了應(yīng)該由嚴(yán)格模式或者過(guò)渡模式指定的,標(biāo)準(zhǔn)的HTML結(jié)構(gòu)。那么在這種情況下,瀏覽器能做什么呢?
拒絕渲染該頁(yè)面?不,瀏覽器不敢這么做,在激烈的市場(chǎng)競(jìng)爭(zhēng)之中,如果因此而導(dǎo)致部分頁(yè)面無(wú)法渲染的話,就只能眼睜睜看著市場(chǎng)份額注入別家田了。所以瀏覽器頂多弱弱地報(bào)一個(gè)警告以示抗議,卻依舊得乖乖地解析出這個(gè)文檔并正確渲染。
這就是所謂的瀏覽器的“容錯(cuò)性”,事實(shí)上無(wú)論你的DOCTYPE是什么,瀏覽器都會(huì)以最大的兼容能力去解析一個(gè)文檔,并以最大的努力讓這個(gè)文檔顯示得符合開發(fā)者的預(yù)期。而瀏覽器的這一特性,也逐漸讓標(biāo)準(zhǔn)制定者開始意識(shí)到,DOCTYPE似乎真的不怎么重要。因此,在HTML5中,DOCTYPE發(fā)生了一次重大的變化……
HTML 5的DOCTYPE
到了HTML 5了,這一變化相信多數(shù)人已經(jīng)知道,就是HTML 5將DOCTYPE的聲明簡(jiǎn)化了,只需要<!DOCTYPE html>即可。
正好前文所述,在HTML 4時(shí)代,標(biāo)準(zhǔn)制定者已經(jīng)認(rèn)識(shí)到,DOCTYPE對(duì)瀏覽器的渲染并沒有太大的幫助,除了給無(wú)聊的w3c驗(yàn)證器看以外,DOCTYPE似乎只有觸發(fā)瀏覽器兼容模式的作用。于是標(biāo)準(zhǔn)工作組采取了非常實(shí)際的態(tài)度,測(cè)試了所有課程順觸發(fā)標(biāo)準(zhǔn)模式的最簡(jiǎn)DOCTYPE,最終得出了這一結(jié)論。
但是故事不會(huì)這么簡(jiǎn)單,標(biāo)準(zhǔn)工作組也不是完成這么簡(jiǎn)單的動(dòng)作就撒手不管的無(wú)賴分子,事實(shí)上他們還是很盡責(zé)任地考慮到了向后兼容性、可擴(kuò)展性等一系列的事情,最后將DOCTYPE一章用了大量文字來(lái)進(jìn)行描述,得到一個(gè)非常詳實(shí)的結(jié)果。
HTML 5的參考手冊(cè)相關(guān)章節(jié)中,將DOCTYPE分為3類:
普通DOCTYPE - normal doctype
普通DOCTYPE就是我們所見的最簡(jiǎn)形式,即<!DOCTYPE html>,他的真正組成是這樣的:
•一段文本,即<!DOCTYPE,大小寫不敏感。
•1個(gè)或多個(gè)空格,關(guān)于空格的定義請(qǐng)參照簡(jiǎn)介中的解釋。
•字符HTML,同樣大小寫不敏感。
•1個(gè)或多個(gè)空格。
•結(jié)束標(biāo)記,即>。
不再推薦的DOCTYPE - deprecated doctype
即所謂HTML 4時(shí)代的幾個(gè)DOCTYPE,其組成如下:
•一段文本,即<!DOCTYPE,大小寫不敏感。
•1個(gè)或多個(gè)空格。
•字符HTML,同樣大小寫不敏感。
•1個(gè)或多個(gè)空格。
•字符PUBLIC,大小寫不敏感。
•繼續(xù)1個(gè)或多個(gè)空格。
•一對(duì)引號(hào)或單引號(hào)(必須前后匹配),引號(hào)中放一個(gè)Public ID。
•可選內(nèi)容:
•1個(gè)或多個(gè)空格。
•一對(duì)引號(hào)或單引號(hào)(必須前后匹配),引號(hào)中放一個(gè)與前面的Public ID對(duì)應(yīng)的System ID。
•1個(gè)或多個(gè)空格。
•結(jié)束標(biāo)記,即>。
在標(biāo)準(zhǔn)中,Public ID和System ID是有嚴(yán)格的對(duì)應(yīng)關(guān)系的,如果規(guī)定的System ID不能有Public ID,則上面的第8項(xiàng)可選內(nèi)容也就不能存在。HTML5徹底放棄了HTML4中的過(guò)渡型和框架型的DOCTYPE,同時(shí)整合了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
顧名思義,完全是為了兼容久遠(yuǎn)時(shí)代的歷史遺產(chǎn)而準(zhǔn)備的DOCTYPE,甚至都已經(jīng)沒辦法考證什么樣的“工具”會(huì)搞出這種DOCTYPE來(lái)……遺留工具型的DOCTYPE的組成如下:
•一段文本,即<!DOCTYPE,大小寫不敏感。
•1個(gè)或多個(gè)空格。
•字符HTML,同樣大小寫不敏感。
•1個(gè)或多個(gè)空格。
•字符SYSTEM,大小寫不敏感。
•繼續(xù)1個(gè)或多個(gè)空格。
•一對(duì)引號(hào)或單引號(hào)(必須前后匹配),引號(hào)中放一段文本about:legacy-compat,注意這段文本是大小寫敏感的。
•1個(gè)或多個(gè)空格。
•結(jié)束標(biāo)記,即>。
比如這樣的DOCTYPE就屬于此類:<!doctype HTML system "about:legacy-compat">,基本上除了大小寫,沒有什么值得改變的。
現(xiàn)實(shí)的細(xì)節(jié)
對(duì)于DOCTYPE的作用,在真正的瀏覽中,僅僅起到觸發(fā)瀏覽器的標(biāo)準(zhǔn)模式的作用。雖然根據(jù)標(biāo)準(zhǔn),一個(gè)HTML文檔中,DOCTYPE前可以有其他的元素,如一個(gè)U+FFEF的BOM,幾個(gè)注釋,一點(diǎn)空格,但是在當(dāng)前的狀態(tài)下,并沒有這么理想:
•對(duì)于IE6-9,如果DOCTYPE前存在注釋,會(huì)進(jìn)入Quirks模式。
•對(duì)于IE6,如果DOCTYPE前存在一個(gè)XML聲明,會(huì)進(jìn)入Quirks模式。
寫完才發(fā)現(xiàn),問(wèn)題又全出在IE下……關(guān)于DOCTYPE的問(wèn)題糾結(jié)至此。
原文鏈接:http://www.cnblogs.com/GrayZhang/archive/2011/03/31/learning-html5-doctype.html
【編輯推薦】