HTML5 Note #5: DOCTYPE And Browser Mode

Why DOCTYPE?

主要是今天看到一句:HTML5 的 DOCTYPE 声明不需要 DTD 文件的 URL,然后就想到 HTML5 的 DOCTYPE 声明较之前的版本确实显得尤其简单。之前从来没有深入了解过这个现象的原因,于是就用今天这篇 note 弄清楚个中缘由。


HTML5 之前

HTML 是一种基于 SGML (Standard Generalized Markup Language) 语言的应用,而 SGML 又是一种相当严谨和复杂的超文本格式语言的规则 / 标准。虽然 HTML 并未完全符合 SGML,但是在 HTML5 之前的版本都至少是基于 SGML 的,因此都需要在第一行写上完整的 DOCTYPE 申明,特别是 HTML4 还是相当遵守 SGML 的,其 DOCTYPE 声明显得尤其繁复

  • [Strict DTD]:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    
  • [Transitional DTD]:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    
  • [Frameset DTD]:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
    

到了 HTML5 标准制定时,DOCTYPE 声明的推荐写法是

<!DOCTYPE html>

那么,

为什么 HTML5 的 DOCTYPE 声明如此简单?

最主要的原因就是

HTML5 is not based on SGML (Standard Generalized Markup Language)

更确切的说就是

HTML5 abandons any attempt to define HTML as an SGML application, explicitly defining its own parsing rules which more closely match existing implementations and documents.

因此,也就没有必要加上 DTD URL(顺便回答了我最初的疑问)。

那么,既然 HTML5 已经更加独立于 SGML,为什么还需要 DOCTYPE 声明呢

从上述角度来看,DOCTYPE 确实看起来是一个比较无用的标签,但它确是必需的。我的理解是其意义在于向后兼容,用以触发浏览器用 standards mode 或者说是 no-quirks mode 渲染页面,DOCTYPE 之于浏览器的意义也就在此,貌似也没有什么其他用途了。

参考文章:

http://dev.w3.org/html5/html-author/#doctype-declaration http://en.wikipedia.org/wiki/Document_type_declaration#HTML5_DTD-less_DOCTYPE


补充:

Standards Mode & Quirk Mode

  • Quirk mode: 一些网页浏览器为了维持对较旧的网页设计的向后兼容性,而使用的一种技术
  • Standards mode: 严格遵循万维网联盟(W3C)与互联网工程任务组(IETF)标准

为什么会出现这几种渲染模式

归根究底就是标准化与具体实践间总是存在差距。多数旧的网页浏览器没有完全实施标准或者在这些标准完成之前就已被开发。结果是,很多更早的网页依赖于早期浏览器不完全或不正确的解析而构造,并且只有在被这样的浏览器处理时才会如设想之中那样渲染,也就是说许多页面为了迁就这些浏览器错误也用了较标准错误的写法。

而后来的浏览器即便已经较好的支持标准定义,但是为了兼容旧的页面,新的浏览器出现了 quirk mode 用以模拟旧浏览器的渲染。

参考文章:

向后(向下)兼容与向前(向上)兼容

  • 向后:在计算机中指在一个程序和/或库更新到较新版本后,用旧版本程序创建的文档或系统仍能被正常操作或使用(包括写入)。e.g. Microsoft Office 2013 可以继续使用旧的 .doc、.xls 和 .ppt 二进制格式

  • 向前:应用程序的早期版本能够打开较新版本中的文件并忽略早期版本中未实现的功能。e.g. Microsoft Office 2003 打开使用新的 .docx、.xlsx 和 .pptx 二进制格式。