web-dev-qa-db-fra.com

Pourquoi HTML exige-t-il que plusieurs espaces apparaissent comme un seul espace dans le navigateur?

Je reconnais depuis longtemps que tout ensemble d'espaces dans un fichier HTML ne sera affiché que comme un seul espace. Par exemple, ceci:

<p>Hello.        Hello. Hello. Hello.                       Hello.</p>

s'affiche comme:

Bonjour. Bonjour. Bonjour. Bonjour. Bonjour.

C'est parfaitement bien, car si vous avez besoin de plusieurs espaces de texte pré-formaté, vous pouvez simplement utiliser la balise <pre>. Mais quelle en est la raison? Plus précisément, pourquoi est-ce dans la spécification pour HTML?

47
Rudd Zwolinski

Les espaces sont compactés en HTML car il existe une distinction entre la façon dont HTML est formaté et la façon dont il doit être rendu. Considérez une page comme celle-ci:

<html>
    <body>
        <a href="mylink">A link</a>
    </body>
</html>

Si le HTML était indenté en utilisant des espaces par exemple, le lien serait précédé de plusieurs espaces.

38
tristan

Pour essayer de répondre au "pourquoi", cela peut être dû au fait que HTML était basé sur SGML qui l'avait spécifié de cette façon. Il était à son tour basé sur GML du début des années 60. La raison de la gestion des espaces blancs pourrait très bien être due au fait que les données étaient entrées une "carte" à la fois à l'époque, ce qui pouvait entraîner une rupture indésirable des phrases et des paragraphes. Une différence dans l'ancien GML est qu'il spécifiait qu'il doit y avoir deux espaces entre les phrases (comme les anciennes règles de machine à écrire) qui peuvent avoir établi un précédent selon lequel les espaces sont indépendants du balisage.

17
Turnkey

Comme d'autres l'ont dit, c'est dans la spécification HTML.

Si vous souhaitez conserver des espaces en sortie, vous pouvez utiliser la balise <pre> :

<pre>This     text has              extra spaces

and

    newlines</pre>

Mais cela affichera également généralement le texte dans une police différente.

15
Zach Hirsch

"Pourquoi les espaces multiples sont-ils convertis en espaces simples?"

Premièrement, il est difficile de répondre aux questions "pourquoi". C'est dans la spécification. C'est à peu près la fin.

Considérez qu'il existe plusieurs types d'espaces blancs.

  • Espace blanc entre les balises. <p>\n<b>hi</b>\n</p>

  • Espace blanc dans le contenu d'une balise. <p>Hi <i>everyone</i>.</p>

  • Espace blanc dans un <pre> ou section CDATA.

Les deux premiers sont difficiles à distinguer. L'espace entre les balises, même en XML, est "facultatif". Mais quand vous avez ce qu'on appelle un "modèle de contenu mixte" - des balises mélangées avec du contenu - la subtilité de "entre balises" et "dans le contenu mais entre balises" et "dans le contenu mais pas entre balises" est impossible à démêler.

Donc, ils ne trient pas. L'espace entre les balises et l'espace dans le contenu est facultatif.

12
S.Lott

Non seulement il est dans lespécification , mais il a un certain sens. Si les espaces n'étaient pas compactés, vous devriez mettre tous vos fichiers HTML sur une seule ligne. donc quelque chose comme ça:

<div>
    <h1>Title</h1>
    <p>
       This is some text
       <a href="#">Read More</a>
    </p>
</div>

Aurait un étrange alignement avec des espaces partout. La seule façon de bien faire les choses serait de compacter ce code, ce qui serait difficile à maintenir.

11
enobrev

Si les navigateurs ne le faisaient pas, il pourrait être difficile de formater votre code HTML pour le rendre facilement lisible. Par exemple, vous souhaiterez peut-être formater votre code comme ceci:

<html>
<body>
    <div>
        I like to indent all content that is inside div tags.
    </div>
</body>
</html>

Si le navigateur n'ignore pas les huit espaces environ avant le texte à l'intérieur de la balise div, votre page Web risque de ne pas ressembler à ce que vous souhaitiez.

