有没有办法在HTML5中创建自己的html标签?


114

我想创建类似

<menu>
    <lunch>
        <dish>aaa</dish>
        <dish>bbb</dish>
    </lunch>
    <dinner>
        <dish>ccc</dish>
    </dinner>
</menu>

可以用HTML5完成吗?我知道我可以做到

<ul id="menu">
    <li>
        <ul id="lunch">
            <li class="dish">aaa</li>
            <li class="dish">bbb</li>
        </ul>
    </li>
    <li>
        <ul id="dinner">
            <li class="dish">ccc</li>
        </ul>
    </li>    
</ul>

但它的可读性很差:(


2
你想做什么?您追求的目标可能只是通过div具有类名的s 来解决
geowa4

11
您还可以查看XML + XSLT,以更好地满足您的需求。这使您可以将一个XML文档(您的)(xslt部分)转换为另一个XML文档(html)
Michael Haren 2010年

1
哇,我很久以前就发布了这篇文章:)考虑到getElementById()与按标签名称进行抓取相比性能如何,以及SVG之类的东西如何提供全新的功能集及其语义,我认为自定义标签的用途比我少可能原本以为。感谢大家的所有周到的评论和回答!
2013年


Answers:


155

您可以在浏览器中使用自定义标签,尽管它们不是HTML5(请参阅自定义元素是否对HTML5 有效?HTML5规范)。

假设您要使用名为的自定义标记元素<stack>。这是你应该做的...

第1步

在CSS样式表中标准化其属性(请考虑将CSS重置)-示例:

 stack{display:block;margin:0;padding:0;border:0; ... }

第2步

要使其在旧版本的Internet Explorer中运行,您需要将此脚本附加到头部(如果需要在旧版本的IE中运行,则很重要!):

 <!--[if lt IE 9]> 
 <script> document.createElement("stack"); </script>
 <![endif]-->

然后,您可以自由使用自定义标签。

<stack>Overflow</stack>

也可以随意设置属性...

<stack id="st2" class="nice"> hello </stack>

21
完全正确。这不是一个好主意。但是绝对正确。您可以在页面上组成一整套自己的标签,并使它们全部与IE6向后兼容,只需添加要使用的所有标签名称的数组,然后在for循环内创建每个标签名称即可。 ,然后再开始使用其中的任何一个。这就是html5shim首先的工作方式。只要准备好为旧版IE样式化它们做好准备。另外,虽然我说这对于内部使用来说是可以的,但我并不是真的想教人们做事。完全没有
Norguard

13
我同意,编写自己的标签并不适合胆小的人。确保您对其进行了彻底的测试。我想说一件事...不要为IE6编写CSS。完全浪费资源,并且可以进一步使用甚至Microsoft都不认可的可怕产品。
蒂莫西·佩雷斯

2
@alexwells-Chrome,FF,Safari,IE 7-9-
蒂莫西·佩雷斯

5
非常重要的注意事项:尽管浏览器支持创建自定义元素,但HTML5标准并未正式支持它。从技术上讲,自定义元素是固定的。您可以做到这一点,并使HTML看起来都不错,并且在语义上很重要,但是如果您愿意的话,您正在违反标准。:)
Randolpho 2012年

11
有时……需要设定新的标准。;-)
蒂莫西·佩雷斯

26

我不太确定这些答案。正如我刚刚读到的:“自定义标签一直都允许使用HTML。”

http://www.crockford.com/html/

这里的重点是,HTML基于SGML。与具有文档类型和架构的XML不同,如果浏览器不知道一个或两个标签,HTML不会无效。想想<marquee>。尚未在官方标准中。因此,尽管使用它使您的HTML页面“未经正式批准”,但它也不会破坏页面。

然后是<keygen>,它是Netscape特有的,在HTML4中被遗忘,并已重新发现,现在在HTML5中指定。而且,我们现在拥有自定义标签属性,例如所有HTML5标签都允许使用data-XyZzz =“ ...”。

因此,尽管您不应该发明自己的整个自定义未指定标记沙拉,但也不完全禁止在HTML中包含自定义标签。但是,除非您要使用+ xml Content-Type发送它或嵌入其他XML名称空间(例如SVG或MathML),否则就是这样。这仅适用于SGML限制的HTML。


2
在此也值得关注: librador.com/2009/10/20/Styling-undefined-tag-names-in-HTML “您可以在HTML中使用任何标签名称,它将成为DOM的一部分并且可以设置样式。”
马里奥

5
“因此,使用它使您的html页面“未经官方认可”时,它也不会损坏页面。” —嗯,尝试在Internet Explorer中设置您发明的元素的样式。它不会工作。您可能不会认为它已损坏,但是自定义标签无效并且无法在Internet Explorer中工作的事实,我看不出您如何辩称它们是“允许的”。
Paul D. Waite,2010年

