C'è un modo per creare il tuo tag html in HTML5?


114

Voglio creare qualcosa di simile

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

Può essere fatto in HTML5? So che posso farlo con

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

ma è molto meno leggibile :(


2
Cosa stai cercando di fare? quello che stai div
cercando

11
Potresti anche guardare XML + XSLT per vedere se si adatta meglio alle tue esigenze. Ciò ti consente di trasformare (la parte xslt) un documento XML (il tuo) in un altro (html)
Michael Haren

1
Wow, l'ho postato molto tempo fa :) Dato quanto getElementById () si comporta bene rispetto all'acquisizione per nome del tag e come cose come SVG forniscono un set completamente nuovo di funzionalità insieme alla loro semantica, penso che i tag personalizzati abbiano meno usi di me potrebbe aver pensato originariamente. Grazie a tutti per tutti i commenti e le risposte premurose!
Costa


Risposte:


155

Puoi utilizzare tag personalizzati nei browser, anche se non saranno HTML5 (vedi Gli elementi personalizzati sono HTML5 validi? E le specifiche HTML5 ).

Supponiamo che tu voglia utilizzare un elemento tag personalizzato chiamato <stack>. Ecco cosa dovresti fare ...

PASSO 1

Normalizza i suoi attributi nel tuo foglio di stile CSS (pensa a css reset) - Esempio:

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

PASSO 2

Per farlo funzionare nelle vecchie versioni di Internet Explorer, è necessario aggiungere questo script in testa (importante se è necessario che funzioni nelle versioni precedenti di IE!):

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

Quindi puoi utilizzare liberamente il tuo tag personalizzato.

<stack>Overflow</stack>

Sentiti libero di impostare anche gli attributi ...

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

21
Assolutamente corretto. Non è un'idea fantastica. Ma assolutamente corretto. Potresti creare un intero esercito di tag personalizzati sulla tua pagina e renderli tutti retrocompatibili con IE6, semplicemente aggiungendo un array di tutti i nomi dei tag che desideri utilizzare e quindi creando ciascuno di essi all'interno di un ciclo for , nell'intestazione della pagina, prima di iniziare a utilizzarli. Ecco come funziona html5shim in primo luogo. Preparati a sforzarti di modellarli nella vecchia IE. Inoltre, anche se direi che va bene per uso interno, non è proprio come vorrei insegnare alle persone a fare le cose. Affatto.
Norguard

13
Sono d'accordo, scrivere i tuoi tag non è per i deboli di cuore. Assicurati di testarlo accuratamente. Vorrei dire una cosa però ... non scrivere CSS per IE6. Completamente spreco di risorse e consente un ulteriore utilizzo di un prodotto così orribile che nemmeno Microsoft approva.
Timothy Perez

2
@alexwells - Chrome, FF, Safari, IE 7-9
Timothy Perez

5
Nota molto importante: sebbene i browser supportino la creazione di un elemento personalizzato, non è ufficialmente supportato dallo standard HTML5. Tecnicamente , gli elementi personalizzati sono verboten. Puoi farlo e rendere il tuo HTML bello e semanticamente importante, ma se lo fai, infrangi lo standard, se ti interessa. :)
Randolpho

11
A volte ... è necessario stabilire nuovi standard. ;-)
Timothy Perez

26

Non sono così sicuro di queste risposte. Come ho appena letto: "I TAG PERSONALIZZATI SONO SEMPRE AMMESSI IN HTML".

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

Il punto qui è che l'HTML era basato su SGML. A differenza dell'XML con i suoi doctype e schemi, l'HTML non diventa non valido se un browser non conosce uno o due tag. Pensa a <marquee>. Questo non era nello standard ufficiale. Quindi, mentre lo si utilizza ha reso la tua pagina HTML "ufficialmente non approvata", non ha nemmeno rotto la pagina.

Poi c'è <keygen>, che era specifico di Netscape, dimenticato in HTML4 e riscoperto e ora specificato in HTML5. Inoltre, ora abbiamo attributi di tag personalizzati, come data-XyZzz = "..." consentiti su tutti i tag HTML5.

