正确理解HTML,XHTML页面的头部doctype定义

摘自http://www.west263.com/info/html/wangyezhizuo/css/20080225/42390.html

当我们制作页面的时候,总会在它的源码头部看到一串声明,比如最常见的

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

如果我们把这些代码去掉,会发现页面可能会有比较明显的变化,因为这样造成了有些样式的表现不一样。

这些代码我们称做DOCTYPE声明。DOCTYPE是document type(文档类型)的简写,用来说明你用的XHTML或者HTML是什么版本。DOCTYPE声明必须放在每一个XHTML文档最顶部,在所有代码和标识之上。

其中的DTD(例如上例中的xhtml1-transitional.dtd)叫文档类型定义,里面包含了文档的规则,浏览器就根据你定义的DTD来解释你页面的标识,并展现出来。

要建立符合标准的网页,DOCTYPE声明是必不可少的关键组成部分;除非你的XHTML确定了一个正确的DOCTYPE,否则你的标识和CSS都不会生效。

XHTML 1.0 提供了三种DTD声明可供选择:

过渡的(Transitional):要求非常宽松的DTD,它允许你继续使用HTML4.01的标识(但是要符合xhtml的写法)。完整代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

严格的(Strict):要求严格的DTD,你不能使用任何表现层的标识和属性,例如

。完整代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

框架的(Frameset):专门针对框架页面设计使用的DTD,如果你的页面中包含有框架,需要采用这种DTD。完整代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

理想情况当然是严格的DTD,但对于我们大多数刚接触web标准的设计师来说,过渡的DTD(XHTML 1.0 Transitional)是目前理想选择。因为这种DTD还允许我们使用表现层的标识、元素和属性,也比较容易通过W3C的代码校验。

==========================下面原创====================

正如我们理解的那样,上面的我们最常看见的解释了.

但是今天我看到了一本外国文档,它的解释让一切变得是那么的简单,这很能说明国内的翻译人员大多故弄玄虚,将简单的学问搞复杂.好了不多说了.开始sharing.

为什么MIME 类型很重要,为什么我老是想起他们?

三个字:(draconian error handing)严格的错误处理.浏览器一直都是"宽容HTML的错误的".如果你在创建一个HTML页面的时候忘记了

<title>标签,浏览器也是照样可以显示你的html内容.尽管<title>元素任何版本的HTML中都是一直要求出现在页面中的.同样,如果你在页面中使用了一些不允许的标签时,浏览器也会尽可能的解释它,并且不会报出错误.

可能这正是你所期待的,事实上这些残缺的标签能够在浏览器上运行导致了web程序员继续创建这些垃圾的残缺的代码.经过评估发现,网络上99%的web页面至少存在一个错误.因为这些错误并没有的导致浏览器在页面显示这些错误,所以就没有人去修复这个bug.

但是W3C组织却认为这是一个基本的问题.并且着手来订正它.

XML,在1997年发布了.打破了浏览器容许HTML代码有错的传统,要求使用XML的语言必须将这些问题当成是错误并报告给终端用户.

当W3C将HTML修改为XML时,相应的用户的代码的MIME类型需要修改为

application/xhtml+xml,也就是将后缀改为(xhtml)

这样可以进行错误处理.如果你的XHTML页面中有一个错误,那么浏览器就会停止进程并且报告错误给终端用户.

这个观点并不是很流行,由于评估的有99%的网站存在问题,所以经常出现的问题

让XHTML1.0 和XHTML1.1 的新特性完全得不到体现.网站程序员基本上直接忽略

application/xhtml+xml ,在并不意味则他们同样放弃了XHTML.

附带的XHTML给网站程序员一个后门,用一些类似于XHTML的语法,但是还是使用

text/html MIME 类型.这就是我们现在成千上万的网站的做法 .

即使是今天,许多网页通过声明为XHTML类型,他们通过在页面的第一行声明XHTML doctype

使用小写的标签名称,在属性上面使用引号.在空元素后面加斜杠如<br/> <hr/>

仅仅这些很小的部分通过application/xhtml+xml MIME 类型触发错误处理.

任何页面如果它的MIME类型是text/html,那么无论它的doctype,语法,代码风格是什么样子的.将会使用容错的html解释器,忽略标记的错误.

好了,我总结一下,我们现在经常写的页面,其实就是这个后门的体现.

那么,不这么定义头行不行?

现在是行了,但是如果是以前老版本的浏览器,你的网站可能就面目全非了.

如果你想编写能够兼容很多浏览器的网站,那么推荐你还是使用

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

它要求非常宽松的DTD,它允许你继续使用HTML4.01的标识.

可以说XHTML 1.0是更加严格和纯粹的HTML 4.01 版本.

当然你也可以使用

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

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

这种纯粹的HTML4.01 为什么需要头呢.

因为在 HTML 4.01 中,<!DOCTYPE> 声明引用 DTD,因为 HTML 4.01 基于 SGML。DTD 规定了标记语言的规则,这样浏览器才能正确地呈现内容。

为什么都是Transitional这种类型的..这是过渡的版本,兼容性更好.

然后将MIME类型改为我们的text/html.文件后缀为(html)为什么要这么多此一举呢?因为大多数浏览器

遵循XHTML1.0 或者XHTML 1.1,或者使用HTML 4.01 它们有了一些新的特性.我们都想用这些新特性,但是又不想让自己的页面报错.折中的办法应该就是这样了.