6
我的意思是,他不支持任何声明。仅仅因为道格拉斯·克罗克福德(Douglas Crockford)这么说,并不意味着它是真的。
Paul D. Waite 2010年

8
这是什么规格说:“这个规范没有定义如何符合用户代理手柄... ...的元素本文档中没有指定[...]我们推荐以下行为:如果用户代理程序遇到一个元素,它daccess-ods.un.org daccess-ods.un.org不能识别,它应该尝试呈现元素的内容。作者和用户不得依赖特定的错误恢复行为”-恕我直言,这意味着Crockfor一次是错误的。
user123444555621 2011年

4
@Costa:HTML非常有用,因为它是标签的一组约定俗成的含义。例如,浏览器使链接可单击,因为我们已经同意(通过HTML规范)该<a>标记是指向另一个页面的链接。您可以创建自己的标记沙拉,但是除了您自己之外,它对其他任何人都没有意义。对于给定的目的,这可能很好,但是您实际上不再使用HTML。
Paul D. Waite 2013年

6

正如Michael在评论中建议的那样,您想做的事情很可能,但是您的命名法是错误的。您并不是在“向HTML 5添加标签”,而是使用自己的标签创建新的XML文档类型。

我上一份工作是针对某些项目进行的。一些实用建议:

  1. 当您说要“将它们添加到HTML 5”时,我假设您真正的意思是您希望页面在现代浏览器中正确显示,而无需在服务器端进行大量工作。这可以通过在xml文件的顶部插入“样式表处理指令”来完成,例如<?xml-stylesheet type =“ text / xsl” href =“ menu.xsl”?>。将“ menu.xsl”替换为您创建的XSL样式表的路径,该样式表将您的自定义标签转换为HTML。

  2. 注意事项:您的文件必须是格式正确的XML文档,并带有XML标头<xml version =“ 1.0”>。对于不匹配的标记,XML比HTML更具挑剔性。另外,与HTML不同,标记区分大小写。您还必须确保Web服务器正在发送具有适当的MIME类型“ application / xml”的文件。通常,如果文件扩展名为“ .xml”,则将Web服务器配置为自动执行此操作,但请检查。

  3. 大警告:最后,正如我所描述的,使用浏览器的自动XSL转换实际上仅对调试和具有很多控制权的有限应用程序才是最佳选择。我成功地使用它在我的上一个雇主处建立了一个简单的Intranet,最多只能有几十个人访问。并非所有的浏览器都支持XSL,而那些浏览器并不具有完全兼容的实现。因此,如果要将页面发布为“狂野”,最好在服务器端将它们全部转换为HTML,这可以通过命令行工具或许多XML编辑器中的按钮来完成。


5

无法/无法在HTML中创建您自己的标签名称。这就是XML,SGML和其他通用标记语言的用途。

您可能想要的是

<div id="menu">
    <div id="lunch">
        <span class="dish">aaa</span>
        <span class="dish">bbb</span>
    </div>
    <div id="dinner">
        <span class="dish">ccc</span>
    </div>
</div>

或代替<div/><span/>类似<ul/>和的东西<li/>

为了使其外观和功能正常,只需连接一些CSS和Javascript。


5
不,不是。SGML在XML出现之前就已经存在了很长时间。
昆汀2010年

1
今天有人在使用普通SGML吗?有人使用HTML或XML及其许多后代,但我从未在野外见过SGML!无论如何,我将更新我的答案。
路加福音

我敢打赌,仍有一些人使用Docbook SGML作为文档。当然,几年前还有很多。

5

我只想在前面的答案中添加一个含义,即仅将两个单词的标记用于自定义元素。绝对不要将它们标准化。


例如,您要使用标记<icon>,因为您不喜欢<img>,而且您都不喜欢<i>...

好吧,请记住,您不是唯一的一个。也许将来,w3c和/或浏览器将指定/实现此标记。

目前,浏览器可能会为此标签实现本机样式,并且您网站的设计可能会中断。

因此,我建议使用(根据此示例)<img-icon>


实际上,标签<menu>定义良好,即不是这样使用而是定义了。它应包含<menuitem>行为类似<li>


4

自定义标签可以在Safari,Chrome,Opera和Firefox中使用,至少可以代替“ class = ...”使用它们。

CSS中的绿色{color:green}适用于

<green>This is some text.</green>

您是正确的@chas,但是不建议使用此方法,它将归类为“技巧和窍门” ...
Piyush Kumar Baliyan 2014年

2

对于嵌入元数据,您可以尝试使用HTML微数据,但是它比使用类名更加冗长。

<div itemscope>
    <p>My name is <span itemprop="name">Elizabeth</span>.</p>
</div>

<div itemscope>
    <p>My name is <span itemprop="name">Daniel</span>.</p>
</div>

2

