Gibt es eine Möglichkeit, ein eigenes HTML-Tag in HTML5 zu erstellen?

114

Ich möchte so etwas wie erstellen

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

Kann es in HTML5 gemacht werden? Ich weiß, dass ich es schaffen kann

<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>

aber es ist so viel weniger lesbar :(

Raanan Avidor
quelle
2
Was versuchst du zu machen? Was Sie divsuchen, könnte wahrscheinlich nur durch s mit Klassennamen gelöst werden
geowa4
11
Sie können sich auch XML + XSLT ansehen, um festzustellen, ob dies Ihren Anforderungen besser entspricht. Das ermöglicht es Ihnen, (den xslt-Teil) ein XML-Dokument (Ihr) in ein anderes (html) umzuwandeln
Michael Haren
1
Wow, ich habe das vor langer Zeit gepostet :) Angesichts der Leistung von getElementById () im Vergleich zum Abrufen nach Tag-Namen und der Tatsache, dass Dinge wie SVG zusammen mit ihrer Semantik eine ganze Reihe neuer Funktionen bieten, denke ich, dass benutzerdefinierte Tags weniger Verwendung haben als ich kann ursprünglich gedacht haben. Vielen Dank an alle für all die nachdenklichen Kommentare und Antworten!
Costa
1
Mögliches Duplikat von Sind benutzerdefinierte Elemente in HTML5 gültig?
zzzzBov

Antworten:

155

Sie können benutzerdefinierte Tags in Browsern verwenden, obwohl diese nicht HTML5 sind (siehe Sind benutzerdefinierte Elemente gültig für HTML5? Und die HTML5-Spezifikation ).

Angenommen, Sie möchten ein benutzerdefiniertes Tag-Element namens verwenden <stack>. Folgendes sollten Sie tun ...

SCHRITT 1

Normalisieren Sie die Attribute in Ihrem CSS-Stylesheet (denken Sie an CSS-Reset) - Beispiel:

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

SCHRITT 2

Damit es in alten Versionen von Internet Explorer funktioniert, müssen Sie dieses Skript an den Kopf anhängen (wichtig, wenn Sie es für ältere Versionen von IE benötigen!):

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

Dann können Sie Ihr benutzerdefiniertes Tag frei verwenden.

<stack>Overflow</stack>

Fühlen Sie sich frei, auch Attribute festzulegen ...

<stack id="st2" class="nice"> hello </stack>
Timothy Perez
quelle
21
Absolut korrekt. Keine fantastische Idee. Aber absolut richtig. Sie können eine ganze Armee Ihrer eigenen Tags auf Ihrer Seite erstellen und sie alle abwärtskompatibel mit IE6 machen, indem Sie einfach ein Array aller Tag-Namen hinzufügen, die Sie verwenden möchten, und dann jedes in einer for-Schleife erstellen , in Ihrem Seitenkopf, bevor Sie eine davon verwenden. So funktioniert das html5shim überhaupt. Seien Sie einfach bereit, sich Mühe zu geben, sie im alten IE zu stylen. Auch wenn ich sagen würde, dass dies für den internen Gebrauch in Ordnung ist, möchte ich den Menschen nicht wirklich beibringen, Dinge zu tun. Überhaupt.
Norguard
13
Ich bin damit einverstanden, dass das Schreiben eigener Tags nichts für schwache Nerven ist. Stellen Sie sicher, dass Sie es gründlich testen. Ich möchte jedoch eines sagen ... schreibe kein CSS für IE6. Vollständige Verschwendung von Ressourcen und die weitere Verwendung eines solch schrecklichen Produkts, das nicht einmal Microsoft befürwortet.
Timothy Perez
2
@alexwells - Chrome, FF, Safari, IE 7-9
Timothy Perez
5
Sehr wichtiger Hinweis: Obwohl Browser das Erstellen eines benutzerdefinierten Elements unterstützen, wird es vom HTML5-Standard nicht offiziell unterstützt. Benutzerdefinierte Elemente sind technisch verboten. Sie können es tun und Ihr HTML schön und semantisch wichtig aussehen lassen, aber Sie brechen den Standard, wenn Sie dies tun - wenn es Sie interessiert. :)
Randolpho
11
Manchmal ... müssen neue Standards gesetzt werden. ;-)
Timothy Perez
26

