2014-10-30 1 views
0

В соответствии с CSS Specification анонимные блок-блоки создаются, когда поле блока контейнера имеет как встроенное, так и блочное содержимое.CSS: Когда пустые анонимные блоки блокированы?

В примере спецификация использует это

<DIV> 
Some text 
<P>More text</P> 
</DIV> 

Хром делает это как: Some text More text

Однако, учитывая:

<DIV> 
[5 spaces followed by newline] 
<P>Some text</P> 
</DIV> 

Хром делает это как: Some text

Другими словами, строка, содержащая пробелы, исключается.

Я смущен о порядке создания анонимных блоков блоков и порядке, в котором применяется CSS white-space specification.

а) Если предположить, что структурный блок анонимного создан первым, мы имеем

<DIV> 
<anonymous_block>[5 spaces followed by newline]</anonymous_block> 
<P>Some text</P> 
</DIV> 

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

c) Это правило заставляет исключить пространство: «Если пробел (U + 0020) в конце строки имеет« белое пространство », установленное на« нормальный »,« nowrap »или« pre » -line ', он также удаляется. "

d) В этой точке мы имеем линию нулевой ширины, но ее высота (если я правильно понимаю модель css) - это шрифт.

Поэтому я ожидаю, что перед текстом появится пустая строка с высотой шрифта.

Поскольку это не так, какой из приведенных выше шагов неверен? Пожалуйста, укажите, как спецификация CSS приводит к наблюдаемому поведению.

+0

Я не думаю, что у него что-то есть для использования спецификаций CSS. Это способ анализа HTML: любое пространство или новая строка два блока будут проигнорированы, если только оба из них не являются встроенными блоками. – Borgtex

ответ

1

Я считаю, что ответ находится в this части спецификации CSS2, который гласит:

«Линейные блоки создаются по мере необходимости, чтобы удерживать содержимое строкового уровня в пределах контекста строкового форматирования.Линейные поля, которые не содержат текста, не сохраняют пробел, не имеют встроенных элементов с ненулевыми полями, дополнением или границами и никаким другим содержимым в потоке (например, изображениями, встроенными блоками или встроенными таблицами) и не заканчиваются сохранившаяся новая линия должна рассматриваться как линейные коробки нулевой высоты для целей определения положений любых элементов внутри них и должна рассматриваться как не существующая для каких-либо других целей ».

В приведенном выше параграфе объясняется наблюдаемое поведение [Существует также другая часть спецификации, на collapsing margins, которая относится к вышеуказанному абзацу. Я упоминаю об этом, потому что читатели, которые сталкиваются с этим ответом, могут оказаться полезными.]

+1

Это правильно. Обратите внимание, что это имеет несколько связанных эффектов, например, при плавании (поэтому удаление из потока) единственного содержимого строки или установки замененного встроенного элемента на 'display: block', который часто используется для удаления пробела под изображениями. – Alohci

1

В контексте block пробелы игнорируются.

В контексте inline или inline-block пробелы обрезаются до одного места.

Итак, ваши 5 символов пробела и символ новой строки не вызывают создание анонимного блока, поскольку <p> устанавливает внутреннюю часть <div> в контексте блока

О вашем вопросе. Я думаю, что шаг а) неверен. Кажется, что этапы называются в другом порядке и тем самым изменяют интерпретацию.

+0

Не могли бы вы указать, где это указано в спецификации CSS? – bright

+0

К сожалению, я не могу. Это вопрос моего опыта. – HerrSerker

+0

Спецификация CSS объясняет это поведение здесь: http://www.w3.org/TR/CSS21/visuren.html#anonymous-block-level – highvolt

Смежные вопросы