Вопрос по html, whitespace – Когда пробелы имеют значение в HTML?

27
пример 1
onetwo


    one
    two

​

В первом div нет пробела между двумя кнопками, во втором есть.

Теперь давайтеРассмотрим другой пример:

пример 2
a
 b​​​​​​​​​​​​

Там нет места до этого.b

пример 3
a bold man

Теперь пробел передbold является значительное

пример 4
a  bold man

Теперь только один из пробелов (после "а" или раньшесмелый") является значительным.

вопрос

Каковы точные правила, когда пробелы удаляются или разрушаются?

Вопрос касается только того, как HTML отображается в браузере? Или речь идет о спецификации или о том, как API разбора HTML справляется с пробелами? Matt Fenwick
@MattFenwick: в основном касается того, как его отображает браузер. Я'Я конвертирую HTML в другой язык, и я хочу, чтобы он выглядел более или менее одинаково. mpen
Я удалил свой ответ, так как это было чрезмерное упрощение. Юкка К. Корпела и Алохчи обратились к более сложным частям. BoltClock

Ваш Ответ

3   ответа
12

Реальность несколько сложна. Есть две части

Что делает разборЧто делает рендеринг

Разбор фактически удаляет очень мало пустого пространства при разборе текста (в отличие от разметки). Будетудалить начальный символ перевода строки в начале а также

 элементы а также на инвалида элемент, но этооб этом.

Юкка ссылается на раздел HTML 4.01B.3.1 Разрывы строк говоря это "разрыв строки, следующий сразу за начальным тегом, должен игнорироваться, как и разрыв строки непосредственно перед конечным тегом " но это в ненормативном приложении, и браузеры не следуют ему за исключением трех элементов, упомянутых выше.

Это можно продемонстрировать с помощью Jukka 'пример сВот на разрывы строк без пробелов. Обратите внимание#text: узлы вокруг элементов кнопки в дереве отображаются, и если разрывы строк удаляются, то '#text: `узлы больше не появляются.

Мы также можем видеть, что правило не применяется, используя этот первый пример из спецификации.Вот, Добавляяdisplay:pre Это'Ясно, что разрывы строк не совсем игнорируются, но что рендеринг двух примеров одинаков, является просто свойством обработки пробелов по умолчанию, являющейсяwhite-space:normal

Что приводит нас к соответствующей спецификации, которая16.6.1бело-пространство» модель обработки в спецификации CSS. Это охватывает систематические правила, которые должны применяться к текстовым символам для каждого из значений настройки пробела.

Приложение B спецификации HTML 4.01 действительно информативно, но как говорится: «все требования в этом разделе приведены в других разделах спецификации »., В базовом предложении о соответствии говорится, что HTML-документы являются документами SGML, а принцип игнорирования разрывов строк в определенных условиях является частью стандарта SGML, поэтому является нормативным. Но HTML никогда не был реализован как приложение SGML; и эта часть также почти полностью игнорировалась поставщиками браузеров. Jukka K. Korpela
6

Полный ответ на вопрос «Когда пробелы имеют значение в HTML? » будет довольно длинным и подробным, и потребуется обсудить такие вещи, как пробел между спецификациями атрибутов и элементами с помощью специальных правил, таких какtextarea, Но адрес, который кажется главной заботой:

Пробелы между тегами обычно создают анонимные текстовые узлы. Пробелы внутри конечных элементов (элементов, не содержащих других элементов) составляют часть текстового содержимого элемента.

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

Если есть пробелы между элементами, которые отображаются встроенными (например,button элементы по умолчанию), он обычно действует как разделитель, эквивалентный одному пробелу.

Тем не менее, пробел, состоящий из одного переноса строки игнорируется,по спецификациям и обычно в браузерной практике,когда он сразу следует за начальным тегом или предшествует конечному тегу. Так


one
two

будет рассматриваться как если бы разрывы строк не было. Но когда используются пробелы, как в


  one
  two

тогда есть анонимные текстовые узлы перед первымbutton элемент и между двумяbutton элементы. Обычно имеет значение только последнее, и оно действует как обычное пространство слов.

Обновить: Как комментарий ниже и Alohci ’В ответ на это, этот старый (HTML 4.01) принцип в основном не реализован в браузерах и в основном удален в HTML5. Поэтому в большинстве случаев разрыв строки между элементами создает текстовый узел, содержащий символ перевода строки, который рассматривается как эквивалент пробела.

Я исправлен и внесу некоторые исправления в свой ответ (выигралОднако удалите его, поскольку некоторые пункты действительны, а неправильные точки указаны в другом ответе). Jukka K. Korpela
Ваше утверждение и два примера о том, что игнорируется один разрыв строки, неверно для последних версий Chrome, Firefox или Opera или IE8 или IE10:jsbin.com/eKAzUfI/1 (источник). Интересно, этоявляется правильно для IE6 (!) и IE9. Я не't тест IE7. Я также тестировал автономный файл на случай, если что-то будет в JSBin 's CSS по умолчанию, но результаты были такими же. T.J. Crowder
5

HTML сворачивает серийные пробелы в один пробел, но неЯ не могу это устранить. Новая строка - это пробел, поэтому пробел.

Это's не просто начальный / конечный - последовательные пробелы внутри элемента также отображаются как единые пробелы. Они будут отображаться одинаково:

   a   b   
 a b 
a b
Рушится довольно просто,Обрезка, которая касается меня :) mpen
На самом деле, разрушение немного сложнее, чем это. Последовательные / последовательные пробелы между встроенными элементами также свернуты. mpen

Похожие вопросы