I tag autochiudenti (non nulli) sono validi in HTML5?


670

Il validatore W3C non ama i tag a chiusura automatica (quelli che terminano con " />") su elementi non vuoti . (Gli elementi Void sono quelli che potrebbero non contenere mai alcun contenuto.) Sono ancora validi in HTML5?

Alcuni esempi di elementi vuoti accettati :

<br />
<img src="" />
<input type="text" name="username" />

Alcuni esempi di elementi non nulli rifiutati :

<div id="myDiv" />
<span id="mySpan" />
<textarea id="someTextMessage" />

Nota:
il validatore W3C accetta effettivamente tag di chiusura automatica nulli: l'autore originariamente aveva un problema a causa di un semplice errore di battitura ( \>anziché />); tuttavia, i tag a chiusura automatica non sono validi al 100% in HTML5 in generale e le risposte elaborano il problema dei tag a chiusura automatica in vari tipi di HTML.


2
@Ben: oh, scusa, penso che tu abbia ragione. In questo caso, ho frainteso la domanda originale, ho pensato che l'OP volesse sapere se i tag a chiusura automatica sono validi in HTML5. Ma questo significa che ha appena fatto errori di battitura nel suo codice, o non sapeva come scrivere in modo appropriato i tag a chiusura automatica, il che ha senso che il validatore W3C abbia contrassegnato il suo codice come non valido.
Sk8erPeter,

16
Per risparmiare tempo per i futuri lettori: sì, la sintassi nella domanda non è corretta e no, non dovresti cambiarla. Il PO ha spiegato in modo esplicito e giustificato il perché . Poiché ha provocato errori di convalida che hanno portato a questa domanda, la sintassi non dovrebbe essere corretta.
Jordan Grey,

2
State ancora combattendo su quale direzione dovrebbero essere rivolte le barre? Dai.
BoltClock

3
@BoltClock Sì, ancora combattendo. Ragazzi: se questa domanda si ponesse \>, dovrebbe essere chiusa come una domanda inutile fix-my-typo. Le risposte a tutti gli indirizzi />. La />versione è l'unica utile. Lascia fare.
Gilles 'SO- smetti di essere malvagio'

1
Quindi la domanda deve essere riformulata, poiché il validatore W3C accetta effettivamente i tag a chiusura automatica. È difficile riformulare la domanda in modo tale da non comprometterne l'integrità rispetto all'intenzione originale. Pertanto, se vogliamo aderire alle regole della SO, potremmo dover sacrificare la chiarezza in domande come questa, anche se sembra che la modifica della domanda sia l'unica cosa sensata da fare, per il bene più grande media. Potremmo iniziare un'altra discussione su meta, se ci sono molte altre domande un problema simile.
osa,

Risposte:


