Подтвердить что ты не робот

Дисплей: блок внутри дисплея: встроенный

Я хочу понять, что происходит, когда элемент с CSS display:block является дочерним элементом DOM элемента, CSS которого display:inline (так что элемент блока является дочерним элементом встроенного элемента).

Эти сценарии описаны в разделе Анонимные блок-блоки для спецификации CSS 2.1: пример включает следующие правила...

body { display: inline }
p    { display: block }

... и в сопроводительном тексте говорится...

Элемент BODY содержит кусок (C1) анонимного текста, за которым следует элемент уровня блока, за которым следует другой фрагмент (C2) анонимного текста. Результирующие поля будут анонимный блок-блок вокруг BODY, содержащий анонимный блок-блок вокруг C1, блок блока P и другой анонимный блок-блок вокруг C2.

Если у вас есть родительский элемент display:inline, и если у этого родителя есть дочерний элемент, который является display:block, то существование этого ребенка, по-видимому, приводит к тому, что родительский почти ведет себя как display:block, и игнорировать тот факт, что он определен как display:inline (в том, что родительский элемент теперь содержит только анонимные и не анонимные дочерние блоки, т.е. больше не содержит встроенных дочерних элементов)?

Мой вопрос в этом сценарии (где есть дочерний элемент display:block), каковы различия между родительским, определяемым display:inline вместо display:block?


Изменить: мне больше интересно понимать стандарт CSS 2.1, чем в том, как и на практике ли применяются различные реализации браузера.


2nd Edit:

Там одна разница, отмеченная в спецификации. В следующем документе граница для абзаца 2-го блока охватывает весь абзац и всю ширину страницы; в то время как граница для 1-го "встроенного абзаца" находится вокруг каждой строки (даже если есть несколько строк) внутри абзаца и не более, чем точная ширина каждой строки (каждая строка короче ширины страницы).

<html>
<head>
<style type="text/css">
p.one 
{
border-style:solid;
border-width:1px;
display: inline;
}
p.two 
{
border-style:solid;
border-width:1px;
}
</style>
</head>
<body>
<p class="one">Some text. <b>Note:</b> The "border-width"
property does not work if it is used alone. Use the
"border-style" property to set the borders first.</p>
<p class="two">Some text.</p>
</body>
</html>

Если я добавлю следующее правило стиля...

b
{
display: block;
}

... тогда "Примечание:" в первом встроенном абзаце становится блоком, который разделяет абзац (согласно спецификациям, первая и последняя часть абзаца теперь находятся в анонимном блоке). Тем не менее, граница вокруг первой и последней части абзаца по-прежнему остается "встроенными" границами: и, тем не менее, это не то же самое, что если p.one был объявлен display:block в первую очередь.

Вот цитата из спецификации, которая гласит:

Свойства, установленные на элементах, которые вызывают анонимные блок-блоки, которые будут сгенерированы по-прежнему применяются к ящикам и контенту этого элемента. Например, если граница была установлена ​​на BODY элемент в приведенном выше примере, граница будет нарисована вокруг C1 (открыто в конце строки) и C2 (open в начале строки).

Является ли свойство border-style единственным типом свойства, в котором разница видна?

4b9b3361

Ответ 1

когда я читаю спецификацию, я нахожу ваш вопрос на самом деле достаточно хорошо ответил:

Когда встроенное поле содержит блок-блок, встроенный блок [...] [] разбит вокруг блока. Ячейки [in] перед перерывом и после разрыва заключены в анонимные поля, а блок-блок становится родным из этих анонимных ящиков.

<BODY style="display: inline; ">
This is anonymous text before the P.
<P>This is the content of P.</P>
This is anonymous text after the P.
</BODY>

Результирующие поля будут анонимным блочным блоком вокруг BODY, содержащим анонимный блок-блок вокруг C1, блок P-блока и еще один анонимный блок-блок вокруг C2.

или, визуально:

+- anonymous block box around body ---+
| +- anonymous block box around C1 -+ |
| |                                 + |
| +---------------------------------+ |
|                                     |
| +- P block box -------------------+ |
| |                                 + |
| +---------------------------------+ |
|                                     |
| +- anonymous block box around C2 -+ |
| |                                 + |
| +---------------------------------+ |
+-------------------------------------+

теперь на ваш вопрос: отличается ли это от <BODY style="display: block; ">?

да, это так. в то время как это все еще 4 блока (анонимный блок-блок вокруг тела, теперь являющийся блоком блока BODY), спецификация сообщает разницу:

Свойства, установленные для элементов, которые вызывают создание анонимных блоков блоков, все еще применяются к полям [сгенерированный анонимный блок] и содержимому этого элемента. Например, если граница была установлена ​​на BODY элемент в приведенном выше примере, граница будет нарисована вокруг C1 (открыто в конце строки) и C2 (открыто в начале строки):

+--------------------------------------
| This is anonymous text before the P. 
+--------------------------------------
  This is the content of P.
 --------------------------------------+
  This is anonymous text after the P.  |
 --------------------------------------+

это отличается от <BODY style="display: block; ">:

+--------------------------------------+
| This is anonymous text before the P. |
|                                      |
| This is the content of P.            |
|                                      |
| This is anonymous text after the P.  |
+--------------------------------------+

Ответ 2

Встроенный контейнер не может содержать контейнер блока. Обычный результат, когда возникает такая вещь, заключается в том, что встроенный контейнер преобразуется в блок, чтобы разместить его содержимое. Если вам нужен контейнер, который появляется в строке, чтобы содержать что-то, что кажется блоком, используйте следующее:

display: inline-block;

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

Это свойство не поддерживается FF2 и в результате не поддерживается браузером Ice Weasel. Почти каждый другой браузер поддерживает это свойство, в том числе IE6, поэтому вы должны быть в порядке, потому что почти никто не использует FF2 или Ice Weasel, за исключением несовершеннолетних пользователей, ограниченных дистрибутивами Linux.

Ответ 3

Иногда это зависит от точного css или браузера.

Чаще всего я видел два поведения:

  • Элемент display:block внутри элемента display:inline делает действие display:inline как a display:block с width:100%.

  • A display:inline элемент, содержащий только элементы display:block float:left или float:right, не занимает места и как бы не содержит внутри него элементов. Элементы display:block действуют так, как если бы они находились внутри другого элемента display:block, иногда с фанковыми действиями в зависимости от position.

Оба position и float заставляют дочерние элементы иногда иметь странное поведение, но избегая их, они работают в общем, как если бы они были inline.

Ответ 4

Я думаю, что я понял разницу, наконец, и есть принципиальная разница.

Когда элемент верхнего уровня (например, <BODY>) определяется с помощью display: block, то:

  • Там есть блок, связанный с элементом

  • Этот блок содержит (т.е. он выступает в качестве блокирующего блока для) анонимных блоков (например, текстовых узлов) и для неанонимного дочернего элемента (например, <P> блоков)

  • Атрибуты стиля элемента верхнего уровня, например. padding, связаны с этим блоком

Когда элемент верхнего уровня (например, <BODY>) определяется с отображением: inline, то:

  • Нет ни одного блока, связанного с элементом

  • Содержимое элемента (текстовые узлы в анонимном блоке и дочерние элементы в неанонимном блоке) не содержит содержащего блока, который связан с элементом верхнего уровня

  • Атрибуты стиля элемента верхнего уровня, например. padding, связаны с его встроенным контентом