在没有 HTML 的情况下使用 CSS

Avatar of Mathias Bynens
Mathias Bynens 发布

DigitalOcean 为您的旅程各个阶段提供云产品。 立即开始使用 200 美元的免费信用额度!

几天前,Chris 在 推特 上写道

如果我们可以堆叠伪元素(例如 ::after::after),我们可以构建一个没有 HTML(除了 .)的完整网站。 很可能我们不能这样做。

针对这一点,我创建了 这个快速演示(在 **Firefox** 或 **Opera** 中查看),说明从技术上讲,你根本不需要任何 HTML 就可以使用 CSS。

由于这个演示显然在推特用户中引起了困惑,我决定写一篇文章来解释它。 基本上,这个神奇的演示只是结合了两个大多数人似乎不知道的巧妙小技巧。

一些 HTML 元素是隐含的

在 HTML 中,不需要打开和关闭 <html><head><body> 标签。 以下文档是完全有效的并且符合标准

<!DOCTYPE html>
<title>Example</title>

为了简洁起见,这个代码示例使用了 HTML5 DOCTYPE,但不要让它让你困惑 - 如果你切换到 HTML 4.01 DOCTYPE,该文档仍然会验证。 显然,XHTML 有一个更严格的语法,不允许省略可选的打开和/或关闭标签。 但现在已经是 2011 年了,谁还在使用 XHTML 呢?

当浏览器呈现我们的示例文档时,它会注意到 元素在源代码中丢失了,并且 - 等一下 - 自动生成它们。 你可以通过打开演示页面并使用 Firebug、Web Inspector 或 Opera Dragonfly 检查生成的源代码来确认这一点。

由于这些元素是隐含的,因此它们也可以通过 CSS 进行样式化,无论它们是否出现在源代码中。 考虑以下示例

<!DOCTYPE html>
<title>Example</title>
<style>
  html {
    background: red;
  }
  body {
    background: blue;
    margin: 0 auto;
    width: 30em;
  }
</style>

即使 HTML 源代码中没有提到 <html><body> 元素,我们仍然可以对其进行样式化,因为浏览器会自动生成它们。

基本上,这是我使用的第一个技巧;我只是更进一步。 我没有费心指定 DOCTYPE,更不用说 <title> 了,并且根本没有使用任何 HTML。 **永远不要在真正的网站上这样做。** 由于缺少 DOCTYPE,文档将在怪癖模式而不是标准模式下呈现。 不用说,该文档也不会验证。

即使使用完全为空的 HTML 文档,浏览器仍然会自动生成隐含的 HTML 元素。

有趣的旁注:也可以 链接: HTTP 标头。

RFC 5988 定义了 Link HTTP 标头,它允许你通过 HTTP 标头发送 <link> 元素,而不是将它们包含在 HTML 中。 举个例子,你可以使用以下 HTTP 标头提供一个文档

Link: <some-document.html>;rel=prefetch

…这将与在 HTML 中放置以下内容具有相同的效果

<link href="some-document.html" rel="prefetch">

类似地,RFC 5988 使得使用 HTTP 标头以外的其他方式在 HTML 文档中包含样式表成为可能

Link: <magic.css>;rel=stylesheet

相当于…

<link href="magic.css" rel="stylesheet">

用法

因此,如果你想在家玩这个,你可以将你的演示页面设置为 PHP,并在页面顶部设置标题

<?php header('Link: <demo.css>;rel=stylesheet'); ?>

在这个 演示 中,内容是使用 CSS 中的伪元素插入到页面中的

html { 
   background: #666; 
   padding: 1em; 
}
body { 
   border: 5px dashed #eee; 
   color: #fff; 
   font: 3em/1.5 sans-serif;
   padding: 1em; 
   width: 30em; 
   margin: 0 auto; 
}
body::after { 
   content: 'O HAI! Have a look at my source code :)'; /* This needs to be on the ::after (and not just on `body`) for it to work in Firefox 3.6.x. */ 
}

好吧,这就是理论。 在实践中,并没有很多浏览器实现 Link 标头。 在撰写本文时,只有 Opera 和 Firefox 支持这个小宝石。

如果你有兴趣查看此功能的浏览器支持随着时间的推移如何改进,你可以订阅有关 WebKit (Chromium 对 CSS一般变体 有单独的错误票证)和 Internet Explorer 的错误报告。

免责声明

如前所述,这些技术是有趣的技巧,了解它们的存在绝对是件好事。 但是,在实践中使用它们不是一个好主意。 没有 HTML 的“黑客”各种邪恶,并且没有一个 Web 开发人员会认真考虑在真正的网站上使用它。

Link HTTP 标头更有趣。 它无法真正使用的原因仅仅是缺少浏览器支持。 也许有一天…

感谢 Anne van Kesteren 在 2005 年教我了解 Link 标头 :)