1238
  • In HTML 4 , <foo /(sì, senza >affatto) significa <foo>(che porta a <br />significato <br>>(cioè <br>&gt;) e <title/hello/significato <title>hello</title>). Questa è una regola SGML secondo cui i browser hanno svolto un pessimo lavoro di supporto e le specifiche consigliano agli autori di evitare la sintassi .

  • In XHTML , <foo />significa<foo></foo> . Questa è una regola XML che si applica a tutti i documenti XML. Detto questo, XHTML è spesso servito come text/html(almeno storicamente) viene elaborato dai browser utilizzando un parser diverso rispetto ai documenti serviti application/xhtml+xml. Il W3C fornisce linee guida sulla compatibilità da seguire per XHTML come text/html. (Essenzialmente: utilizzare la sintassi del tag a chiusura automatica solo quando l'elemento è definito come EMPTY (e il tag end era proibito nelle specifiche HTML)).

  • In HTML5 , il significato di <foo /> dipende dal tipo di elemento .

    • Sugli elementi HTML che sono designati come elementi vuoti (essenzialmente "Un elemento che esisteva prima di HTML5 e che era proibito avere qualsiasi contenuto"), i tag di fine sono semplicemente vietati. La barra alla fine del tag iniziale è consentita, ma non ha alcun significato. È solo zucchero sintattico per le persone (e gli evidenziatori della sintassi) che sono dipendenti da XML.
    • Su altri elementi HTML, la barra è un errore, ma il recupero degli errori farà ignorare i browser e tratterà il tag come un normale tag di avvio. Questo di solito finisce con un tag di fine mancante che fa sì che gli elementi successivi siano figli anziché fratelli.
    • Gli elementi estranei (importati da applicazioni XML come SVG) lo trattano come sintassi a chiusura automatica.

24
" ... che sono dipendenti da XML. ". Sembra che tu suggerisca che la conformità XML non è buona. Tuttavia, il risultato finale in HTML5 sembra essere che dobbiamo comunque affrontare le parentesi angolate (ovvero qualcosa con la maggior parte degli inconvenienti di XML), mentre rende più difficile l'uso di strumenti basati su XML (ad esempio strumenti di template o vari processori ). Anche da un punto di vista generazione, sembrerebbe che <object data="..." />e <img src="..."></src>non sono OK, mentre <object data="..."></object>e <img src="..." />sono, che rende più difficile per la coerenza degli strumenti. Sembra una situazione da perdere.
Bruno,

7
@Bruno - HTML precede XML. Gli sforzi per convincere le persone a spostarsi su XHTML sono falliti. Con text/html, i browser non danno alcun significato speciale alla barra, quindi includerlo non ha uno scopo pratico. È lì solo per renderlo più simile a XML per le persone che non riescono a uscire dall'abitudine.
Quentin,

6
@Quentin Non sono completamente in disaccordo. Trovo un po 'un peccato che un equivalente XML valido non sia necessariamente HTML5 valido (ad esempio <img ...></img>invece di <img ...>o <img ... />). Poiché HTML5 è effettivamente meno rigoroso in generale (probabilmente perché XHTML ha fallito), avrebbe potuto benissimo tollerare qualcosa del genere <img ...></img>. Sfortunatamente no, quindi un generatore di template basato su XML deve sapere come distinguere la produzione di elementi vuoti o elementi a chiusura automatica: non si può nemmeno avere una regola per dire scrivere tutti gli elementi vuoti come <tag></tag>.
Bruno,

3
XHTML fallita prima di HTML 5 era ancora all'orizzonte, e non si può avere a lungo formare elementi vuoto perchè correzione di errore del browser che ha preceduto XHTML farebbe cose come trattare </br>come <br>quindi <br></br>sarebbe una pausa doppia linea. (e la retrocompatibilità con il markup del mondo reale (come </br>) è uno degli obiettivi di progettazione di HTML 5).
Quentin,

1
DAL W3C: Elementi Void: area, base, br, col, embed, hr, img, input, keygen, link, meta, param, source, track, wbr "Gli elementi Void hanno solo un tag di inizio; i tag di fine non devono essere specificati per elementi vuoti ". w3.org/TR/html5/syntax.html#void-elements
Fabio Nolasco

406

Come ha sottolineato Nikita Skvortsov, un div a chiusura automatica non verrà convalidato. Questo perché un div è un elemento normale , non un elemento vuoto .

Secondo le specifiche HTML5 , i tag che non possono avere alcun contenuto (noti come elementi vuoti ) possono chiudersi automaticamente *. Ciò include i seguenti tag:

area, base, br, col, embed, hr, img, input, 
keygen, link, meta, param, source, track, wbr

"/" È completamente opzionale sui tag sopra, tuttavia, quindi <img/>non è diverso da <img>, ma <img></img>non è valido.

* Nota: anche elementi estranei possono essere autochiudenti, ma non credo che questo rientri nel campo di applicazione di questa risposta.


1
Gli strumenti di sviluppo di IE10 mi danno "HTML1500: il tag non può essere autochiudente. Usa un tag di chiusura esplicito." sulla linea <meta charset = "UTF-8" /> Qualche idea sul perché sarebbe?
James in Indy,

Ok, ho scoperto che i tag a chiusura automatica non dovrebbero avere la barra (e rimuoverlo corregge il mio errore). Cita: tiffanybbrown.com/2011/03/23/…
James in Indy,

Le specifiche sono cambiate. Ora, gli elementi "void" o "self-closing" non dovrebbero includere la barra, se servita come doctype HTML 5. Tuttavia, se viene servito come XHTML, potrebbe essere necessaria la barra di chiusura (controllare i documenti in questo caso). Nell'uso pratico, le pagine di solito vengono visualizzate come previsto anche se la chiusura /è stata inclusa, ma ciò non è garantito (dipende dal browser che riscrive effettivamente il codice per te e lo interpreta come previsto.) Inoltre, se per qualche motivo la tua pagina deve superare la convalida HTML 5, potrebbe non passare se chiudi i tag per gli elementi vuoti.
SherylHohman,

Per quanto riguarda il commento di @ SherylHohman, non credo che le specifiche siano cambiate (o, in caso affermativo, è cambiato di nuovo). Vedi w3.org/TR/html5/syntax.html#start-tags (8.1.2.1.6) - gli elementi nulli (o estranei) possono ancora includere la barra.
ChrisC,

63

In pratica, l'uso di tag a chiusura automatica in HTML dovrebbe funzionare esattamente come ci si aspetterebbe. Ma se sei preoccupato di scrivere HTML5 valido , dovresti capire come si comporta l'uso di tali tag all'interno delle due diverse forme di sintassi che puoi usare. HTML5 definisce sia una sintassi HTML che una sintassi XHTML, che sono simili ma non identiche. Quale viene utilizzato dipende dal tipo di supporto inviato dal server Web.

Molto probabilmente, le tue pagine vengono pubblicate come text/html, che segue la sintassi HTML più indulgente. In questi casi, HTML5 consente a determinati tag di inizio di avere un facoltativo / prima che venga chiuso>. In questi casi, / è facoltativo e ignorato, quindi <hr>e <hr />sono identici. La specifica HTML chiama questi "elementi vuoti" e fornisce un elenco di quelli validi. A rigor di termini, l'opzione / è valida solo all'interno dei tag di inizio di questi elementi vuoti; per esempio, <br />e <hr />sono HTML5 validi, ma <p />non lo è.

Le specifiche HTML5 fanno una chiara distinzione tra ciò che è corretto per gli autori HTML e per gli sviluppatori di browser Web, con il secondo gruppo che deve accettare tutti i tipi di sintassi "legacy" non valida. In questo caso, significa che i browser compatibili con HTML5 accetteranno tag clandestini illegali, come <p />, e li renderanno come probabilmente ti aspetti. Ma per un autore, quella pagina non sarebbe HTML5 valida. (Ancora più importante, l'albero DOM si ottiene da utilizzare questo tipo di sintassi illegale può essere seriamente avvitato; auto-chiuso <span />i tag, ad esempio, tendono a complicare le cose in un sacco ).

(Nel caso insolito che il tuo server sappia come inviare i file XHTML come tipo MIME XML, la pagina deve essere conforme alla sintassi XHTML DTD e XML. Ciò significa che sono richiesti tag a chiusura automatica per quegli elementi definiti come tali.)


31
<p /> verrà trattato come un tag di apertura, non come un tag auto-chiuso. Ciò significa che l'intero resto del documento verrà trattato come all'interno dell'elemento P. Non è quello che "probabilmente mi aspetto", e produrrà un serio pasticcio su qualsiasi pagina non banale.
mhsmith,

12

HTML5 si comporta sostanzialmente come se la barra finale non fosse presente. Non esiste un tag autochiudente nella sintassi HTML5.

  • I tag a chiusura automatica su elementi non nulli come <p/>, <div/>non funzioneranno affatto. La barra finale verrà ignorata e queste verranno trattate come tag di apertura. Questo probabilmente porterà a problemi di nidificazione.

    Questo è vero indipendentemente dal fatto che ci sia spazio davanti alla barra: <p />e <div />inoltre non funzionerà per lo stesso motivo.

  • Tag a chiusura automatica on nulli elementi come <br/>o <img src="" alt=""/> sarà funzionare, ma solo perché la barra finale viene ignorata, e in questo caso che si verifica per determinare il comportamento corretto.

Il risultato è che tutto ciò che ha funzionato nel tuo vecchio "XHTML 1.0 servito come text / html" continuerà a funzionare come prima: le barre finali sui tag non vuoti non sono state accettate lì, mentre la barra finale sugli elementi vuoti ha funzionato.

Ancora una nota: è possibile rappresentare un documento HTML5 come XML, e questo a volte viene soprannominato "XHTML 5.0". In questo caso verranno applicate le regole di XML e i tag autochiudenti verranno sempre gestiti. Dovrebbe sempre essere servito con un tipo mime XML.


5

I tag a chiusura automatica sono validi in HTML5, ma non richiesti.

<br>e <br />stanno entrambi bene.


12
Secondo le specifiche HTML5, la sintassi a chiusura automatica ( />) non può essere utilizzata su un elemento HTML non vuoto.
naXa,

3
La domanda riguardava i tag a chiusura automatica su elementi non nulli , come <p/>o <div/>.
thomasrutter,

2
Inizialmente la domanda non riguardava specificamente gli elementi non nulli. Era più simile, puoi ancora usare <... />come in XHTML o devi rimuovere il file /in HTML5. La domanda è stata cambiata più volte dopo.
Nick,

In entrambi i casi, la risposta è che la barra verrà ignorata, il che spezzerà gli elementi non dichiarati come vuoti, ma sarà compatibile con gli elementi vuoti.
thomasrutter,

4

Starei molto attento con i tag a chiusura automatica come dimostra questo esempio:

var a = '<span/><span/>';
var d = document.createElement('div');
d.innerHTML = a
console.log(d.innerHTML) // "<span><span></span></span>"

Il mio istinto sarebbe stato <span></span><span></span>invece


2
Questo è descritto nella risposta accettata:On other [than void] HTML elements, the slash is an error, but error recovery will cause browsers to ignore it and treat the tag as a regular start tag. This will usually end up with a missing end tag causing subsequent elements to be children instead of siblings.
Palec,

-1

Tuttavia, solo per il record, questo non è valido:

<address class="vcard">
  <svg viewBox="0 0 800 400">
    <rect width="800" height="400" fill="#000">
  </svg>
</address>

E una barra qui lo renderebbe nuovamente valido:

    <rect width="800" height="400" fill="#000"/>

1
Questo perché svg è scritto in XML, non HTML. Utilizza diverse regole di analisi
Electric Coffee,
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.