从HTML 2.0到XHTML 2.0,XHTML 2.0由于语法解析过于严格,因此不太适合互联网开放、自由的精神。Jeremy Keith认为所有的项目都应该先有设计原则,HTML5也同样如此,W3C为此发布了HTML设计原则(http://www.w3.org/TR/html-design-principles/),强调了HTML5规范的兼容性、实用性和互操作性。简单说明如下:
避免不必要的复杂性
规范可以写得十分复杂,但浏览器的实现应该非常简单。把复杂的工作留给浏览器后台去处理,用户仅需要输入最简单的字符,甚至不需要输入,才是最佳文档规范。因此,HTML5首先采用化繁为简的思路进行设计。
【示例1】在HTML 4.01中定义文档类型的代码如下:
<!DOCTYPE html PUBLIC "-//W3C/DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
HTML 5简化如下:
<!DOCTYPE html>
HTML 4.01和XHTML中的DOCTYPE过于冗长,连自己都记不住这些内容,但在HTML5中只需要简单的<!DOCTYPE html>就可以了。DOCTYPE是给验证器用的,而非浏览器,浏览器只在做DOCTYPE切换时关注这个标签,因此并不需要写得太复杂。
【示例2】在HTML 4.01中定义字符编码的代码如下:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
在XHTML 1.0中还需要再声明XML标签,并在其中指定字符编码。
<?xml version="1.0" encoding="UTF-8" ?> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
HTML5简化如下:
<meta charset="utf-8">
关于省略不必要的复杂性,或者说避免不必要的复杂性的例子还有不少。但关键是既能避免不必要的复杂性,还不会妨碍在现有浏览器中使用。
在HTML5中,如果使用link元素链接到一个样式表,先定义rel="stylesheet",然后再定义type="text/css",这样就重复了。对浏览器而言,只要设置rel="stylesheet"就够了,因为它可以猜出要链接的是一个CSS样式表,不必要再指定type属性。
对Web开发而言,大家都使用JavaScript脚本语言,也是默认的通用语言,用户可以为script元素定义type="text/javascript"属性,也可以什么都不写,浏览器自然会假设在使用JavaScript。
支持已有内容
XHTML 2.0最大的问题就是不支持已经存在的内容,这违反了Postel法则(即对自己发送的东西要严格,对接收的东西则要宽容)。现实情况中,开发者可以写出各种风格的HTML,浏览器遇到这些代码时,在内部所构建出的结构应该是一样的,呈现的效果也应该是一样的。
【示例】下面示例展示了编写同样内容的四种不同写法,四种写法唯一的不同点就是语法。
<img src="foo" alt="bar" /> <p class="foo">Hello world</p> <img src="foo" alt="bar"> <p class="foo">Hello world <IMG SRC="foo" ALT="bar"> <P CLASS="foo">Hello world</P> <img src=foo alt=bar> <p class=foo>Hello world</p>
从浏览器解析的角度分析,这些写法实际上都是一样的。HTML5必须支持已经存在的约定,适应不同的用户习惯,而不是用户适应浏览器的严格解析标准。
解决实际问题
规范应该去解决现实中实际遇到的问题,而不该考虑那些复杂的理论问题。
【示例】既然有在<a>中嵌套多个段落标签的需要,那就让规范支持它。
这块内容包含一个标题,一个段落。按HTML 4规范,必须至少使用2个链接。
<h2><a href="#">标题文本</a></h2> <p><a href="#">段落文本</a></p>
在HTML5中,只需要把所有内容都包裹在一个链接中就行了。
<a href="#"> <h2>标题文本</h2> <p>段落文本</p> </a>
其实这种写法早已经存在,当然以前这样写是不合乎规范的。所以说,HTML5解决现实的问题,其本质还是纠正因循守旧的规范标准,现在把标准改了,允许用户这样写了。
用户怎么使用就怎么设计规范
当一个实践已经被广泛接受时,就应该考虑将它吸纳进来,而不是禁止它或搞一个新的实践出来。例如,HTML5新增了nav、section、article、aside等标签,它们引入了新的文档模型,即文档中的文档。在section中,还可以嵌套h1到h6的标签,这样就有了无限的标题层级,这也是很早之前Tim Berners Lee所设想的。
【示例】下面几行代码相信大家都不会陌生,这些都是频繁被使用过的ID名称。
<div id="header">...</div> <div id="navigation">...</div> <div id="main">...</div> <div id="aside">...</div> <div id="footer">...</div>
在HTML5中,可以用新的元素代替使用。
<header>...</header> <nav>...</nav> <div id="main">...</div> <aside>...</aside> <footer>...</footer>
实际上,这并不是HTML5工作组想出来的,也不是W3C提出来的,而是谷歌根据大数据分析用户习惯得出来的。
优雅地降级
渐进增强的另一面就是优雅地回退。最典型的例子就是使用type属性增强表单。
【示例1】下面代码列出了可以为type属性指定的新值,如number、search、range等。
<input type="number" /> <input type="search" /> <input type="range" /> <input type="email" /> <input type="date" /> <input type="url" />
最关键的问题在于:当浏览器看到这些新type值时会如何处理。老版本浏览器是无法理解这些新type值的。但是当它们看到自己不理解的type值时,会将type的值解释为text。
【示例2】对于新的video元素,它设计得很简单、实用。针对不支持video元素的浏览器可以这样写。
<video src="movie.mp4"> <!-- 回退内容 --> </video>
这样HTML5视频与Flash视频就可以协同起来,用户不用纠结如何选择。
<video src="movie.mp4"> <object data="movie.swf"> <!-- 回退内容 --> </object> </video>
如果愿意的话,还可以使用source元素,而非src属性来指定不同的视频格式。
<video> <source src="movie.mp4"> <source src="movie.ogv"> <object data="movie.swf"> <a href="movie.mp4">download</a> </object> </video>
上面代码包含了4个不同的层次。
- 如果浏览器支持video元素,也支持H264,没什么好说的,用第一个视频。
- 如果浏览器支持video元素,支持Ogg,那么用第二个视频。
- 如果浏览器不支持video元素,那么就要试试Flash视频。
- 如果浏览器不支持video元素,也不支持Flash视频,还可以给出下载链接。
总之,无论是HTML5,还是Flash,一个也不能少。如果只使用video元素提供视频,难免会遇到问题。而如果只提供Flash影片,性质是一样的。所以还是应该两者兼顾。
支持的优先级
用户与开发者的重要性要远远高于规范和理论。在考虑优先级时,应该按照下面顺序:
用户 > 编写HTML的开发者 > 浏览器厂商 > 规范制定者 > 理论
这个设计原则本质上是一种解决冲突的机制。例如,当面临一个要解决的问题时,如果W3C给出了一种解决方案,而WHATWG给出了另一种解决方案。一旦遇到冲突,最终用户优先,其次是作者,再是实现者,然后标准制定者,最后才是理论上的完美。
根据最终用户优先的原理,开发人员在链条中的位置高于实现者,假如我们发现了规范中的某些地方有问题,就不支持实现这个特性,那么就等于把相应的特性给否定了,规范里就得删除,因为用户有更高的权重。本质上用户拥有了更大的发言权,开发人员也拥有更多的主动性。