Bei diesen Antworten bin ich mir nicht so sicher. Wie ich gerade gelesen habe: "BENUTZERDEFINIERTE TAGS WURDEN IMMER IN HTML ERLAUBT."

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

Der Punkt hier ist, dass HTML auf SGML basiert. Im Gegensatz zu XML mit seinen Doctypes und Schemas wird HTML nicht ungültig, wenn ein Browser ein oder zwei Tags nicht kennt. Denken Sie an <Festzelt>. Dies war nicht im offiziellen Standard. Während der Verwendung wurde Ihre HTML-Seite "offiziell nicht genehmigt", und die Seite wurde auch nicht beschädigt.

Dann gibt es <keygen>, das Netscape-spezifisch war, in HTML4 vergessen und wiederentdeckt und jetzt in HTML5 angegeben wurde. Außerdem haben wir jetzt benutzerdefinierte Tag-Attribute wie data-XyZzz = "...", die für alle HTML5-Tags zulässig sind.

Obwohl Sie keinen eigenen benutzerdefinierten, nicht spezifizierten Markup-Salat erfinden sollten, ist es nicht unbedingt verboten, benutzerdefinierte Tags in HTML zu haben. Dies gilt jedoch nur, wenn Sie es mit einem + xml-Inhaltstyp senden oder andere XML-Namespaces wie SVG oder MathML einbetten möchten. Dies gilt nur für SGML-beschränktes HTML.

Mario
quelle
2
Ebenfalls von Interesse hier: librador.com/2009/10/20/Styling-undefined-tag-names-in-HTML "Sie können einen beliebigen Tag-Namen in HTML verwenden, der Teil des DOM ist und gestylt werden kann."
Mario
5
"Während der Verwendung wurde Ihre HTML-Seite" offiziell nicht genehmigt ", und die Seite wurde auch nicht beschädigt." - ähm, versuchen Sie, Ihre erfundenen Elemente in Internet Explorer zu gestalten. Es wird nicht funktionieren. Sie halten das vielleicht nicht für kaputt, aber die Tatsache, dass benutzerdefinierte Tags ungültig sind und in Internet Explorer nicht funktionieren, sehe ich nicht, wie Sie argumentieren können, dass sie "erlaubt" sind.
Paul D. Waite
6
Ich meine, er untermauert seine Aussage mit nichts. Nur weil Douglas Crockford es gesagt hat, heißt das nicht, dass es wahr ist.
Paul D. Waite
8
In den Spezifikationen heißt es: "Diese Spezifikation definiert nicht, wie konforme Benutzeragenten mit ... Elementen ... umgehen, die in diesem Dokument nicht angegeben sind. [...] Wir empfehlen das folgende Verhalten: Wenn ein Benutzeragent auf ein Element stößt erkennt nicht, sollte es versuchen, den Inhalt des Elements zu rendern. [...] Autoren und Benutzer dürfen sich nicht auf ein bestimmtes Fehlerbehebungsverhalten verlassen "- IMHO bedeutet dies, dass Crockfor ausnahmsweise einmal falsch ist.
user123444555621
4
@Costa: HTML ist nützlich, da es sich um eine Reihe vereinbarter Bedeutungen für Tags handelt. Zum Beispiel machen Browser Links anklickbar, weil wir (über die HTML-Spezifikation ) vereinbart haben, dass das <a>Tag ein Link zu einer anderen Seite ist. Sie können Ihren eigenen Markup-Salat erstellen, der jedoch nur für Sie selbst von Bedeutung ist. Für einen bestimmten Zweck mag das in Ordnung sein, aber Sie verwenden HTML nicht mehr wirklich.
Paul D. Waite
6

Wie Michael in den Kommentaren vorgeschlagen hat, ist das, was Sie tun möchten, durchaus möglich, aber Ihre Nomenklatur ist falsch. Sie fügen HTML 5 keine Tags hinzu, sondern erstellen einen neuen XML-Dokumenttyp mit Ihren eigenen Tags.

