"<html xmlns="http://www.w3.org/1999/xhtml">"是什么作用?

53

我的网站上发生了令我难以置信的事情。当我添加这行代码时:

<html xmlns="http://www.w3.org/1999/xhtml">
<!DOCTYPE html>
<html>
 <head>

一切都正常。但是当我不使用时,CSS就会“搞砸”一切,所有东西变得不同,布局变得“丑陋”。

这一行代码怎么可能解决所有问题?!


7
你的HTML文件第一行有合法的doctype声明吗? - Dominic Barnes
1
你确定不是上面那一行代码造成了差异吗?你正在使用哪个浏览器进行测试? - thirtydot
@Dominic Barnes:我的第一行代码是:<html xmlns="http://www.w3.org/1999/xhtml"> <!DOCTYPE html> <html> <head> - good_evening
@hey:让我弄清楚一件事:如果你的前两行是<html xmlns="http://www.w3.org/1999/xhtml"> <!DOCTYPE html>,那么一切都正常工作。但是,如果你的前两行是<!DOCTYPE html> <html>,那么一切都会出问题?是这样吗?如果是这样,那就不太好了。 - thirtydot
我认为实际上发生的是:<!DOCTYPE html>指定了HTML 5,但文档不是HTML 5。在其上方添加HTML标记并没有将其处理为XHTML - 而是将其处理为HTML 4(Quirks Mode)。xmlns行被忽略,HTML 5 doctype和额外的<html>元素也被忽略。 - yam655
@Oriol:我重新打开这个问题,因为我认为一个针对HTML/XHTML的答案会很有用(即使只是说“它允许XHTML 1.0/1.1标记验证,在HTML5中不起作用,你可以在HTML5文档中省略它”)。 - BoltClock
4个回答

99

你把HTMLXHTML混淆了。

通常使用<!DOCTYPE>声明来区分HTMLish语言的版本(在本例中为HTML或XHTML)。

不同的标记语言将表现不同。我最喜欢的例子是height:100%。在浏览器中查看以下内容:

XHTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <style type="text/css">
    table { height:100%;background:yellow; }
  </style>
</head>
<body>
  <table>
    <tbody>
      <tr><td>How tall is this?</td></tr>
    </tbody>
  </table>
</body>
</html>

我将为您翻译以下内容,与下面的内容进行比较:(请注意缺少<!DOCTYPE>声明)

HTML(怪异模式)

<html>
<head>
  <style type="text/css">
    table { height:100%;background:yellow; }
  </style>
</head>
<body>
  <table>
    <tbody>
      <tr><td>How tall is this?</td></tr>
    </tbody>
  </table>
</body>
</html>

您会注意到表格的高度差别很大,而这两个文档之间唯一的区别就是标记类型!那么,<html xmlns="http://www.w3.org/1999/xhtml">是做什么用的呢?技术上讲,xmlns属性是由XHTML文档的根元素使用的:(根据Wikipedia)“XHTML文档的根元素必须是html,并且必须包含一个xmlns属性来将其与XHTML命名空间关联起来。”因此,请注意,重要的是要理解XHTML不是HTML,而是XML——一种非常不同的生物。(好吧,有点不同)xmlns属性只是文档需要有效的XML的其中一项内容。为什么?因为标准制定者说了这样做 ;) (您可以在Wikipedia上阅读更多关于XML命名空间的信息,但我省略了这些信息,因为它实际上与您的问题无关!)但是,为什么<html xmlns="http://www.w3.org/1999/xhtml">会修复CSS呢?

如果按照您在您的评论中所建议的那样结构化您的文档...

<html xmlns="http://www.w3.org/1999/xhtml">
<!DOCTYPE html>
<html>
<head>
[...]

...正在修复您的文档,这让我相信您对CSS和HTML并不是很了解(无意冒犯!),事实上,没有<html xmlns="http://www.w3.org/1999/xhtml">时它的行为是正常的,而有了<html xmlns="http://www.w3.org/1999/xhtml">时它就不正常了——您只是认为它是正常的,因为您习惯于编写无效的HTML,从而在quirks mode下工作。

我提供的上面的例子就是同样问题的一个例子;大多数人认为height:100%应该导致<table>的高度是整个窗口,而且DOCTYPE实际上破坏了他们的CSS...但实际情况并非如此;相反,他们只是不理解需要添加一个html,body { height:100%; } CSS规则才能实现他们想要的效果。


4
这是一个勇敢的尝试来解释,但有点混淆。当讨论高度为100%时,最好不要涉及XHTML,因为只有DOCTYPE(大多数情况下只是其存在或不存在)相关,而不是它是HTML还是XHTML语法。然后单独解释命名空间作为XHTML的属性。 - Alohci
1
@teresko - 是的,但这也是重点 ;) @Alohci - 这也是对的,但我不想偏离太远的 xmlns,所以我使用了XHTML来包含它。 - Richard JP Le Guen
HTML应该有一个文档类型声明。 - Marcin
你的HTML示例缺少一个。 - Marcin
3
你是指紧随着“(请注意缺少<!DOCTYPE>声明)”的那个例子吗?这个例子是我解释为什么OP的标记呈现为怪异模式HTML而不是XHTML的一部分。这个例子是为了让OP在浏览器中尝试并说“哦,我的标记呈现为怪异模式,因为我没有使用DOCTYPE!”这是你所指的HTML示例吗? - Richard JP Le Guen
显示剩余4条评论

33

这是一个XML命名空间。当您使用XHTML 1.0或1.1 doctype或应用程序/ xhtml + xml mime类型时才需要它。

如果您使用HTML5 doctype,则不需要在text / html中使用它。最好从类似以下模板开始:

<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8 />
        <title>domcument title</title>
        <link rel="stylesheet" href="/stylesheet.css" type="text/css" />
    </head>
    <body>
            <!-- your html content -->
            <script src="/script.js"></script>
    </body>
</html>

当您设置了正确的文档类型之后,请对您的 htmlcss 进行验证。
通常这将解决您的布局问题。


我更喜欢这个答案。简短而简单。 - Nike

8

看起来您的网站具有依赖于怪异模式运行的CSS或JS。这就是为什么您需要在doctype上面加上垃圾才能正确渲染的原因。我建议删除这些垃圾,然后修复您的CSS和JS以实际在标准模式下工作;从长远来看,您将节省很多痛苦。


0
The namespace name http://www.w3.org/1999/xhtml 
is intended for use in various specifications such as:

Recommendations:

    XHTML™ 1.0: The Extensible HyperText Markup Language
    XHTML Modularization
    XHTML 1.1
    XHTML Basic
    XHTML Print
    XHTML+RDFa

请点击此处查看更多详情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接