但是对于大多数网站程序员来说,我想他们其实就是所谓的"挂羊头卖狗肉"吧.

新特性没用到,还因为这些无厘头的头部把自己的代码搞的云里雾里的.

幸好,我们的HTML5时代来临了.所有的这些都将成为历史.

HTML5不是基于SGML的,所以不需要引用DTD.只需要

<!DOCTYPE html>

That is all.

Best Wishes....

正确理解HTML,XHTML页面的头部doctype定义

时间: 2024-08-02 18:12:04

正确理解HTML,XHTML页面的头部doctype定义的相关文章

IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token

本文引用了简书作者“骑小猪看流星”技术文章“Cookie.Session.Token那点事儿”的部分内容,感谢原作者. 1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动端IM)的数据流交换方式都是Http短连接+TCP或UDP长连接来实现.Http短连接主要用于从服务器读取各种持久化信息:比如用户信息.聊天历史记录.好友列表等等,长连接则是用于实时的聊天消息或指令的接收和发送. 作为IM系统中不可或缺的技术,Http短连的重要性无可替代,但Http作为传统互联网信

if __name__ == &#39;__main__&#39; 如何正确理解

今天刷知乎,突然看到这个问题,发现很多人都是简单的回答了一下,对于很多人来说,更准确的说应该是大部分的 Python 初学者,这样的回答很容易让人理解.所以这里我来做说一下,希望能把这个问题说明白. 先举一个例子:假设我们有一个add.py文件,里面的代码是这样: def add(a, b):    return a + badd(1,2)#用于测试上面函数是否正常 这里就是一个求两数之和的函数,然后我在另一个文件中调用这个模块,这个时候就会把add(1,2)也运行,但是我是不希望运行add(1

TableViewCell reuse 重用 我认为的正确理解与使用方法

其实有点失望,因为用google搜索“uitableviewcell dequeueReusableCellWithIdentifier”出来一堆堆资深博主的文章.看了看,大部分都是在解决一个问题:使用重用时cell显示混乱的问题.该问题本身并不让我失望,失望的是博主们的解释. 首先,回顾一下UITableViewCell的重用,其基本逻辑就是tableView一开始会创建一屏幕的cell(如果有那么多)并把他们标记(Identifier),之后用户上下滑动tableView时,使用Identi

正确理解Python函数是第一类对象

正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性.那到底什么是第一类对象呢? 函数是对象 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性

正确理解“冬钓阴”和“冬钓阳”

转载请注明文章转载自 光威鱼竿价格表 冬季钓鱼一般都讲究冬钓阳,但是又有一种说法叫做冬钓阴,这里面咋一看有点矛盾,那么怎么来正确理解这两者呢? 先来说说什么是冬钓阴,冬钓阴可不是选择阴天出去钓鱼,在冬天,如果没有太阳的话,一般水面受冷风侵袭,水温会比较低,不大利于鱼的活动和觅食,而另外一些地方,比如岸边有密集树林或者有挡风的围墙等等,这些平时觉得比较阴暗地方的水面由于被挡住了风,所以水温会相对高一些,更适合鱼活动,选择这些个地方垂钓就是所谓的冬钓阴. 冬钓阳,顾名思义就是选择有太阳的日子出去钓鱼

正确理解SQL Server配置timeout相关选项

正确理解SQL Server配置选项"remote login timeout"和"remote query timeout" 查看配置选项的设置 sp_configure 远程登录超时 参考:https://msdn.microsoft.com/en-us/library/ms175136.aspx "The remote login timeout option specifies the number of seconds to wait befor

正确理解 LEAL (Load Effective Address) 指令

LEAL: leal S, D    ->    D ← &S 在 CSAPP (Computer Systems: A Programmer’s Perspective) 中,对 LEAL 指令用作简单算术运算的情况,给出了一个例子: For example, if register %edx contains value x, leal 7(%edx,%edx,4), %eax will set register %eax to 5x + 7. 正确理解逻辑为: 1. 设%edx的值为x

正确理解功率MOSFET的RDS(ON)温度系数特性

通常,许多资料和教材都认为,MOSFET的导通电阻具有正的温度系数,因此可以并联工作.当其中一个并联的MOSFET的温度上升时,具有正的温度系数导通电阻也增加,因此流过的电流减小,温度降低,从而实现自动的均流达到平衡.同样对于一个功率MOSFET器件,在其内部也是有许多小晶胞并联而成,晶胞的导通电阻具有正的温度系数,因此并联工作没有问题.但是,当深入理解功率MOSFET的传输特性和温度对其传输特性的影响,以及各个晶胞单元等效电路模型,就会发现,上述的理论只有在MOSFET进入稳态导通的状态下才能

正确理解WPF中的TemplatedParent

(注:Logical Tree中文称为逻辑树,Visual Tree中文称为可视化树或者视觉树,由于名称不是很统一,文中统一用英文名称代表两个概念,况且VisualTreeHelper和LogicalTreeHelper也是WPF中提供的类名称) 众所周知WPF中的Logical Tree是逻辑上定义的元素层次树,而实际上显示在屏幕上的元素层次树是Visual Tree,Visual Tree是 (注:Logical Tree中文称为逻辑树,Visual Tree中文称为可视化树或者视觉树,由于