HTML5中是否有一种方法可以创建自己的HTML标签?

136

我想创建类似于

<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 元素来解决。 - geowa4
11
你可以考虑使用XML+XSLT来查看是否更适合你的需求。这允许你将(xslt部分)一个XML文档(你的文档)转换成另一个(HTML)。 - Michael Haren
1
哇,我很久以前发布了这个 : ) 考虑到 getElementById() 的性能比按标记名称抓取要好得多,以及像 SVG 这样的东西提供了一整套新的功能和语义,我认为自定义标签的用途比我最初想象的要少。感谢大家所有的深思熟虑的评论和答案! - Costa Michailidis
1
可能是自定义元素是否有效的HTML5?的重复问题。 - zzzzBov
这是一个很好的总结:https://matthewjamestaylor.com/custom-tags - eMeL
18个回答

174

虽然它们不是HTML5(参见Are custom elements valid HTML5?HTML5规范),但是您可以在浏览器中使用自定义标签。

假设您想使用名为<stack>的自定义标签元素,这里是您应该采取的措施...

步骤1:

在CSS样式表中规范化其属性(类似于CSS重置)- 示例:

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

第二步

为了使其在旧版本的Internet Explorer中正常工作,您需要将此脚本附加到标头(如果您需要在旧版本的IE中使用它,则非常重要!):

 <!--[if lt IE 9]> 
 <script> document.createElement("stack"); </script>
 <![endif]-->
然后你就可以自由地使用你的自定义标签。
<stack>Overflow</stack>

随意设置属性...

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

25
完全正确。不是一个很棒的想法。但完全正确。 你可以在自己的页面上创建一整个标签的军队,并通过添加一个所有要使用的标记名称的数组来使它们与IE6兼容,然后在页面头部创建每个标记并将它们放在for循环中,在开始使用任何标记之前。这就是html5shim的工作原理。只是要准备好在旧版IE中对它们进行样式设置。此外,虽然我会说这对内部使用来说还可以,但这确实不是我想教人们如何做事情的方式。 绝对不是。 - Norguard
13
我同意,编写自己的标签不是易如反掌的事情。确保你彻底地测试过它。但我想说一件事... 不要为IE6编写CSS。这完全浪费资源,并继续使用一个连微软都不支持的可怕产品。 - Timothy Perez
6
非常重要的注意事项:尽管浏览器支持创建自定义元素,但这并没有得到 HTML5 标准的官方支持。从技术上讲,自定义元素是被禁止的。如果你愿意,你可以这样做,并使你的 HTML 看起来更好、更有语义,但如果你关心标准的话,那么你就违反了标准。 :) - Randolpho
20
有时候需要制定新的标准。;-) - Timothy Perez
2
回到那个时代,当所有这些都很重要,而“doctype”有一个你可以下载doctype定义,修改它,然后在你的网站上引用它(或者在自定义解析器中使用它进行验证,比如Xerxes)。 - user1410117
显示剩余6条评论

32

我对这些答案并不十分确定。正如我所阅读的: “自始至今,HTML一直允许自定义标签。”

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

这里的关键是,HTML基于SGML。与具有文档类型和模式的XML不同,如果浏览器不知道某个标记或两个标记,则HTML不会变为无效。想想<marquee>。它并没有出现在官方标准中。因此,虽然使用它会使您的HTML页面“非正式未批准”,但它仍然不会破坏页面。

接下来是<keygen>,它是Netscape专有的,在HTML4中被遗忘了,现在在HTML5中重新发现并指定。现在我们也有自定义标记属性,例如在所有HTML5标记上允许data-XyZzz =“...”。

因此,虽然您不应该发明自己完整的自定义未指定标记,但在HTML中拥有自定义标记并不完全是禁止的。但是,除非您希望将其与+xml内容类型一起发送或嵌入其他XML命名空间(例如SVG或MathML),否则适用于仅限于SGML的HTML。


