771 votes

Les balises auto-fermantes (non vides) sont-elles valides en HTML5 ?

El Validateur W3C ( Wikipedia ) n'aime pas les balises auto-fermantes (celles qui se terminent par " /> ") sur non-vide éléments. ( Éléments vides sont celles qui peuvent ne jamais contenir de contenu). Sont-ils toujours valables en HTML5 ?

Quelques exemples de accepté éléments vides :

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

Quelques exemples de rejeté des éléments non vides :

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

<b>Note :</b><br>Le validateur du W3C accepte en fait les balises void auto-fermantes : l'auteur avait initialement un problème à cause d'une simple coquille ( <code>\></code> au lieu de <code>/></code> ) ; cependant, les balises auto-fermantes ne sont pas valides à 100% dans le HTML5 en général, et les réponses élaborent sur la question des balises auto-fermantes dans les différentes saveurs du HTML.

2 votes

@Ben : oh, désolé, je pense que vous avez raison. Dans ce cas, j'ai mal compris la question originale, je pensais que le PO voulait savoir si les balises auto-fermantes sont valides en HTML5. Mais cela signifie qu'il a simplement fait des fautes de frappe dans son code, ou qu'il ne savait pas comment écrire correctement les balises auto-fermantes, ce qui est logique que le validateur du W3C ait marqué son code comme invalide.

20 votes

Pour faire gagner du temps aux futurs lecteurs : oui, la syntaxe de la question est incorrecte, et non, vous ne devez pas la modifier. Le PO a expliquer de manière explic avec justification pourquoi . Puisqu'elle a donné lieu aux erreurs de validation à l'origine de cette question, la syntaxe ne doit pas être corrigée.

0 votes

@ikaruss J'ai d'abord approuvé l'une des modifications que vous avez suggérées pour cette question (il me semblait logique de supprimer les erreurs non pertinentes à la fois dans la question et dans ses réponses), mais je viens de les annuler toutes les deux après avoir lu les commentaires ici. Veuillez lire les commentaires ci-dessus. Il est particulièrement intéressant de noter que dans votre version modifiée de la question, l'affirmation selon laquelle le validateur du W3C n'a pas apprécié le code du PO n'a plus de sens.

1340voto