Quindi, anche se non dovresti inventare un'intera insalata di markup personalizzata non specificata, non è esattamente vietato avere tag personalizzati in HTML. Questo è comunque, a meno che tu non voglia inviarlo con un + xml Content-Type o incorporare altri spazi dei nomi XML, come SVG o MathML. Questo si applica solo all'HTML confinato con SGML.


2
Interessante anche qui: librador.com/2009/10/20/Styling-undefined-tag-names-in-HTML "Puoi usare qualsiasi nome di tag in HTML, farà parte del DOM e può essere stilizzato."
mario

5
"Quindi, mentre lo si utilizzava, la tua pagina html" non è stata approvata ufficialmente ", non ha nemmeno rotto la pagina." - ehm, prova a disegnare i tuoi elementi inventati in Internet Explorer. Non funzionerà. Potresti non considerarlo non funzionante, ma il fatto che i tag personalizzati non siano validi e non funzionino in Internet Explorer, non vedo come puoi sostenere che siano "consentiti".
Paul D. Waite

6
Voglio dire, non conferma la sua dichiarazione con nulla. Solo perché l'ha detto Douglas Crockford, non significa che sia vero.
Paul D. Waite

8
Questo è ciò che dicono le specifiche : "Questa specifica non definisce come i programmi utente conformi gestiscono ... elementi ... non specificati in questo documento. [...] consigliamo il seguente comportamento: Se un programma utente incontra un elemento, non riconosce, dovrebbe provare a rendere il contenuto dell'elemento. [...] autori e utenti non devono fare affidamento su un comportamento specifico di recupero degli errori "- IMHO questo significa che Crockfor è sbagliato, per una volta.
user123444555621

4
@Costa: HTML è utile perché è un insieme di significati concordati per i tag. Ad esempio, i browser rendono i collegamenti cliccabili perché abbiamo concordato (tramite le specifiche HTML ) che il <a>tag è un collegamento a un'altra pagina. Puoi creare la tua insalata di markup, ma non avrà significato per nessun altro tranne te stesso. Per un determinato scopo, potrebbe andare bene, ma non stai più utilizzando l'HTML.
Paul D. Waite

6

Come ha suggerito Michael nei commenti, quello che vuoi fare è del tutto possibile, ma la tua nomenclatura è sbagliata. Non stai "aggiungendo tag a HTML 5", stai creando un nuovo tipo di documento XML con i tuoi tag.

L'ho fatto per alcuni progetti nel mio ultimo lavoro. Alcuni consigli pratici:

  1. Quando dici che vuoi "aggiungerli a HTML 5", presumo che ciò che intendi veramente sia che vuoi che le pagine vengano visualizzate correttamente in un browser moderno, senza dover fare molto lavoro sul lato server. Ciò può essere ottenuto inserendo una "istruzione di elaborazione del foglio di stile" all'inizio del file xml, come <? Xml-stylesheet type = "text / xsl" href = "menu.xsl"?>. Sostituisci "menu.xsl" con il percorso del foglio di stile XSL che crei per convertire i tuoi tag personalizzati in HTML.

  2. Avvertenze: il file deve essere un documento XML ben formato, completo di intestazione XML <xml version = "1.0">. XML è più selettivo dell'HTML su cose come tag non corrispondenti. Inoltre, a differenza dell'HTML, i tag fanno distinzione tra maiuscole e minuscole. È inoltre necessario assicurarsi che il server Web invii i file con il tipo MIME appropriato "application / xml". Spesso il server web sarà configurato per farlo automaticamente se l'estensione del file è ".xml", ma controlla.

  3. Grande avvertimento: infine, l'utilizzo della trasformazione XSL automatica del browser, come ho descritto, è davvero la cosa migliore solo per il debug e per applicazioni limitate in cui si ha molto controllo. L'ho usato con successo nella creazione di una semplice intranet presso il mio ultimo datore di lavoro, a cui potevano accedere solo poche decine di persone al massimo. Non tutti i browser supportano XSL e quelli che non hanno implementazioni completamente compatibili. Quindi, se le tue pagine devono essere rilasciate nel "selvaggio", è meglio trasformarle tutte in HTML sul lato server, cosa che può essere eseguita con uno strumento a riga di comando o con un pulsante in molti editor XML.


