2010-07-03 4 views
3

Предполагается, что свойство «белого пространства» CSS может влиять на пробелы между элементами блока?Свойство «пробел» между блоками

Например, в документе используется в качестве примера в «Whitespace in the DOM» следующим образом, существует пробел между </h1> и <p>:

<!-- My document --> 
<html> 
<head> 
    <title>My Document</title> 
</head> 
<body> 
    <h1>Header</h1> 
    <p> 
    Paragraph 
    </p> 
</body> 
</html> 

Этот пробел обычно удаляется; например, the XHTML spec says that a conforming user agent must meet all of the following criteria:

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

  • Все пробельные окружающие блоковые элементы должны быть удалены.
  • Ведущее и конечное пробелы внутри элемента блока должно быть удалено.
  • Линейные символы в блочном элементе должны быть преобразованы в пробе (за исключением случаев, когда атрибут «xml: space» установлен в «сохранить»).
  • Последовательность символов пробела должна быть уменьшена до одного пробела. символ (кроме случаев, когда атрибут 'xml: space' имеет значение 'preserve').

Мои вопросы заключаются в следующем:

  • Если я использую CSS white-space property на <body>, это должно быть в состоянии сохранить пробелы между элементами блока (например, между </h1> и <p>) ? Или пробелы между блоками всегда удаляются, а свойство white-space влияет только на пробелы внутри блоков?

  • Спецификация XHTML говорит, что <body>cannot directly contain PCDATA (т. Е. Текст). Означает ли это, что пробел (являющийся своего рода текстом), являющийся прямым потомком тега <body>, всегда незначителен/проигнорирован и не может быть активирован с помощью CSS? Если да и пробелы между </h1> и <p> в приведенном выше примере были проигнорированы, потому что это прямой дочерний элемент <body>, было бы/должно быть, что пробел все равно будет проигнорирован, если в <body> есть <div style="white-space: pre"> и включающий все остальные элементы?

  • The 'white-space' processing model начинается с: «Любой текст, который содержится непосредственно внутри элемента блока (не внутри встроенного элемента), должен рассматриваться как анонимный встроенный элемент». Что я должен понимать о чистом пробеле (пробелы без текста)?

  • Есть ли правило (и если да, где это правило определено) об удалении пробелов внутри встроенных элементов? Например, в следующей последовательности <p>The <strong> lazy </strong> dog.</p> следует удалить пробелы после тега <strong>?(Спецификация HTML 4 имеет a rule about this for line breaks; мне было интересно, применимо ли это правило к другим белым строкам без строки и относится ли это правило/определено/разрешено/принято в любой спецификации XHTML или CSS.)

ответ

1

Ваши вопросы наверняка заглянули в мое любопытство. Я могу надеяться пролить свет на них.

В XHTML schema состояния следующие три элемента, как preserve:

  • STYLE
  • SCRIPT
  • PRE

Это означает, что все остальные элементы контейнера должны быть подавлены пробельные вокруг них. Ваша ссылка Mozilla ("Whitespace in the DOM") говорит:

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

Это становится очевидным при выполнении теста страницы с большим количеством пробелов и перерывов. Просмотр сгенерированного кода (Вы можете сделать это с помощью Web Developer панели инструментов: выберите View Source - Просмотра сгенерированного Источник) раскрывает, что «текстовое содержимое» означает, что все внутри HTML корневой тег. Таким образом, другими словами, на самом внешнем теге есть только подавление пробелов (HTML).

Запуск той же страницы в IE8 говорит немного другая история (просмотреть сгенерированный источник, нажав F12 и в инструментах разработчика, нажмите CTRL - G). Они также не на 100% совместимы, но более совместимы, чем Firefox. Они подавляют не только элемент HTML, но и многое другое (как и должно). Они прислушались к правилам SCRIPT и STYLE: preserve, но все же оставляет разрыв между ними. В теле он заменил несколько разрывов одиночными перерывами. Вложенные теги DIV (и текст их содержимого) в одной строке были разделены разрывами.

Короче говоря, как Firefox, так и IE8 не являются соответствующими пользовательскими агентами.

И нет, вы не можете подавить пробел между двумя тегами с свойством white-space (вы, вероятно, могли бы сделать это с помощью JavaScript/jQuery, если вы действительно этого захотели). Свойство white-space указывает, как обрабатывать пробелы в части содержимого элемента (например, white-space: nowrap предотвращает обертку текста).

+0

Я думаю, что пробел между двумя блоками должен быть автоматически подавлен (но я не уверен, какой spec указывает это). Мне было интересно, было ли свойство белого пространства иметь возможность сохранять/отображать пробелы между блоками (это обычно сжимается). – ChrisW

+0

Да, согласно схеме, пробелы между двумя блоками должны быть подавлены, но это не связано с тем, что решение Mozilla не следует схеме.Если бы они следовали схеме, свойство 'white-space' сохранил бы это пробел, если бы два блока были обернуты элементом с« белым пространством », установленным в' pre' (например, элементом 'PRE'). –

+0

У меня создается впечатление, что, может быть, в соответствии с современными спецификациями (например, спецификацией XHTML v2) никакие пробелы никогда не удаляются парсером из DOM, а вместо этого он всегда находится в DOM, и либо отображается, либо нет в соответствии с Настройка белого пространства CSS. – ChrisW

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