Le validateur W3C n'aime pas les balises à fermeture automatique (celles qui se terminent par " />
") sur les éléments non vides . (Les éléments vides sont ceux qui ne contiennent jamais de contenu.) Sont-ils toujours valides en HTML5?
Quelques exemples d' éléments annulés acceptés :
<br />
<img src="" />
<input type="text" name="username" />
Quelques exemples d' éléments non nuls rejetés :
<div id="myDiv" />
<span id="mySpan" />
<textarea id="someTextMessage" />
Remarque:
Le validateur W3C accepte en fait les balises à fermeture automatique nulles: l'auteur avait à l'origine un problème à cause d'une simple faute de frappe ( \>
au lieu de />
); cependant, les balises à fermeture automatique ne sont pas valides à 100% en HTML5 en général, et les réponses expliquent la question des balises à fermeture automatique dans diverses versions HTML.
html
syntax
w3c-validation
Ardent Coder
la source
la source
\>
, elle devrait être fermée comme une question fixe-ma-faute de frappe inutile. Les réponses s'adressent toutes/>
. La/>
version est la seule utile. Laisse faire.Réponses:
En HTML 4 ,
<foo /
(oui, sans aucun>
) signifie<foo>
(ce qui conduit au<br />
sens<br>>
(ie<br>>
) et au<title/hello/
sens<title>hello</title>
). Il s'agit d'une règle SGML que les navigateurs ont très mal pris en charge, et la spécification conseille aux auteurs d'éviter la syntaxe .En XHTML ,
<foo />
signifie<foo></foo>
. Il s'agit d'une règle XML qui s'applique à tous les documents XML. Cela dit, XHTML est souvent servi commetext/html
ce qui (historiquement au moins) est traité par les navigateurs en utilisant un analyseur différent de celui des documents servisapplication/xhtml+xml
. Le W3C fournit des directives de compatibilité à suivre pour XHTML astext/html
. (Essentiellement: n'utilisez la syntaxe de balise à fermeture automatique que lorsque l'élément est défini comme VIDE (et que la balise de fin a été interdite dans la spécification HTML)).En HTML5 , la signification de
<foo />
dépend du type d'élément .la source
<object data="..." />
et<img src="..."></src>
ne sont pas OK, alors<object data="..."></object>
et<img src="..." />
sont, ce qui le rend plus difficile la cohérence de l' outil. Cela ressemble à une situation perdante.text/html
, les navigateurs ne donnent aucune signification particulière à la barre oblique, donc l'inclure ne sert à rien. Il n'est là que pour le faire ressembler davantage à XML pour les personnes qui ne peuvent pas sortir de l'habitude.<img ...></img>
au lieu de<img ...>
ou<img ... />
). Étant donné que HTML5 est effectivement moins contraignant en général (peut-être pourquoi XHTML a échoué), il aurait très bien pu tolérer quelque chose comme<img ...></img>
. Malheureusement, ce n'est pas le cas, donc un générateur de modèles basé sur XML doit savoir distinguer la production d'éléments vides ou d'éléments à fermeture automatique: vous ne pouvez même pas avoir une règle pour dire écrire tous les éléments vides<tag></tag>
.</br>
comme<br>
tel<br></br>
serait un double saut de ligne. (et la compatibilité descendante avec le mauvais balisage du monde réel (comme</br>
) est l'un des objectifs de conception de HTML 5).Comme l'a souligné Nikita Skvortsov, un div à fermeture automatique ne sera pas validé. En effet, un div est un élément normal , pas un élément vide .
Selon la spécification HTML5 , les balises qui ne peuvent pas avoir de contenu (appelées éléments vides ) peuvent se fermer automatiquement *. Cela inclut les balises suivantes:
Le "/" est complètement facultatif sur les balises ci-dessus, cependant il
<img/>
n'est pas différent de<img>
, mais<img></img>
n'est pas valide.* Remarque: les éléments étrangers peuvent également se fermer automatiquement, mais je ne pense pas que cela soit dans la portée de cette réponse.
la source
/
a été incluse, mais cela n'est pas garanti (cela dépend du navigateur qui réécrit le code pour vous et l'interprète comme vous le souhaitiez.) De plus, si pour une raison quelconque, votre page doit passer la validation HTML 5, elle pourrait ne pas passer si vous fermez les balises pour les éléments vides.En pratique, l'utilisation de balises à fermeture automatique en HTML devrait fonctionner exactement comme vous vous y attendez. Mais si vous êtes préoccupé par l'écriture de HTML5 valide , vous devez comprendre comment l'utilisation de ces balises se comporte dans les deux formes de syntaxe que vous pouvez utiliser. HTML5 définit à la fois une syntaxe HTML et une syntaxe XHTML, qui sont similaires mais pas identiques. Celui qui est utilisé dépend du type de support envoyé par le serveur Web.
Plus que probablement, vos pages sont servies en tant que
text/html
, ce qui suit la syntaxe HTML plus clémente. Dans ces cas, HTML5 autorise certaines balises de début à avoir une option / avant de se terminer>. Dans ces cas, le / est facultatif et ignoré,<hr>
et<hr />
sont donc identiques. La spécification HTML appelle ces "éléments vides" et donne une liste des éléments valides. À strictement parler, l'option / n'est valide que dans les balises de début de ces éléments void; par exemple,<br />
et<hr />
sont HTML5 valides, mais<p />
ne le sont 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 deuxième groupe étant tenu d'accepter toutes sortes de syntaxe "héritée" non valide. Dans ce cas, cela signifie que les navigateurs compatibles HTML5 accepteront les balises auto-fermées illégales, comme
<p />
, et les rendront comme vous vous y attendez probablement. Mais pour un auteur, cette page ne serait pas valide en HTML5. (Plus important encore, l'arborescence DOM que vous obtenez en utilisant ce type de syntaxe illégale peut être sérieusement vissée; les<span />
balises auto-fermées , par exemple, ont tendance à gâcher beaucoup les choses ).(Dans le cas inhabituel où votre serveur sait comment envoyer des fichiers XHTML en tant que type XML MIME, la page doit être conforme à la DTD XHTML et à la syntaxe XML. Cela signifie que des balises à fermeture automatique sont requises pour les éléments définis comme tels.)
la source
HTML5 se comporte essentiellement comme si la barre oblique de fin n'était pas là. Il n'y a pas de balise à fermeture automatique dans la syntaxe HTML5.
Les balises à fermeture automatique sur des éléments non vides comme
<p/>
,<div/>
ne fonctionneront pas du tout. La barre oblique de fin sera ignorée et celles-ci seront traitées comme des balises d'ouverture. Cela risque d'entraîner des problèmes d'imbrication.Cela est vrai indépendamment du fait qu'il y ait un espace devant la barre oblique:
<p />
et<div />
ne fonctionnera pas non plus pour la même raison.Étiquettes à fermeture automatique de vide des éléments tels
<br/>
ou<img src="" alt=""/>
ne fonctionnera, mais seulement parce que le slash est ignoré, et dans ce cas qui arrive à entraîner le comportement correct.Le résultat est que tout ce qui fonctionnait dans votre ancien "XHTML 1.0 a servi de texte / html" continuera de fonctionner comme avant: les barres obliques de fin sur les balises non-void n'y étaient pas acceptées non plus alors que la barre oblique de fin sur les éléments void fonctionnait.
Une dernière remarque: il est possible de représenter un document HTML5 en XML, et cela est parfois surnommé "XHTML 5.0". Dans ce cas, les règles de XML s'appliquent et les balises à fermeture automatique seront toujours gérées. Il devrait toujours être servi avec un type mime XML.
la source
Les balises à fermeture automatique sont valides en HTML5, mais pas obligatoires.
<br>
et<br />
sont tous les deux très bien.la source
/>
) ne peut pas être utilisée sur un élément HTML non nul.<p/>
ou<div/>
.<... />
comme en XHTML ou devez-vous supprimer le/
en HTML5. La question a été modifiée plusieurs fois par la suite.Je serais très prudent avec les balises à fermeture automatique comme le montre cet exemple:
Mon intuition aurait été à la
<span></span><span></span>
placela source
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.
Cependant, juste pour mémoire, ce n'est pas valide:
Et une barre oblique ici le rendrait à nouveau valide:
la source