5

La creazione di nomi di tag personalizzati in HTML non è possibile / non è valida. Ecco a cosa servono XML, SGML e altri linguaggi di markup generali.

Quello che probabilmente vuoi è

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

O invece di <div/>e <span/>qualcosa come <ul/>e <li/>.

Per farlo sembrare e funzionare correttamente, basta collegare alcuni CSS e Javascript.


5
No, non lo è. SGML è stato creato per questo molto prima che XML fosse sulla scena.
Quentin

1
Qualcuno sta usando il semplice SGML oggi? O le persone usano HTML o XML e molti dei suoi discendenti, ma non ho mai visto SGML allo stato brado! Comunque, aggiornerò la mia risposta.
LukeN

Scommetto che ci sono ancora alcune persone che usano Docbook SGML per la documentazione. Sicuramente ce n'erano molti solo pochi anni fa.
Ken

5

Voglio solo aggiungere alle risposte precedenti che c'è un significato nell'usare solo tag di due parole per elementi personalizzati. Non dovrebbero mai essere standardizzati.


Ad esempio, vuoi usare il tag <icon>, perché non ti piace <img>e non ti piace<i> né ...

Bene, tieni presente che non sei l'unico. Forse in futuro, w3c e / oi browser specificheranno / implementeranno questo tag.

In questo momento, i browser probabilmente implementeranno lo stile nativo per questo tag e il design del tuo sito web potrebbe non funzionare.

Quindi suggerisco di usare (secondo questo esempio) <img-icon>.


In effetti, il tag <menu>è ben definito cioè non così usato, ma definito. Dovrebbe contenere <menuitem>quale si comporta come <li>.


4

I tag personalizzati possono essere utilizzati in Safari, Chrome, Opera e Firefox, almeno nella misura in cui li si utilizza al posto di "class = ...".

green {color: green} in CSS funziona per

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

Hai corretto @chas ma questo metodo non è raccomandato e rientrerà nella categoria "Hacks and Tricks" ...
Piyush Kumar Baliyan

2

Per incorporare i metadati, potresti provare a utilizzare i microdati HTML , ma è ancora più dettagliato rispetto all'utilizzo dei nomi di classe.

<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

Oltre a scrivere un foglio di stile XSL, come ho descritto in precedenza, esiste un altro approccio, almeno se si è certi che verrà utilizzato Firefox o un altro browser XML a tutti gli effetti (cioè NON Internet Explorer). Salta la trasformazione XSL e scrivi un foglio di stile CSS completo che indichi al browser come formattare direttamente l'XML. Il vantaggio qui è che non dovresti imparare l'XSL, che molte persone trovano un linguaggio difficile e controintuitivo. Lo svantaggio è che il tuo CSS dovrà specificare lo stile in modo molto completo, incluso cosa sono i nodi di blocco, cosa sono inline, ecc. Di solito, quando scrivi CSS, puoi presumere che il browser "sappia" che <em>, ad esempio, è un nodo inline, ma non avrà idea di cosa fare con <dish>.

Infine, sono passati alcuni anni da quando l'ho provato, ma il mio ricordo è che IE (almeno alcune versioni precedenti) ha rifiutato di applicare i fogli di stile CSS direttamente ai documenti XML.


Sì, penso che IE entri in una speciale modalità di rendering XML e ti mostri praticamente una versione abbellita e pieghevole del documento XML.
Paul D.Waite,

2

Il punto di HTML è che i tag inclusi nella lingua hanno un significato concordato, che tutti nel mondo possono utilizzare e su cui basare le decisioni - come lo stile predefinito, o rendere i collegamenti cliccabili o inviare un modulo quando si fa clic su un <input type="submit"> .

