如果我为每个标记设置 CSS,我可以使用自己的可选命名空间 HTML 标记吗?

Can I use my own optionally namespaced HTML tags if I'm setting the CSS for each one?

我想要我自己的 HTML 标签,但我不希望可能使用相同名称的新标签在未来导致它们失效。

这是个好主意吗?我可以使用命名空间来避免冲突吗?


示例:

HTML :

<b:HGroup>
    <span>item 1</span><span>item 2</span><span>item 3</span>
</b:HGroup>

CSS:

@namespace b "library://ns.example.com/framework/1";

b|HGroup {
   display:inline-block;
   vertical-align: middle;
}

我读了一个相关的问题,它建议使用 DTD。我宁愿不创建 DTD,但如果有必要,那么我想内联定义它。另外,我希望它是 运行 作为 HTML5,而不是 XHTML.


注:

我不想使用 div 加上 class

据我了解,如果我明确注册我的自定义元素,我编写的自定义元素似乎不会被未来同名元素覆盖。这是引自 W3:

Because element registration can occur at any time, a non-custom element could be created that might in the future become a custom element after an appropriate definition is registered. Such elements are called undefined potentially-custom elements. If such a definition is ever registered, the element will be upgraded, becoming a custom element.


我已经包含了一个基于答案的完整页面原型,但我无法让它将任何 CSS 附加到任何具有命名空间的元素。我已经包含了一些我在其中一个链接上找到的 JS,但注释掉了其中给我错误的部分。我主要关心的是让带有命名空间的元素由带有命名空间的 CSS 设置样式。根据我的理解,它应该在没有 JS 的情况下工作。

<!DOCTYPE html>
<html xmlns:xhtml="http://www.w3.org/1999/xhtml"
  xmlns:s="http://www.w3.org/2002/spark"
  xmlns:space="http://www.w3.org/2002/space"
  xmlns:spaced="http://www.w3.org/2002/spaced">
<head>

<script>
  "use strict";
 
  const inDocument = document.querySelector("example-element");
  const outOfDocument = document.createElement("example-element");
  // Before the element definition, both are HTMLElement:
  //console.assert(inDocument instanceof HTMLElement);
  //console.assert(outOfDocument instanceof HTMLElement);

  //class ExampleElement extends HTMLElement {};
  //customElements.define("example-element", HTMLElement);
  
  //class ExampleElement3 extends HTMLElement {}
  //customElements.define("element3", ExampleElement3);

  //document.body.appendChild(outOfDocument);
  
</script>
<style>

@namespace s url(http://www.w3.org/2000/spark);
@namespace space url(http://www.example.com/2000/spark-space);
@namespace spaced "http://www.example.com/2002/spark-spaced";

example-element {
    color: red;
    display:block;
}
element2 {
    color:green;
    font-weight:bold;
}
s|element3 {
    color:yellow;
}
space-element {
    color:yellow;
}
space|space-element {
    display:block;
    color:yellow;
}
spaced|spaced-element {
    display:block;
    color:yellow;
}
</style>
</head>

    <body>
        <example-element>example-element</example-element>
        <element2>element 2</element2>
        <space-element>space element</space-element>
        <s:element3>s namespace element 3</s:element3>
        <space:space-element>space namespace el</space:space-element>
        <spaced:spaced-element>spaced namespace el</spaced:spaced-element>
    </body>

</html>

您在这里有一个经过深入研究的问题。这样一来,您就消除了所有 "valid" 解。

你绝对可以按照你提出的建议去做,这(无害*)违反了标准。要成为 future proof,所有 HTML 标准都允许未知元素,指示浏览器忽略它们(本质上,它们都变成 <span> 元素),因为没有指示如何处理它们,虽然CSS 确实可以影响他们。这将适用于 ALL 浏览器,甚至 Mosaic 和原始 IE(尽管 CSS 不适用于此类古老的浏览器)。

正如您已经指出的那样,"proper" 方法是定义您自己的 Document Type Definition (DTD),然后可以将其包含在您的 ~HTML带有 <!DOCTYPE> 标签的文档。这可能有点矫枉过正,但从技术上讲这是正确的方法。

另一种解决方案(您也已消除)是对内联元素使用 <span class="HGroup">,对块元素使用 <div class="HGroup">,因为默认情况下这些元素实际上不执行任何操作。

该解决方案的一个变体是覆盖一些无用标签的操作并在 CSS、<s> 中禁用其标准属性,例如:

s {
  text-decoration: none; /* remove line-through */
  display: inline-block;
  vertical-align: middle;
}

(* 您可以 运行 使用自定义元素名称的 "harm" 是,如果您不指定 DTD(您自己的 DTD 或具有确切版本的现有 DTD),则HTML 标准的未来版本理论上可以为您的自定义元素定义一些不需要的 属性。)

HTML5 支持自定义 HTML 元素,但根据 the specs 它们应该包含 - 字符:

The name must contain a dash (-). So for example, <x-tags>, <my-element>, and <my-awesome-app> are all valid names, while <tabs> and <foo_bar> are not. This restriction allows the parser to distinguish custom elements from regular elements but also ensures forward compatibility when new tags are added to HTML.

有关详细介绍,请参阅 this article

将 CSS 应用于自定义 HTML 元素与将 CSS 应用于标准 HTML 元素的方式相同:

custom-element {
    font-weight: bold;
    background-color: #ff0;
}
<custom-element>
    This is a custom HTML element
</custom-element>