3
这里还有一些相关的内容:http://www.librador.com/2009/10/20/Styling-undefined-tag-names-in-HTML/“你可以在HTML中使用任何标签名称,它都将成为DOM的一部分,并且可以进行样式设置。” - mario
6
因此,虽然使用它可能使您的HTML页面“正式未批准”,但它也不会破坏页面。嗯,请尝试在Internet Explorer中为您发明的元素进行样式设置。它不会起作用。您可能认为这并没有出现故障,但是自定义标签无效且在Internet Explorer中无法工作的事实,我不知道您如何争辩说它们是“允许”的。 - Paul D. Waite
6
我的意思是,他没有用任何东西来支持他的说法。仅仅因为道格拉斯·克罗克福德说了这句话,并不意味着它就是真的。 - Paul D. Waite
9
这是"规格说明书"的说法:“本规范未定义符合要求的用户代理如何处理未在本文档中指定的元素[...],我们建议采用以下行为:如果用户代理遇到无法识别的元素,应尝试呈现该元素的内容[...],作者和用户不应依赖特定的错误恢复行为”- 我认为这意味着Crockfor错了,至少这一次。 - user123444555621
4
HTML很有用,因为它是标签的一组约定意义。例如,浏览器会使链接可点击,因为我们已经同意(通过HTML规范<a>标签是指向另一个页面的链接。你可以创建自己的标记语言,但除了你自己以外,其他人不会理解其中的含义。对于某个特定目的来说,这可能没问题,但那时你就不再真正使用HTML了。 - Paul D. Waite
显示剩余6条评论

6
我想补充之前的答案,只使用两个单词的标签对于自定义元素是有意义的。它们不应该被标准化。
例如,你想使用标签,因为你不喜欢,也不喜欢...
请记住,你不是唯一一个这样想的人。也许在未来,W3C和/或浏览器会指定/实现这个标签。
此时,浏览器可能会为这个标签实现本地样式,从而破坏您网站的设计。
因此,我建议使用(根据此示例)。
事实上,标签已经被很好地定义了,虽然并不常用。它应该包含,其行为类似于

  • 5

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

    在CSS中,green {color: green}适用于

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

    你是正确的@chas,但这种方法并不推荐,它将被归类为“黑科技”... - Piyush Kumar Baliyan

    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>
    

    或者使用类似于<ul/><li/>的标签来替代<div/><span/>

    为了让它看起来和运行得更好,只需连接一些CSS和Javascript。


    6
    不,不是这样的。 SGML 比 XML 更早出现,就是为了解决这个问题。 - Quentin
    1
    今天还有人使用纯SGML吗?现在人们使用HTML或XML及其许多后代,但我从未见过野生的SGML!无论如何,我会更新我的答案。 - LukeN
    我敢打赌,仍有一些人在使用Docbook SGML进行文档编写。几年前还有很多人在使用它。 - Ken

    5
    正如Michael在评论中建议的那样,你想做的是完全可能的,但你的术语用词不正确。你不是“向HTML 5添加标签”,而是创建一个具有自己标签的新XML文档类型。
    我在上一份工作中为一些项目完成了这个任务。以下是一些实用的建议:
    1. 当你说想“将它们添加到HTML 5”时,我认为你真正想做的是让页面在现代浏览器中正确显示,而无需在服务器端进行大量工作。这可以通过在xml文件顶部插入“样式表处理指令”来实现,例如<?xml-stylesheet type="text/xsl" href="menu.xsl"?>。将“menu.xsl”替换为路径,指向将你的自定义标签转换为HTML的XSL样式表。
    2. 注意事项:你的文件必须是一个格式良好的XML文档,并带有XML头信息<xml version="1.0">。与HTML相比,XML对于诸如不匹配的标记等问题更加严格。此外,与HTML不同,标记是区分大小写的。你还必须确保Web服务器发送的文件具有适当的mime类型“application/xml”。通常,如果文件扩展名为“.xml”,则Web服务器将自动配置以执行此操作,但请检查。
    3. 大注意事项:最后,正如我所描述的,使用浏览器的自动XSL转换仅适用于调试和仅具有很多控制的有限应用程序。我在为上一位雇主设置一个简单的内部网站时成功地使用了它,该网站最多只能被几十个人访问。并非所有浏览器都支持XSL,而且那些支持的浏览器也没有完全兼容的实现。因此,如果你的页面将发布到“公共领域”,最好在服务器端将它们全部转换为HTML,可以使用命令行工具或许多XML编辑器中的按钮来完成。

    3

    <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
    这个问题叫做向前兼容性。谁知道W3C的某个人在2054年决定将<lunch>标签包含在标准中,以引发披萨的气味(默认),而你正在为一家克里奇餐厅设计页面。为了避免麻烦,请使用<main-dish>(两个单词)。 - undefined

    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>
    

    链接更新:https://www.tutorialspoint.com/html5/html5_microdata.htm - JayJay123

    2
    除了之前我所描述的编写XSL样式表的方法外,还有另一种方法。这种方法适用于你确定会使用Firefox或其他完整的XML浏览器(即不是Internet Explorer)。跳过XSL转换,直接编写完整的CSS样式表,告诉浏览器如何直接格式化XML。优点在于您不必学习许多人认为难以理解和反直觉的XSL语言。缺点是您的CSS必须非常详细地指定样式,包括哪些是块节点,哪些是内联节点等。通常情况下,在编写CSS时,您可以假设浏览器“知道”<em>是一个内联节点,但它不知道如何处理<dish>。

    最后,虽然我已经有几年没有尝试过这种方法,但我的回忆是IE(至少是几个版本之前)拒绝直接将CSS样式表应用到XML文档中。


    是的,我认为IE会进入特殊的XML渲染模式,基本上会向您显示一个美化、可折叠的XML文档版本。 - Paul D. Waite

    2
    HTML的重点在于语言中包含的标签具有约定俗成的含义,全世界的人都可以使用它们并基于它们做出决策--比如默认样式、使链接可点击或在单击时提交表单。
    像您这样的自定义标签对人类来说很好(因为我们可以学习英语,从而知道或至少猜测您的标签的含义),但对机器来说不那么好。

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