web-dev-qa-db-ja.com

HTMLでは、ブラウザで複数のスペースを単一のスペースとして表示する必要があるのはなぜですか?

私は長い間、HTMLファイル内の空白のセットは単一のスペースとしてのみ表示されることを認識してきました。たとえば、これ:

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

次のように表示されます:

こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。

事前にフォーマットされたテキストの複数のスペースが必要な場合は、単に<pre>タグを使用できるため、これはまったく問題ありません。しかし、その理由は何ですか?より正確には、なぜHTMLの仕様にこれがあるのですか?

47
Rudd Zwolinski

HTMLでは、HTMLのフォーマット方法とレンダリング方法に違いがあるため、スペースは圧縮されます。このようなページを考えてみましょう:

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

たとえば、HTMLがスペースを使用してインデントされている場合、リンクの前にいくつかのスペースがあります。

38
tristan

「なぜ」に対処しようとするのは、HTMLが [〜#〜] sgml [〜#〜] に基づいていたためかもしれません。 60年代前半の [〜#〜] gml [〜#〜] に基づいていました。空白処理の理由は、データがその時点で1枚の「カード」に入力されたため、文や段落が不必要に分割される可能性があるためです。古いGMLの違いの1つは、スペースがマークアップに依存しないという前例を確立している可能性がある(古いタイプライタールールのように)文間に2つのスペースが必要であることを指定したことです。

17
Turnkey

他の人が言ったように、それはHTML仕様にあります。

出力で空白を保持する場合は、 <pre>タグ を使用できます。

<pre>This     text has              extra spaces

and

    newlines</pre>

ただし、これにより、通常、テキストは別のフォントで表示されます。

15
Zach Hirsch

「複数のスペースが単一のスペースに変換されるのはなぜですか?」

まず、「なぜ」質問に答えるのは難しいです。それは仕様にあります。これでほぼ終わりです。

空白にはいくつかの種類があることを考慮してください。

  • タグ間の空白。 <p>\n<b>hi</b>\n</p>

  • タグ内のコンテンツ内の空白。 <p>Hi <i>everyone</i>.</p>

  • <pre>またはCDATAセクションの空白。

最初の2つを区別するのは困難です。 XMLであっても、タグ間の空白は「オプション」です。しかし、「混合コンテンツモデル」と呼ばれるもの(コンテンツと混合されたタグ)がある場合、「タグ間」と「コンテンツ内だがタグ間」および「コンテンツ内だがタグ間ではない」という微妙なことは不可能です。整理する。

だから彼らはそれを整理しません。コンテンツ内のタグと空白の間の空白はすべてオプションです。

12
S.Lott

thespecification にあるだけでなく、意味があります。スペースが圧縮されていない場合、すべてのhtmlを1行に配置する必要があります。このようなもの:

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

いたるところにあるスペースとの奇妙な整列があるでしょう。それを正しくする唯一の方法は、そのコードを圧縮することであり、これは維持するのが難しいでしょう。

11
enobrev

ブラウザがこれを行わなかった場合、HTMLコードをフォーマットして読みやすくすることは困難です。たとえば、次のようにコードをフォーマットできます。

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

ブラウザがdivタグ内のテキストの前の8個程度のスペースを無視しない場合、Webページは意図したとおりに表示されない場合があります。

7
Michael

通常、これらの設計決定はどの仕様にも文書化されておらず、たまたま公開されているワーキンググループディスカッションアーカイブから収集するか、仕様作成者自身が説明します。ただし、この特定のケースでは、 HTML 3.2 は次のように述べています。

リテラルテキスト(例:PRE要素)を除き、HTMLは空白文字の連続したシーケンスを単一のスペース文字(ASCII 10進数32)と同等のものとして扱います。これらの規則により、作成者はマークアップされたテキストを直接編集する際にかなりの柔軟性を得ることができます。 HTMLの将来の改訂では、関連するスタイルシートで定義されたタブルールに関して、水平タブ文字(ASCII 10進数9)の解釈が可能になることに注意してください。

今日の動作は、もちろんHTML 3.2で指定された動作よりもはるかに複雑ですが、その理由はまだ当てはまると思います。この柔軟性が役立つ一例は、ハードラップしてインデントする長い段落がある場合です。

<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.

空白が折りたたまれていない場合、インデントによりテキストがハードラップされる非常に大きなギャップのある段落になります。

他のHTML仕様では、この設計決定の背後にある何らかの推論を示唆していません。特に、 HTML 4 は折りたたみ動作のみを説明し、HTML5とリビングスペックは両方ともCSSに準拠します- 何も説明しません HTMLの以前のバージョンにも説明はありませんが、次の抜粋は HTML 2. のスニペットの例に含まれています。

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

HTML仕様にあります。これは、ASCIIスペースとして表現される単語間スペースに関する部分です。

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

3
Chris Farmer

シンプル、仕様にあります。

HTML仕様から セクション9.1

特に、ユーザーエージェントは、出力の単語間スペースを生成するときに、入力の空白シーケンスを折りたたむ必要があります。

3
casperOne

なぜHTMLの仕様にこれがあるのですか?と答えるには、HTMLの起源を考慮する必要があります。

Tim Berners-Leeは、科学文書を共有するためのHTMLを設計しました。彼は、SGMLの既存の構文のアイデアにもとづいており、SGMLにも同様の空白の処理があります。

CERNのHTMLの以前の作者はWYSIWYGツールの助けを借りずにそうしていたので、このように空白を処理する能力はそのような手書きソースファイルの読みやすさを助けると想像できます。

3
Paul Dixon

活版印刷の答えもあります:学校のタイピング教師があなたに言ったことに関係なく、単語と文の間には1つのスペースのみが必要です。

文の間にスペースを1つ使用する

文の間に単一の単語スペースを使用する

2
Barry Brown