除了编写XSL样式表(如我之前所述)外,还有另一种方法,至少在您确定将使用Firefox或其他成熟的XML浏览器(即不是Internet Explorer)的情况下。跳过XSL转换,并编写一个完整的CSS样式表,该样式表告诉浏览器如何直接格式化XML。这里的好处是您不必学习XSL,许多人认为XSL是一种困难且违反直觉的语言。缺点是CSS必须非常完整地指定样式,包括什么是块节点,什么是内联等。通常,在编写CSS时,您可以假设浏览器“知道” <em>,例如,是一个内联节点,但不知道如何处理<dish>。

最后,距我尝试此方法已有好几年了,但我的回忆是IE(至少返回了几个版本)拒绝将CSS样式表直接应用于XML文档。


是的,我认为IE进入了一种特殊的XML呈现模式,并且几乎向您展示了XML文档的美化,可折叠版本。
Paul D. Waite,2010年

2

HTML的重点是该语言中包含的标记具有一致的含义,世界上的每个人都可以使用和制定决策,例如默认样式,使链接可单击或在单击时提交表单<input type="submit">

像您这样的虚构标签对人类非常有用(因为我们可以学习英语,因此知道或至少猜测您的标签是什么意思),但对机器却不太好。



1

正如尼克所说,任何版本的HTML都不支持自定义标签。

但是,如果您在HTML中使用此类标记,则不会出现任何错误。

似乎您想创建一个列表。您可以使用无序列表<ul>创建rool元素,并将<li>标签用于下面的项目。

如果这不是您想要实现的,请准确指定您想要的。然后我们可以提出一个答案。


2
它不会给您浏览器中的错误,但IE奇怪地处理未知标签上的CSS。
ceejayoz

嗯,现在我不知道!我知道未知的CSS名称被奇怪地处理了(这是一个错误)。但是,您确定它也会奇怪地处理未知标签吗?是否只是在<>标签中没有文本的情况下渲染它们?
Kirtan

1
您不能将CSS应用于Internet Explorer中的未知元素。尝试<abbr>在IE 7中对元素进行样式设置,因为IE 7未实现<abbr>(即使它在标准中!),该元素也无法工作。当人们盲目地说非标准代码不会引起任何错误时,我为自己感到严峻的一点。您怎么知道它不会导致任何错误?要使标准代码正常工作就很难了,更不用说非标准代码了。
Paul D. Waite,2010年

1
保罗,请看html5shim解决方案。您将无法获得自定义功能的好处,但是如果您正在寻找一个容器,您要做的就是弹出一个document.createElement(“ MyNewTagName”); 进入头部(或至少在您想要该标签的任何样式版本所在的位置上方)。甚至创建它们的数组,然后遍历,用JS创建它们-不需要DOM附加,只需创建一个并取下它即可。只要准备好对它们进行样式设置,就好像它们是块布局并且100%未知。
Norguard



1

您可以只做一些自定义的CSS样式,这将创建一个标记,使背景颜色变为红色:

redback {background-color:red;}
 

<redback>This is red</redback>


1

在某些情况下,创建您自己的标签名称似乎可以正常工作。
但是,这只是浏览器的错误处理例程在起作用。问题是,不同的浏览器具有不同的错误处理例程!

请参阅此示例。
第一行包含两个组成元素whatever,不同的浏览器对它们的处理方式有所不同。文本在IE11和Edge中显示为红色,在其他浏览器中显示为黑色。
为了进行比较,第二行类似,除了第二行仅包含有效的HTML元素,因此在所有浏览器中看起来都是相同的。

body {color:black; background:white;} /* reset */

what, ever:nth-of-type(2) {color:red}
code, span:nth-of-type(2) {color:red}
<p><what></what> <ever>test</ever></p>

<p><code></code> <span>test</span></p>

虚构元素的另一个问题是,您将不知道未来会怎样。如果你创建了一个网站,几年前与像标签名称picturedialogdetailsslottemplate等,期待他们表现得像跨度,你有麻烦了!


1

您可以使用此:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>MyExample</title>
  <style>
    bloodred {color: red;}
  </style>
</head>
<body>
  <bloodred>
    this is BLOODRED (not to scare you)
  </bloodred>
</body>
<script>
  var btn = document.createElement("BLOODRED")
</script>
</html>

0

我找到了有关创建自定义HTML标记并实例化它们的文章。它简化了流程,并将其分解为任何人都可以立即理解和利用的术语-但是我不确定它包含的代码示例在所有浏览器中均有效,因此请谨慎并进行全面测试。不过,这是一个很好的入门入门。

自定义元素:在HTML中定义新元素


-1

<head>
  <lunch>
    <style type="text/css">
      lunch{
        color:blue;
        font-size:32px;
        }
      </style>
    </lunch>
  </head>

<body>
  <lunch>
    This is how you create custom tags like what he is asking for its very simple just do what i wrote it works yeah no js or convoluted work arounds needed this lets you do exactly what he wrote.
    </lunch>
  </body>


辉煌。知道为什么它没有被批准或接受吗?
rnso
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.