web-dev-qa-db-fra.com

L'imbrication <p> ne fonctionnera pas pendant l'imbrication <div>?

Je ne vais généralement pas imbriquer <p> comme ça:

<p>The following:
    <p>one</p>
    <p>two</p>
</p>

et je vais imbriquer comme ça en utilisant <div> au lieu. Mais aujourd'hui, j'ai utilisé <p> mais il semble que Emacs et Google Chrome les deux considéreraient le <p> fermé dès qu'il voit un nouveau <p> a démarré. (le DOCTYPE est HTML 4.01 Strict).

J'ai pensé <p> n'est rien de plus qu'un <div> mais juste avec une marge et un rembourrage prédéfinis, mais est-il vrai que <p> ne peut pas être imbriqué? Si oui, quelle règle dit que ce n'est pas possible?

44
nonopolarity

Parce qu'un paragraphe est un paragraphe .. et c'est ainsi que HTML est défini (et HTML n'est pas XML).

Tout <p> (ou autre élément de niveau bloc) fermera implicitement tout ouvert <p>.

Par 9.3.1 Paragraphes: l'élément P de la spécification HTML 4.01:

L'élément P représente un paragraphe. Il ne peut pas contenir des éléments de niveau bloc (y compris P lui-même).


Notez que c'est comment le HTML est analysé et que même un <div> aurait implicitement fermé le paragraphe!

Cependant, un <span> avec display:block; n'aurait pas fermé le <p> comme un <span> n'est pas un élément de niveau bloc.

Autrement dit, le CSS est non pertinent à ce stade du traitement HTML et le CSS est non pertinent au DOM/analyseur lors de la détermination si un élément est un élément de niveau bloc ou non. Considérez le cas lorsque le CSS est appliqué dynamiquement ou via une feuille de style pas encore chargée: le CSS appliqué ne modifie pas le DOM.


Bien que la spécification HTML5 (working-draft) n'inclue pas le langage ci-dessus dans la spécification HTML4, elle continue à définir un paragraphe comme un conteneur pour phasing content et a en outre un section sur les paragraphes .

La réponse acceptée à Liste des éléments HTML5 pouvant être imbriqués dans l'élément P? dit que <p> les éléments ne peuvent pas être imbriqués dans HTML5. La phrase clé de la documentation est: "Exécutions de contenu de phrasé [qui n'inclut pas <p> elements] forment des paragraphes ". De plus, HTML5, essayant d'être rétrocompatible à bien des égards, a une justification sur " Restrictions sur les modèles de contenu et sur les valeurs d'attribut " :

Certains éléments sont analysés de manière quelque peu excentrique (généralement pour des raisons historiques) , et leurs restrictions de modèle de contenu visent à éviter d'exposer l'auteur à ces problèmes.

Ce comportement est référencé à partir de ne entrée wiki WG HTML5 sur le contenu du flux :

Les restrictions de HTML5 sur l'imbrication des éléments p et sur ce que les éléments p peuvent contenir sont dues à: "particularités de l'analyseur" qui provoque la fermeture automatique de p ..

64
user166390

À partir de la section 9.3.1 de la spécification HTML 4.01

L'élément P représente un paragraphe. Il ne peut pas contenir d'éléments de niveau bloc (y compris P lui-même).

11
Antimony