Ich habe dies für einige Projekte bei meinem letzten Job getan. Einige praktische Ratschläge:

  1. Wenn Sie sagen, dass Sie "diese zu HTML 5 hinzufügen" möchten, meinen Sie damit, dass die Seiten in einem modernen Browser korrekt angezeigt werden sollen, ohne dass Sie viel Arbeit auf der Serverseite leisten müssen. Dies kann erreicht werden, indem oben in die XML-Datei eine "Stylesheet-Verarbeitungsanweisung" eingefügt wird, z. B. <? Xml-stylesheet type = "text / xsl" href = "menu.xsl"?>. Ersetzen Sie "menu.xsl" durch den Pfad zum XSL-Stylesheet, das Sie erstellen, um Ihre benutzerdefinierten Tags in HTML zu konvertieren.

  2. Vorsichtsmaßnahmen: Ihre Datei muss ein wohlgeformtes XML-Dokument mit dem XML-Header <xml version = "1.0"> sein. XML ist in Bezug auf nicht übereinstimmende Tags wählerischer als HTML. Im Gegensatz zu HTML wird bei Tags auch zwischen Groß- und Kleinschreibung unterschieden. Sie müssen auch sicherstellen, dass der Webserver die Dateien mit dem entsprechenden MIME-Typ "application / xml" sendet. Oft wird der Webserver so konfiguriert, dass dies automatisch erfolgt, wenn die Dateierweiterung ".xml" lautet. Überprüfen Sie dies jedoch.

  3. Große Einschränkung: Schließlich ist die Verwendung der automatischen XSL-Transformation des Browsers, wie ich beschrieben habe, nur für das Debuggen und für eingeschränkte Anwendungen, bei denen Sie viel Kontrolle haben, am besten geeignet. Ich habe es erfolgreich verwendet, um bei meinem letzten Arbeitgeber ein einfaches Intranet einzurichten, auf das höchstens ein paar Dutzend Personen zugreifen konnten. Nicht alle Browser unterstützen XSL, und diejenigen, die keine vollständig kompatiblen Implementierungen haben. Wenn Ihre Seiten also in den "wilden" Zustand versetzt werden sollen, ist es am besten, sie alle auf der Serverseite in HTML umzuwandeln. Dies kann mit einem Befehlszeilentool oder mit einer Schaltfläche in vielen XML-Editoren erfolgen.

Dan Menes
quelle
5

Das Erstellen eigener Tag-Namen in HTML ist nicht möglich / ungültig. Dafür sind XML, SGML und andere allgemeine Auszeichnungssprachen gedacht.

Was Sie wahrscheinlich wollen, ist

<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>

Oder statt <div/>und so <span/>etwas wie <ul/>und <li/>.

Schließen Sie einfach CSS und Javascript an, damit es richtig aussieht und funktioniert.

LukeN
quelle
5
Nein, ist es nicht. SGML wurde dafür entwickelt, lange bevor XML auf den Markt kam.
Quentin
1
Verwendet heute jemand einfaches SGML? Entweder verwenden die Leute HTML oder XML und viele seiner Nachkommen, aber ich habe SGML noch nie in freier Wildbahn gesehen! Wie auch immer, ich werde meine Antwort aktualisieren.
LukeN
Ich wette, es gibt immer noch einige Leute, die Docbook SGML zur Dokumentation verwenden. Vor ein paar Jahren gab es sicherlich viele.
Ken
5

Ich möchte nur zu den vorherigen Antworten hinzufügen, dass es eine Bedeutung hat, nur Zwei-Wörter-Tags für benutzerdefinierte Elemente zu verwenden. Sie sollten niemals standardisiert werden.


Zum Beispiel möchten Sie das Tag verwenden <icon>, weil Sie es nicht mögen <img>und Sie es nicht mögen<i> ...

Denken Sie daran, dass Sie nicht der einzige sind. Vielleicht werden w3c und / oder Browser in Zukunft dieses Tag spezifizieren / implementieren.

Zu diesem Zeitpunkt implementieren Browser wahrscheinlich den nativen Stil für dieses Tag, und das Design Ihrer Website kann fehlerhaft sein.

Daher schlage ich vor, (gemäß diesem Beispiel) zu verwenden <img-icon>.


Tatsächlich ist das Tag <menu>gut definiert, dh nicht so verwendet, sondern definiert. Es sollte enthalten <menuitem>, wie sich verhalten <li>.

