在我的课上,我玩了一下,发现CSS与虚构的元素一起工作。

例子:

imsocool { 颜色:蓝色; } < imsocool >你好< / imsocool >

当我的教授第一次看到我使用它时,他有点惊讶于虚构元素的工作,并建议我简单地将所有的虚构元素更改为带有ID的段落。

为什么我的教授不让我使用合成元素?他们工作效率很高。

另外,为什么他不知道存在虚构元素,并与CSS一起工作。它们不常见吗?


当前回答

...我只是简单地将我所有的自制标签更改为带有ID的段落。

我实际上不同意他关于如何正确做这件事的建议。

<p>标记用于段落。我看到人们一直在使用它而不是div——仅仅是为了空格的目的,或者因为它看起来更温和。如果不是一个段落,就不要用。 你不需要或想要把ID贴在所有东西上,除非你需要专门针对它(例如用Javascript)。使用类或直接使用div。

其他回答

从早期开始,CSS就被设计为与标记无关的,因此它可以与任何标记语言一起使用,生成类似DOM结构的树(例如SVG)。任何符合名称令牌生成的标记在CSS中都是完全有效的。所以你的问题是关于HTML而不是CSS本身。

HTML5规范支持带有自定义标记的元素。HTML5标准化了DOM中解析未知元素的方式。所以严格来说,HTML5是第一个支持自定义元素的HTML规范。你只需要使用HTML5 doctype <!文档中的DOCTYPE html>。

至于自定义标签名称本身……

本文档http://www.w3.org/TR/custom-elements/建议您选择的自定义标记至少包含一个“-”(破折号)符号。这样它们就不会与将来的HTML元素冲突。因此,你最好把你的文档修改成这样:

<style>
so-cool {
    color:blue;
}
</style>

<body>
    <so-cool>HELLO</so-cool>
</body> 

CSS是一种样式表语言,可用于表示XML文档,而不仅仅是(X)HTML文档。带有自制标记的代码片段可以是合法XML文档的一部分;如果你把它包含在一个根元素中,它就是1。可能你已经有一个<html>…</html> around it?当前的任何浏览器都可以显示XML文档。

当然,它不是一个很好的XML文档,它缺少语法和XML声明。如果使用HTML声明头(可能是发送正确mime类型的服务器配置),那么它将是非法的HTML。

HTML比普通XML有优势,因为元素有语义意义,在网页表示的上下文中是有用的。工具可以使用这种语义,其他开发人员知道它的含义,它更不容易出错,更易于阅读。

但在其他上下文中,最好使用CSS和XML和/或XSLT来表示。这就是你所做的。因为这不是你的任务,你不知道你在做什么,HTML/CSS是更好的方式,大多数时候你应该在你的场景中坚持使用它。

您应该在文档中添加一个(X)HTML头,以便工具能够为您提供有意义的错误消息。

...我只是简单地将我所有的自制标签更改为带有ID的段落。

我实际上不同意他关于如何正确做这件事的建议。

<p>标记用于段落。我看到人们一直在使用它而不是div——仅仅是为了空格的目的,或者因为它看起来更温和。如果不是一个段落,就不要用。 你不需要或想要把ID贴在所有东西上,除非你需要专门针对它(例如用Javascript)。使用类或直接使用div。

虽然CSS有一个叫做“标签选择器”的东西,但它实际上并不知道标签是什么。这将留给文档的语言来定义。CSS被设计成不仅可以与HTML一起使用,还可以与XML一起使用,其中(假设您没有使用DTD或其他验证方案)标签可以是任何东西。您也可以将它用于其他语言,尽管您需要提出自己的语义,以明确“标签”和“属性”对应的内容。

浏览器通常将CSS应用于HTML中的未知标记,因为这被认为比完全破坏要好:至少它们可以显示一些东西。但故意使用“假”标签是非常糟糕的做法。这样做的一个原因是,新标签确实会时不时地定义,如果一个定义看起来有点像你的假标签,但不完全以相同的方式工作,这可能会导致你的网站在新浏览器上出现问题。

关于其他的答案,有一些事情要么措辞不当,要么可能有点不正确。

FALSE(略):非标准HTML元素“不允许”、“非法”或“无效”。

不一定。他们“不合格”。有什么不同?有些东西可以“不符合”,但仍然是“允许的”。W3C不会派HTML警察到你家把你拖走。

W3C这样做是有原因的。一致性和规范是由一个团体定义的。如果恰好有一个较小的社区出于更特定的目的使用HTML,并且他们都同意一些他们需要的新元素以使事情变得更容易,他们可以拥有W3C所说的“其他适用规范”。(显然,这是一种过于简单的做法,但你可以理解)

也就是说,严格的验证器会将您的非标准元素声明为“无效”。但这是因为验证器的工作是确保符合它验证的任何规范,而不是确保浏览器或使用的“合法性”。

FALSE(略):非标准HTML元素将导致呈现问题

有可能,但不太可能。(将“will”替换为“might”)导致呈现问题的唯一方式是您的自定义元素与另一个规范冲突,例如对HTML规范的更改或同一系统内的另一个规范(如SVG、Math或其他自定义的东西)。

事实上,CSS可以样式化非标准标签的原因是因为HTML规范清楚地指出:

用户代理必须将它们不理解的元素和属性视为语义中立的;将它们留在DOM中(用于DOM处理器),并根据CSS(用于CSS处理器)对它们进行样式化,但不从中推断任何含义

注意:如果您想使用自定义标记,请记住稍后对HTML规范的更改可能会破坏您的样式,因此请做好准备。然而,W3C不太可能实现<imsocool>标记。

非标准标签和JavaScript(通过DOM)

您可以使用JavaScript访问和修改自定义元素的原因是,规范甚至讨论了如何在DOM中处理它们,DOM是允许您操作页面上元素的(非常可怕的)API。

htmllunknownelement接口必须用于本规范(或其他适用规范)未定义的HTML元素。

TL;DR:符合规范是为了沟通和安全的目的。除了验证器以外,其他任何方法都允许不一致性,验证器的唯一目的是强制一致性,但其使用是可选的。

例如:

var wee = document.createElement('wee');
console.log(wee.toString()); //[object HTMLUnknownElement]

(我确信这会引起争议,但这是我的2分)