Faut-il écrire <html>
, <head>
et<body>
les étiquettes?
Par exemple, je peux faire une telle page:
<!DOCTYPE html>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>Page Title</title>
<link rel="stylesheet" type="text/css" href="css/reset.css">
<script src="js/head_script.js"></script><!-- this script will be in head //-->
<div>Some html</div> <!-- here body starts //-->
<script src="js/body_script.js"></script>
Et Firebug sépare correctement la tête et le corps:
La validation W3C indique qu'elle est valide.
Mais je vois rarement cette pratique sur le Web.
Y a-t-il une raison d'écrire ces balises?
title
balise. C'est le plus petit document qu'il considère valide:<!DOCTYPE html> <title>A</title>
Réponses:
Omettre les
html
,head
et lesbody
balises est certainement permise par les spécifications HTML. La raison sous-jacente est que les navigateurs ont toujours cherché à être cohérents avec les pages Web existantes, et les toutes premières versions de HTML ne définissaient pas ces éléments. Quand HTML2.0d'abord, il a été fait de manière à ce que les balises soient déduites lorsqu'elles sont manquantes.Je trouve souvent pratique d'omettre les balises lors du prototypage et surtout lors de l'écriture des cas de test car cela permet de garder le balisage concentré sur le test en question. Le processus d'inférence doit créer les éléments exactement de la manière que vous voyez dans Firebug, et les navigateurs sont assez cohérents pour ce faire.
Mais...
IE a au moins un bogue connu dans ce domaine. Même IE9 le montre. Supposons que le balisage soit le suivant:
Vous devriez (et faites dans d'autres navigateurs) obtenir un DOM qui ressemble à ceci:
Mais dans IE, vous obtenez ceci:
Voyez par vous-même.
Ce bogue semble limité à la
form
balise de début précédant tout contenu texte et toutebody
balise de début.la source
Le Google Style Guide for HTML recommande d'omettre toutes les balises facultatives.
Cela inclut
<html>
,<head>
,<body>
,<p>
et<li>
.https://google.github.io/styleguide/htmlcssguide.html#Optional_Tags
la source
<script src="http://localhost:35729/livereload.js"></script>
. Pour les modèles exotiques, ils ne comprennent pas où ils doivent insérer leur code.Contrairement à la note de @Liza Daly sur HTML5, cette spécification est en fait assez spécifique sur les balises qui peuvent être omises et quand (et les règles sont un peu différentes de HTML 4.01, principalement pour clarifier où les éléments ambigus comme les commentaires et les espaces blancs appartiennent)
La référence pertinente est http://www.w3.org/TR/2011/WD-html5-20110525/syntax.html#optional-tags , et elle dit:
La balise de début d'un élément html peut être omise si la première chose à l'intérieur de l'élément html n'est pas un commentaire.
La balise de fin d'un élément html peut être omise si l'élément html n'est pas immédiatement suivi d'un commentaire.
La balise de début d'un élément head peut être omise si l'élément est vide, ou si la première chose à l'intérieur de l'élément head est un élément.
La balise de fin d'un élément head peut être omise si l'élément head n'est pas immédiatement suivi d'un caractère espace ou d'un commentaire.
La balise de début d'un élément body peut être omise si l'élément est vide, ou si la première chose à l'intérieur de l'élément body n'est pas un caractère espace ou un commentaire, sauf si la première chose à l'intérieur de l'élément body est un élément script ou style.
La balise de fin d'un élément body peut être omise si l'élément body n'est pas immédiatement suivi d'un commentaire.
Votre exemple est donc HTML5 valide, et serait analysé comme ceci, avec les balises html, head et body dans leurs positions implicites:
Notez que le commentaire "ce script sera dans la tête" est en fait analysé comme faisant partie du corps, bien que le script lui-même fasse partie de la tête. Selon la spécification, si vous souhaitez que cela soit différent, les balises
</HEAD>
et<BODY>
ne doivent pas être omises. (Bien que les balises<HEAD>
et correspondantes</BODY>
puissent toujours l'être)la source
Il est valide de les omettre dans HTML4:
http://www.w3.org/TR/html401/struct/global.html
En HTML5, il n'y a aucun élément "requis" ou "facultatif" exactement, car la syntaxe HTML5 est définie de manière plus lâche. Par exemple
title
:http://www.w3.org/TR/html5/semantics.html#the-title-element-0
Il n'est pas valide de les omettre dans le vrai XHTML5, bien que cela ne soit presque jamais utilisé (contre XHTML agissant comme HTML5).
Cependant, d'un point de vue pratique, vous souhaitez souvent que les navigateurs fonctionnent en "mode standard", pour une prévisibilité dans le rendu HTML et CSS. Fournir un DOCTYPE et une arborescence HTML plus structurée garantira des résultats inter-navigateurs plus prévisibles.
la source
html
,head
etbody
, les éléments sont obligatoires, mais les balises sont facultatives.Il est vrai que les spécifications HTML autorisent l'omission de certaines balises dans certains cas, mais il n'est généralement pas judicieux de le faire.
Il a deux effets - il rend la spécification plus complexe, ce qui rend plus difficile pour les auteurs de navigateurs d'écrire des implémentations correctes (comme le démontre IE en se trompant).
Cela rend la probabilité d'erreurs de navigateur dans ces parties de la spécification élevée. En tant qu'auteur de site Web, vous pouvez éviter le problème en incluant ces balises.Ainsi, bien que la spécification ne dise pas que vous devez le faire, cela réduit le risque de problèmes, ce qui est une bonne pratique d'ingénierie.
De plus, la dernière spécification HTML 5.1 WG indique actuellement (gardez à l'esprit que c'est un travail en cours et peut encore changer).
http://www.w3.org/html/wg/drafts/html/master/sections.html#the-body-element
C'est un peu subtil. Vous pouvez omettre le corps et la tête, et le navigateur déduira alors où ces éléments doivent être insérés. Cela comporte le risque de ne pas être explicite, ce qui pourrait prêter à confusion.
Donc ça
résulte que l'élément de script est un enfant de l'élément corps, mais cela
entraînerait la balise de script étant un enfant de l'élément head.
Vous pourriez être explicite en faisant cela
et ensuite, selon ce que vous avez en premier, le script ou le h1, ils apparaîtront tous les deux de manière prévisible dans l'élément body. Ce sont des choses faciles à ignorer lors de la refactorisation et du débogage du code. (par exemple, vous avez JS qui recherche le 1er élément de script dans le corps - dans le deuxième extrait, il cesserait de fonctionner).
En règle générale, être explicite sur les choses vaut toujours mieux que de laisser les choses ouvertes à l'interprétation. À cet égard, XHTML est meilleur car il vous oblige à être complètement explicite sur la structure de votre élément dans votre code, ce qui le rend plus simple et donc moins sujet à une mauvaise interprétation.
Alors oui, vous pouvez les omettre et être techniquement valide, mais il est généralement imprudent de le faire.
la source
<!DOCTYPE html>
.Firebug le montre correctement car votre navigateur corrige automatiquement le mauvais balisage pour vous. Ce comportement n'est spécifié nulle part et peut (variera) d'un navigateur à l'autre. Ces balises sont requises par le DOCTYPE que vous utilisez et ne doivent pas être omises.
L' élément html est l'élément racine de chaque page html. Si vous regardez la description de tous les autres éléments, cela indique où un élément peut être utilisé (et presque tous les éléments nécessitent soit la tête, soit le corps).
la source
<title>
après a<p></p>
, par exemple.)