Langlazuli
quelle
4

Benutzerdefinierte Tags können in Safari, Chrome, Opera und Firefox verwendet werden, zumindest soweit sie anstelle von "class = ..." verwendet werden.

grün {Farbe: grün} in CSS funktioniert für

<green>This is some text.</green>
Chas
quelle
Sie sind richtig @chas, aber diese Methode wird nicht empfohlen, und es wird unter die Kategorie "Hacks and Tricks" fallen ...
Piyush Kumar Baliyan
2

Zum Einbetten von Metadaten können Sie versuchen, HTML-Mikrodaten zu verwenden , diese sind jedoch noch ausführlicher als die Verwendung von Klassennamen.

<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>
Ionuț G. Stan
quelle
2

Neben dem Schreiben eines XSL-Stylesheets, wie ich zuvor beschrieben habe, gibt es einen anderen Ansatz, zumindest wenn Sie sicher sind, dass Firefox oder ein anderer vollwertiger XML-Browser verwendet wird (dh NICHT Internet Explorer). Überspringen Sie die XSL-Transformation und schreiben Sie ein vollständiges CSS-Stylesheet, das dem Browser mitteilt, wie das XML direkt formatiert werden soll. Der Vorteil hierbei ist, dass Sie XSL nicht lernen müssen, was für viele Menschen eine schwierige und nicht intuitive Sprache ist. Der Nachteil ist, dass Ihr CSS das Styling sehr vollständig spezifizieren muss, einschließlich Blockknoten, Inlines usw. Normalerweise können Sie beim Schreiben von CSS davon ausgehen, dass der Browser beispielsweise <em> "kennt". ist ein Inline-Knoten, hat aber keine Ahnung, was mit <dish> zu tun ist.

Schließlich ist es einige Jahre her, seit ich dies versucht habe, aber ich erinnere mich, dass der IE (zumindest einige Versionen zurück) sich geweigert hat, CSS-Stylesheets direkt auf XML-Dokumente anzuwenden.

Dan Menes
quelle
Ja, ich denke, der IE wechselt in einen speziellen XML-Rendering-Modus und zeigt Ihnen so ziemlich eine hübsche, zusammenklappbare Version des XML-Dokuments.
Paul D. Waite
2

Der Sinn von HTML ist, dass die in der Sprache enthaltenen Tags eine vereinbarte Bedeutung haben, die jeder auf der Welt verwenden und Entscheidungen treffen kann - wie das Standard-Styling oder das Klicken auf Links oder das Senden eines Formulars, wenn Sie auf ein klicken <input type="submit"> .

Gemachte Tags wie Ihre sind großartig für Menschen (weil wir Englisch lernen können und somit wissen oder zumindest erraten, was Ihre Tags bedeuten), aber nicht so gut für Maschinen.

Paul D. Waite
quelle
1

Dies ist in keiner HTML-Spezifikation eine Option :)

Sie können wahrscheinlich mit <div>Elementen und Klassen tun, was Sie wollen. Ausgehend von der Frage bin ich mir nicht sicher, wonach Sie suchen, aber nein, das Erstellen eigener Tags ist keine Option.

Nick Craver
quelle
1

Wie Nick sagte, werden benutzerdefinierte Tags von keiner HTML-Version unterstützt.

Es wird jedoch kein Fehler ausgegeben, wenn Sie ein solches Markup in Ihrem HTML-Code verwenden.

Anscheinend möchten Sie eine Liste erstellen. Sie können eine ungeordnete Liste verwenden <ul>, um die Rool-Elemente zu erstellen, und die verwenden<li> Tag für die darunter .

Wenn Sie dies nicht erreichen möchten, geben Sie bitte genau an, was Sie möchten. Wir können dann eine Antwort finden.

