为何html5的头部申明如此不同?

转载 (原文地址) whjzz0012 随笔 asd 170阅读 2018-01-18 16:56:29 举报

大家好,我是IT修真院武汉分院第10期学员,一枚正直善良的web程序员。

今天给大家分享一下,修真院官网css任务01中,深度思考部分的知识点——HTML文件里开头的DOCTYPE有什么作用

一、背景介绍

DOCTYPE是document type(文档类型)的简写,在web设计中用来声明文档类型。

在所有 HTML 文档中规定 DOCTYPE 是非常重要的,这样浏览器就能了解预期的文档类型, 告诉浏览器要通过哪一种规范(DTD)解析文档(比如HTML或XHTML规范)。

DOCTYPE声明必须在 HTML 文档的第一行,它不属于 HTML 标签; 它是一条指令,告诉浏览器编写页面所用的标记的版本。

doctype会影响代码验证,并决定了浏览器最终如何显示你的Web文档。

二、知识剖析

DOCTYP与DTD与SGML

HTML 4.01 中的 doctype 需要对 DTD 进行引用,因为 HTML 4.01 基于 SGML。

DTD:(Document Type Definition)文档类型定义是一种特殊文档,它规定、约束符合标准通用标示语言(SGML)或SGML子集可扩展标示语言(XML)规则的定义和陈述。

SGML:标准通用标记语言,是一种定义电子文档结构和描述其内容的国际标准语言; 通用标言为语法置标提供了异常强大的工具,同时具有极好的扩展性,因此在数据分类和索引中非常有用; 是所有电子文档标记语言的起源,早在万维网发明之前“通用标言”就已存在。

Doctype可声明三种DTD类型,分别表示严格版本、过渡版本以及基于框架的 HTML 文档。

以HTML4.01为例

超文本严格文档类型定义HTML Strict DTD ,不允许使用表现性、废弃元素(如font)以及frameset。声明:

< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"

    "http://www.w3.org/TR/html4/strict.dtd">;

超文本过渡文档类型定义HTML Transitional DTD 允许使用表现性、废弃元素(如font),不允许使用frameset。声明:

< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

    "http://www.w3.org/TR/html4/loose.dtd">;

超文本框架集文档类型定义HTML Strict DTD 允许表现性元素,废弃元素以及frameset。声明:

< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"

    "http://www.w3.org/TR/html4/frameset.dtd">;

浏览器的呈现模式

现代的浏览器需要不同模式, 既要呈现久远的HTML界面, 不至于界面结构混乱不堪,也需要呈现W3C标准的界面:

标准模式(strict)---是指浏览器按照 W3C 标准解析代码,呈现页面

怪异模式---是指浏览器用自己的方式解析代码,即使用一种比较宽松的向后兼容的方式来显示页面

DOCTYPE切换

浏览器根据不同的DOCTYPE选择不同的渲染方法就叫做DOCTYPE切换。 其实DOCTYPE切换就是用来识别和兼容旧网页的。

以下情况浏览器会采用标准模式渲染:

给出了完整的DOCTYPE声明

DOCTYPE声明了Strict DTD

DOCTYPE声明了Transitional DTD和URI

以下情况浏览器会采用怪异模式渲染:

DOCTYPE声明了Transitional DTD但未给出URI

DOCTYPE声明不合法

未给出DOCTYPE声明

现今情况

HTML5协议下 统一写 < !DOCTYPE html>。

HTML 5 不基于 SGML,因此不需要对 DTD 进行引用,也就没有严格模式与怪异模式的区别,但是需要 doctype 来规范浏览器的行为(html 5简化了这种声明,意在告诉浏览器使用统一的标准即可);HTML5 有相对宽松的语法,实现时,已经尽可能大的实现了向后兼容。( HTML5 没有严格和混杂之分)

三、常见问题

如果不声明DOCTYPE会发生什么?

四、解决方案

如果你是使用最新标准编写的页面但未给出DOCTYPE声明,浏览器会采用怪异模式渲染,这时就可能会出现一些怪异的行为。 例如盒模型不正确、窗口的size不正确等问题。所以,尽量为你网站的所有页面都给出合法的DOCTYPE声明。

五、编码实战

六、拓展思考

有没有其他进入怪异模式的方法?

除了不写DOCTYPE声明外,最常见的就是在DOCTYPE声明前面出现了这些内容:普通文本、HTML 标签、HTML 注释、XML 声明、IE条件注释。

七、参考文献

参考一: 为何说 HTML5「no longer based on SGML」?

参考二: HTML_严格模式与混杂模式

参考三: 你知道什么是doctype,什么是文档模式吗

参考四: 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义

八、更多讨论

什么是 XHTML与XML有什么关系?

W3C 下与网页(超文本)相关的标准有两个系列:HTML 系列和 XHTML 系列。

HTML 系列从 HTML 第一版一直发展到 HTML 4.x、HTML5,HTML 系列的工作重点在于丰富与超文本相关的功能、标记,提供较好的兼容性,更加面向“人”;

 XHTML 系列从 XHTML 1.0、1.1、2.0 跳跃到 HTML5 的一部分:所谓的“XHTML5”。而 XHTML 系列的工作重点在于将 HTML 改为更加符合 XML 严格规范的格式,更加面向“机器”。

XML 的语法很严格,是 W3C 的宝贝,所以 W3C 试图把各种东西都变成 XML 的子集或应用,比如 MathML,SVG 等。可是其地位逐渐受到其他一些轻量标记语言的威胁。

为何html5的头部申明如此不同?

html5的头声明,其实是一种回归,回归简单声明方式

HTML5 不再是基于 SGML 的语言,而 doctype 只是用来激活模式的。

HTML5 之前,HTML 都是用 SGML 来书写的,DOCTYPE 则用来声明文档类型,它可以告诉 SGML parser 使用什么 DTD 来解析文档。所以到了 HTML5,根本就没有对应的 DTD,也就没有后面一串异常复杂的表述了。

为什么 HTML5 不再是 SGML 了呢?

SGML 需要在 DTD 中定义好标签和属性,但是 HTML5 中要允许自定的标签和属性的,原来的框架太过束缚,它需要更加广大的范围来放飞自己。

作者:自娱自楽
链接:https://www.jianshu.com/p/ce19d454451b
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复