Quentin Points 325526
  • (Théoriquement) dans HTML 4 , <foo / (oui, sans > du tout) signifie <foo> (ce qui conduit à <br /> signification <br>> (c'est-à-dire <br>&gt; ) et <title/hello/ signification <title>hello</title> ). J'utilise le terme " théoriquement " car il s'agit d'une SGML que les navigateurs ont très mal supporté. Il y avait si peu de support (je ne l'ai vu fonctionner qu'en emacs-w3m ) que la spécification conseille aux auteurs d'éviter la syntaxe .

  • En XHTML , <foo /> signifie <foo></foo> . Il s'agit d'un XML qui s'applique à tous les documents XML. Cela dit, le XHTML est souvent servi comme text/html qui (historiquement du moins) est traité par les navigateurs en utilisant un analyseur différent de celui des documents servis en tant que application/xhtml+xml . Le W3C fournit de compatibilité à suivre pour le XHTML comme text/html . (Essentiellement : N'utiliser la syntaxe des balises auto-fermantes que lorsque l'élément est défini comme EMPTY (et la balise end était interdite dans la spécification HTML)).

  • En HTML5 la signification de <foo /> dépend du type d'élément :

    • Sur les éléments HTML qui sont désignés comme éléments vides (essentiellement "Un élément qui existait avant HTML5 et auquel il était interdit d'avoir un quelconque contenu"), les balises de fin sont simplement interdites. La barre oblique à la fin de la balise de début est autorisée, mais n'a aucune signification. Il s'agit simplement de sucre syntaxique pour les personnes (et les surligneurs de syntaxe) qui sont accros au XML.
    • Sur les autres éléments HTML, la barre oblique est une erreur mais la récupération d'erreur amènera les navigateurs à l'ignorer et à traiter la balise comme une balise de début normale. Cela se traduit généralement par l'absence d'une balise de fin, ce qui fait que les éléments suivants sont des enfants et non des frères et sœurs.
    • Les éléments étrangers (importés d'applications XML telles que SVG) le traitent comme une syntaxe auto-fermante.

42 votes

" ... qui sont dépendants de XML. ". Vous semblez suggérer que la conformité à XML est mauvaise. Pourtant, le résultat final dans HTML5 semble être que nous devons de toute façon nous occuper des parenthèses angulaires (c'est-à-dire quelque chose avec la plupart des inconvénients de XML), tout en rendant plus difficile l'utilisation d'outils basés sur XML (par exemple, les outils de modèles ou divers processeurs). Même du point de vue de la génération, il semblerait que <object data="..." /> y <img src="..."></src> ne sont pas OK, tandis que <object data="..."></object> y <img src="..." /> sont, ce qui rend plus difficile la cohérence des outils. Cela ressemble à une situation perdant-perdant.

19 votes

@Bruno - HTML est antérieur à XML. Les efforts déployés pour inciter les gens à passer au XHTML ont échoué. Avec text/html Les navigateurs n'accordent aucune signification particulière à la barre oblique, de sorte que son inclusion n'a aucune utilité pratique. Il n'est là que pour donner une apparence plus proche de XML aux personnes qui ne peuvent pas perdre cette habitude.

12 votes

@Quentin Je ne suis pas entièrement en désaccord. Je trouve juste un peu dommage qu'un équivalent XML valide ne soit pas nécessairement valide en HTML5 (par ex. <img ...></img> au lieu de <img ...> o <img ... /> ). Étant donné que HTML5 est effectivement moins rigoureux en général (ce qui explique peut-être l'échec de XHTML), il aurait très bien pu tolérer quelque chose comme <img ...></img> . Malheureusement, ce n'est pas le cas, de sorte qu'un générateur de modèles basé sur XML doit savoir comment distinguer la production d'éléments vides ou d'éléments auto-fermants : on ne peut même pas avoir une règle qui dise d'écrire tous les éléments vides en tant que <tag></tag> .

440voto

Chris Starnes Points 2153

Comme l'a souligné Nikita Skvortsov, un div qui se ferme automatiquement ne sera pas validé. Cela est dû au fait qu'un div est un élément normal et non un élément vide .

Selon la spécification HTML5 des balises qui ne peuvent pas avoir de contenu (connues sous le nom de éléments vides ) peuvent être auto-fermants*. Cela inclut les balises suivantes :

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

Le "/" est totalement facultatif sur les balises ci-dessus, cependant, donc <img/> n'est pas différent de <img> mais <img></img> est invalide.

*Note : éléments étrangers peut aussi se fermer automatiquement, mais je ne pense pas que ce soit le sujet de cette réponse.

1 votes

Les outils de développement d'IE10 me donnent "HTML1500 : Tag cannot be self-closing. Use an explicit closing tag." sur la ligne <meta charset="UTF-8" /> Vous savez pourquoi ?

1 votes

Ok, j'ai découvert que les balises auto-fermantes ne doivent pas avoir de slash (et le fait de l'enlever corrige mon erreur). Cite : tiffanybbrown.com/2011/03/23/

0 votes

La spécification a changé. Désormais, les éléments " vides " ou " à fermeture automatique " doivent no incluent la barre oblique, lorsqu'ils sont servis comme doctype HTML 5. Cependant, si la page est servie en XHTML, la barre oblique de fermeture peut être requise (consultez la documentation dans ce cas). En pratique, les pages s'afficheront généralement comme prévu même si la barre oblique de fermeture / a été inclus, mais ce n'est pas garanti (cela dépend du fait que le navigateur réécrive effectivement le code pour vous, et l'interprète comme vous l'aviez prévu). De plus, si, pour une raison quelconque, votre page doit passer la validation HTML 5, elle risque de ne pas passer si vous fermez les balises pour les éléments vides.

65voto

Michael Edenfield Points 15298

Dans la pratique, l'utilisation de balises auto-fermantes en HTML devrait fonctionner comme prévu. Mais si vous êtes préoccupé par l'écriture de valide HTML5, vous devez comprendre comment l'utilisation de ces balises se comporte dans les deux formes de syntaxe différentes que vous pouvez utiliser. HTML5 définit à la fois une syntaxe HTML et une syntaxe XHTML, qui sont similaires mais pas identiques. Celle qui est utilisée dépend du type de média envoyé par le serveur Web.

Il est plus que probable que vos pages soient servies en tant que text/html qui suit la syntaxe HTML plus indulgente. Dans ces cas, HTML5 permet à certaines balises de début d'avoir un / facultatif avant la terminaison >. Dans ces cas, le / est optionnel et ignoré, donc <hr> y <hr /> sont identiques. La spécification HTML appelle ces éléments "void" et donne une liste des éléments valides. Strictement parlant, l'option / n'est valide qu'à l'intérieur des balises de début de ces éléments void ; par exemple, <br /> y <hr /> sont valides en HTML5, mais <p /> ne l'est pas.

La spécification HTML5 établit une distinction claire entre ce qui est correct pour les auteurs HTML et pour les développeurs de navigateurs Web, le second groupe étant tenu d'accepter toutes sortes de syntaxes "héritées" invalides. Dans le cas présent, cela signifie que les navigateurs conformes à HTML5 accepteront les balises auto-fermées illégales, telles que <p /> et les rendre comme vous vous y attendez probablement. Mais pour un auteur, cette page no être du HTML5 valide. (Plus important encore, l'arborescence DOM que vous obtenez en utilisant ce type de syntaxe illégale peut être sérieusement perturbée ; auto-fermé <span /> Les balises, par exemple, ont tendance à tout gâcher. beaucoup ).

(Dans le cas inhabituel où votre serveur sait comment envoyer des fichiers XHTML en tant que type MIME XML, la page doit être conforme à la DTD XHTML et à la syntaxe XML. Cela signifie que les balises auto-fermantes sont requis pour les éléments définis comme tels).

33 votes

<p /> sera traitée comme une balise d'ouverture, et non comme une balise auto-fermée. Cela signifie que tout le reste du document sera traité comme étant à l'intérieur de l'élément P. Ce n'est pas ce que j'attends "probablement", et cela produira un sérieux désordre sur toute page non triviale.

2 votes

"En pratique, l'utilisation de balises auto-fermantes en HTML devrait fonctionner comme prévu : <a name="foo" /> est un bon exemple de cas où ce n'est pas le cas. Au lieu d'une ancre, vous obtiendrez le texte suivant transformé en lien. Pour <A> il est très important de ne pas utiliser de syntaxe à fermeture automatique.

18voto

Nikita Skvortsov Points 1514

Elles sont valables, mais sont interprétées différemment. Regardez ça :

<!DOCTYPE html>
<html>
<head><title>Title</title></head>
<body>
  <div>
    <p>
      <div/>
    </p>
  </div>
</body>
</html>

Alors qu'il est parfaitement valide en HTML4, il est invalide en HTML5. La validation se plaint de <div/> :

Syntaxe auto-fermante (/>) utilisée sur un élément HTML non vide. Ignorer le slash et le traiter comme une balise de début.

Si le div fermé le plus à l'intérieur est traité comme une balise de début, cela casse toute la structure, donc soyez prudent avec les balises fermées.

6voto

Nic Points 333

Les balises auto-fermantes sont valables en HTML5, mais ne sont pas obligatoires.

<br> y <br /> sont tous les deux bien.

14 votes

Selon la spécification HTML5, la syntaxe auto-fermante ( /> ) ne peut pas être utilisé sur un élément HTML non vide.

4 votes

La question portait sur les étiquettes à fermeture automatique sur éléments non vides comme <p/> o <div/> .

2 votes

Au départ, la question ne portait pas spécifiquement sur les éléments non vides. Il s'agissait plutôt de savoir si l'on pouvait encore utiliser <... /> comme en XHTML ou faut-il supprimer l'élément / en HTML5. La question a été modifiée plusieurs fois par la suite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X