Kirtan
quelle
2
Es wird kein Fehler im Browser angezeigt, aber der IE behandelt CSS auf unbekannten Tags seltsamerweise.
Ceejayoz
Hmmm, jetzt wusste ich das nicht! Ich wusste, dass die unbekannten CSS-Namen seltsam behandelt werden (das ist ein Fehler). Aber sind Sie sicher, dass die unbekannten Tags auch seltsam behandelt werden? Werden sie nicht einfach ohne den Text in den <>Tags gerendert?
Kirtan
1
Sie können CSS in Internet Explorer nicht auf unbekannte Elemente anwenden. Versuchen Sie, ein <abbr>Element in IE 7 zu gestalten. Es funktioniert nicht, da IE 7 nicht implementiert wurde <abbr>(obwohl es im Standard enthalten ist!). Ich habe ein grimmiges kleines Kichern vor mir, wenn Leute blind sagen, dass nicht standardmäßiger Code keine Fehler verursacht. Woher zum Teufel weißt du, dass es keine Fehler verursacht? Es ist schon schwer genug, Standardcode zum Laufen zu bringen, geschweige denn Nicht-Standardcode.
Paul D. Waite
1
Paul, schauen Sie im html5shim nach Ihrer Lösung. Sie profitieren nicht von benutzerdefinierten Funktionen. Wenn Sie jedoch nach einem Container suchen, müssen Sie lediglich ein document.createElement ("MyNewTagName") einfügen. in den Kopf (oder zumindest darüber, wo eine gestylte Version dieses Tags sein soll). Erstellen Sie sogar ein Array von ihnen und durchlaufen Sie es, indem Sie sie in JS erstellen - es ist kein DOM-Anhang erforderlich. Erstellen Sie einfach eines und werfen Sie es ein. Seien Sie einfach darauf vorbereitet, sie so zu gestalten, als wären sie Blocklayout und zu 100% unbekannt.
Norguard
1

Sie können benutzerdefinierte Attribute über HTML 5-Datenattribute hinzufügen. Beispiel: Nachricht, die für HTML 5 gültig ist. Weitere Informationen finden Sie unter http://ejohn.org/blog/html-5-data-attributes/ .

Alex Yang
quelle
1

Mit Polymer- oder X-Tags können Sie Ihre eigenen HTML-Tags erstellen. Es basiert auf dem "Shadow DOM" des nativen Browsers.

vinyll
quelle
1

Sie können einfach ein benutzerdefiniertes CSS-Styling durchführen. Dadurch wird ein Tag erstellt, das die Hintergrundfarbe rot macht:

redback {background-color:red;}
 

<redback>This is red</redback>

TorKitten
quelle
1

Unter bestimmten Umständen sieht es so aus, als ob das Erstellen eigener Tag-Namen einwandfrei funktioniert.
Dies ist jedoch nur die Fehlerbehandlungsroutine Ihres Browsers bei der Arbeit. Und das Problem ist, dass verschiedene Browser unterschiedliche Fehlerbehandlungsroutinen haben!

Siehe dieses Beispiel.
Die erste Zeile enthält zwei zusammengesetzte Elemente:what und ever, und sie bekommen unterschiedlich von verschiedenen Browsern behandelt. Der Text wird in IE11 und Edge rot angezeigt, in anderen Browsern jedoch schwarz.
Zum Vergleich ist die zweite Zeile ähnlich, enthält jedoch nur gültige HTML-Elemente und sieht daher in allen Browsern gleich aus.

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>

Ein weiteres Problem mit erfundenen Elementen ist, dass Sie nicht wissen, was die Zukunft bringt. Wenn Sie vor ein paar Jahren eine Website mit Tag-Namen wie erstellt haben picture,dialog , details, slot, templateusw, sie erwarten wie Spannweiten zu verhalten, sind in Schwierigkeiten Sie jetzt!

Herr Lister
quelle
1

Sie können dies verwenden:

<!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>
Lawrence Turcotte
quelle
0

Ich habe diesen Artikel über das Erstellen und Instanziieren von benutzerdefinierten HTML-Tags gefunden. Es vereinfacht den Prozess und gliedert ihn in Begriffe, die jeder sofort verstehen und verwenden kann. Ich bin mir jedoch nicht ganz sicher, ob die darin enthaltenen Codebeispiele in allen Browsern gültig sind. Trotzdem ist es eine großartige Einführung in das Thema, um loszulegen.

Benutzerdefinierte Elemente: Definieren neuer Elemente in HTML

Code-Sushi
quelle
-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>

Rezoundr
quelle
Brillant. Irgendeine Idee, warum dies nicht positiv bewertet oder akzeptiert wurde?
rnso