I tag inventati come i tuoi sono ottimi per gli esseri umani (perché possiamo imparare l'inglese e quindi sapere, o almeno indovinare, cosa significano i tuoi tag), ma non così buoni per le macchine.



1

Come ha detto Nick, i tag personalizzati non sono supportati da nessuna versione di HTML.

Ma non darà alcun errore se usi tale markup nel tuo HTML.

Sembra che tu voglia creare un elenco. Puoi utilizzare un elenco non ordinato <ul>per creare gli elementi rool e utilizzare il <li>tag per gli elementi sottostanti.

Se non è questo ciò che desideri ottenere, specifica esattamente ciò che desideri. Allora possiamo trovare una risposta.


2
Non ti darà un errore nel browser, ma IE gestisce stranamente CSS su tag sconosciuti.
ceejayoz

Hmmm, ora non lo sapevo! Sapevo che i nomi CSS sconosciuti vengono gestiti in modo strano (è un errore). Ma sei sicuro che gestisca stranamente anche i tag sconosciuti? Non li visualizza solo senza il testo nei <>tag?
Kirtan

1
non è possibile applicare CSS a elementi sconosciuti in Internet Explorer. Prova a disegnare un <abbr>elemento in IE 7. Non funzionerà, perché IE 7 non è stato implementato <abbr>(anche se è nello standard!). Ho una piccola risatina cupa tra me e me quando le persone dicono ciecamente che il codice non standard non causerà errori. Come diavolo fai a sapere che non causerà errori? È già abbastanza difficile far funzionare codice standard, figuriamoci codice non standard.
Paul D. Waite

1
Paul, guarda a html5shim per la tua soluzione. Non otterrai il vantaggio della funzionalità personalizzata, ma se stai cercando un contenitore, tutto ciò che devi fare è inserire un document.createElement ("MyNewTagName"); nella testa (o almeno sopra dove vuoi che sia qualsiasi versione con stile di quel tag). Puoi persino crearne una serie e iterarli, creandoli in JS: non è necessario alcun collegamento DOM, creane uno e mandalo via. Preparati a modellarli come se fossero a blocchi e sconosciuti al 100%.
Norguard



1

Puoi semplicemente creare uno stile CSS personalizzato, questo creerà un tag che renderà il colore di sfondo rosso:

redback {background-color:red;}
 

<redback>This is red</redback>


1

In alcune circostanze, potrebbe sembrare che la creazione di nomi di tag personalizzati funzioni correttamente.
Tuttavia, questa è solo la routine di gestione degli errori del tuo browser al lavoro. E il problema è che browser diversi hanno routine di gestione degli errori diverse!

Vedi questo esempio.
La prima riga contiene due elementi inventati, whate ever, e vengono trattati in modo diverso da browser diversi. Il testo viene visualizzato in rosso in IE11 e Edge, ma nero in altri browser.
Per confronto, la seconda riga è simile, tranne che contiene solo elementi HTML validi e quindi avrà lo stesso aspetto in tutti i browser.

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>

Un altro problema con gli elementi inventati è che non saprai cosa riserva il futuro. Se è stato creato un sito web un paio di anni fa, con i nomi dei tag come picture, dialog, details, slot, templateecc, li aspettava a comportarsi come campate, sei nei guai!


1

puoi usare questo:

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

Ho trovato questo articolo sulla creazione di tag HTML personalizzati e sulla loro istanza. Semplifica il processo e lo scompone in termini che chiunque può capire e utilizzare immediatamente, ma non sono del tutto sicuro che gli esempi di codice che contiene siano validi in tutti i browser, quindi avvertilo e prova a fondo. Tuttavia, è un'ottima introduzione all'argomento per iniziare.

Elementi personalizzati: definizione di nuovi elementi in 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>


Brillante. Qualche idea sul perché questo non sia stato votato o accettato?
rnso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.