7
Michael

Habituellement, ces décisions de conception ne sont documentées dans aucune spécification et ne peuvent être glanées qu'à partir d'archives de discussion de groupe de travail qui se trouvent être accessibles au public, ou expliquées par les auteurs des spécifications eux-mêmes. Cependant, dans ce cas particulier, HTML 3.2 indique ce qui suit:

Sauf dans le texte littéral (par exemple l'élément PRE), HTML traite les séquences contiguës de caractères d'espacement comme équivalentes à un seul caractère d'espace (ASCII décimal 32). Ces règles offrent aux auteurs une flexibilité considérable lors de la modification directe du texte annoté. Notez que les futures révisions de HTML peuvent permettre l'interprétation du caractère de tabulation horizontale (ASCII décimal 9) par rapport à une règle de tabulation définie par une feuille de style associée.

Le comportement que vous voyez aujourd'hui est bien sûr beaucoup plus compliqué que ce qui était spécifié dans HTML 3.2, mais je pense que le raisonnement s'applique toujours. Un exemple où cette flexibilité peut être utile est lorsque vous avez un long paragraphe que vous avez l'intention de boucler et de mettre en retrait:

<H1>Lorem ipsum</H1>
<P>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fastidii oportere
   consulatu no quo. Vix saepe labores an, pri illud mentitum et, ex suas quas
   duo. Sit utinam volutpat ea, id vis cibo meis dolorum, eam docendi
   accommodare voluptatibus no. Id quaeque electram vim, ut sed singulis
   neglegentur, ne graece alterum has. Simul partiendo quaerendum et his.

Si les espaces blancs n'étaient pas réduits, vous vous retrouveriez avec un paragraphe avec des espaces inhabituellement grands où le texte est enveloppé en raison de l'indentation.

Aucune autre spécification HTML ne suggère un quelconque raisonnement derrière cette décision de conception. En particulier HTML 4 ne décrit que le comportement de l'effondrement, et HTML5 et la spécification vivante s'en remettent tous les deux à CSS, qui n'explique rien non plus . Les versions antérieures de HTML ne contiennent également aucune explication, bien que l'extrait suivant apparaisse dans un exemple d'extrait dans HTML 2. :

<OL>
...
  <UL COMPACT>
  ...
  <LI> Whitespace may be used to assist in reading the
       HTML source.
  </UL>
...
</OL>
4
BoltClock

C'est dans la spécification HTML. C'est la partie sur les espaces inter-mots rendus comme un espace ASCII.

http://www.w3.org/TR/html401/struct/text.html

3
Chris Farmer

C'est simple, c'est dans la spécification.

D'après la spécification HTML, section 9.1 :

En particulier, les agents utilisateurs doivent réduire les séquences d'espaces blancs d'entrée lors de la production d'espace inter-mots de sortie.

3
casperOne

Pour répondre pourquoi est-ce dans la spécification pour HTML? vous devez considérer les origines du HTML.

Tim Berners-Lee a conçu HTML pour le partage de documents scientifiques. Il l'a basé sur des idées de syntaxe préexistantes dans SGML, qui a également des traitements similaires de l'espace blanc.

On peut imaginer que les premiers auteurs de HTML au CERN l'ont fait sans l'aide des outils WYSIWYG, et donc la possibilité de traiter les espaces blancs de cette manière facilite la lisibilité de ces fichiers sources manuscrits.

3
Paul Dixon

La définition/spécifications de HTML a clairement indiqué d'ignorer les espaces blancs excédentaires.

Si vous souhaitez inclure des espaces supplémentaires, utilisez soit le <pre> tag ou &nbsp;

2
TheTXI

Il y a aussi une réponse typographique: les mots et les phrases ne doivent avoir qu'un seul espace entre eux, indépendamment de ce que votre professeur de dactylographie à l'école peut vous avoir dit.

tilisez un espace entre les phrases

tilisez un seul espace de mots entre les phrases

2
Barry Brown