Почему HTML требует, чтобы несколько пробелов отображались в браузере как один пробел? - PullRequest
46 голосов
/ 11 января 2009

Я давно понял, что любой набор пробелов в файле HTML будет отображаться только как один пробел. Например, это:

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

отображается как:

Hello. Привет. Привет. Привет. Здравствуйте.

Это отлично, так как если вам нужно несколько мест предварительно отформатированного текста, вы можете просто использовать тег

Но в чем причина? Точнее, почему это в спецификации для HTML? 

Ответы [ 12 ]

37 голосов
/ 11 января 2009

Пробелы сжаты в HTML, потому что есть различие между тем, как HTML отформатирован и как он должен быть представлен. Рассмотрим страницу, подобную этой:

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

Если HTML-код был отступ с использованием пробелов, например, ссылке будет предшествовать несколько пробелов.

17 голосов
/ 11 января 2009

Попытаться ответить на вопрос «почему» может быть потому, что HTML основан на SGML , который определил его таким образом. Это в свою очередь основывалось на GML с начала 60-х годов. Причиной обработки пробелов вполне может быть то, что данные вводились по одной «карточке» за раз, что могло привести к нежелательному разбиению предложений и абзацев. Одно из отличий старого GML состоит в том, что в нем указано, что между предложениями должно быть два пробела (как в старых правилах пишущей машинки), что могло бы предвосхитить, что пробелы не зависят от разметки.

15 голосов
/ 11 января 2009

Как уже говорили другие, это в спецификации HTML.

Если вы хотите сохранить пробелы в выводе, вы можете использовать

 tag</a>:</p>

<pre><code><pre>This     text has              extra spaces

and

    newlines

Но это также обычно отображает текст другим шрифтом.

12 голосов
/ 11 января 2009

"Почему несколько пробелов преобразуются в один пробел?"

Во-первых, на вопросы «почему» трудно ответить. Это в спецификации. Это в значительной степени конец.

Учтите, что существует несколько видов пробелов.

  • Пробел между тегами. <p>\n<b>hi</b>\n</p>

  • Пробел в содержимом тега. <p>Hi <i>everyone</i>.</p>

  • Пробел в секции <pre> или CDATA.

Первые два трудно различить. Пробелы между тегами, даже в XML, являются «необязательными». Но когда у вас есть то, что называется «моделью смешанного контента» - теги, смешанные с контентом, - тонкость «между тегами» и «в контенте, но между тегами» и «в контенте, но не между тегами» невозможна. перебрать.

Так что они не разбираются. Пробелы между тегами и пробелами в контенте необязательны.

11 голосов
/ 11 января 2009

Мало того, что спецификация , но в этом есть некоторый смысл. Если бы пробелы не были уплотнены, вам бы пришлось поместить все ваши html в одну строку. так как то так:

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

Было бы странное выравнивание с пробелами повсюду. Единственный способ сделать это правильно - сжать этот код, который будет сложно поддерживать.

7 голосов
/ 11 января 2009

Если браузеры этого не делают, может быть сложно отформатировать HTML-код, чтобы сделать его легко читаемым. Например, вы можете отформатировать код следующим образом:

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

Если браузер не игнорирует восемь или около того пробелов перед текстом внутри тега div, ваша веб-страница может выглядеть не так, как вы предполагали.

4 голосов
/ 02 августа 2017

Обычно эти проектные решения не документированы ни в одной спецификации и могут быть получены только из архивов обсуждений рабочей группы, которые оказались общедоступными или объяснены самими авторами спецификаций. Однако в данном конкретном случае HTML 3.2 указывает следующее:

За исключением литерального текста (например, элемента PRE), HTML обрабатывает непрерывные последовательности символов пробела как эквивалент одного символа пробела (десятичный код ASCII 32). Эти правила предоставляют авторам значительную гибкость при непосредственном редактировании размеченного текста. Обратите внимание, что в будущих версиях HTML может учитываться интерпретация символа горизонтальной табуляции (десятичный ASCII 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.0 :

<OL>
...
  <UL COMPACT>
  ...
  <LI> Whitespace may be used to assist in reading the
       HTML source.
  </UL>
...
</OL>
3 голосов
/ 11 января 2009

Чтобы ответить , почему это указано в спецификации для HTML? Вы должны рассмотреть происхождение HTML.

Тим Бернерс-Ли разработал HTML для обмена научными документами. Он основывал его на уже существующих синтаксических идеях в SGML, который также имеет аналогичные методы обработки пробелов.

Можно предположить, что более ранние авторы HTML в CERN делали это без помощи инструментов WYSIWYG, и поэтому способность обрабатывать пробелы таким образом помогает удобочитаемости таких рукописных исходных файлов.

3 голосов
/ 11 января 2009

Простой, это в спецификации.

Из спецификации HTML, раздел 9.1 :

В частности, пользовательские агенты должны свернуть входные последовательности пробелов при выводе промежуточного слова пространство.

3 голосов
/ 11 января 2009

Это в спецификации HTML. Это часть про межсловные пространства, которые отображаются как ASCII-пространство.

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

...