Почему пустой элемент встроенного блока отображения создает высоту, но не отображает встроенный и отображаемый блок? - PullRequest
1 голос
/ 09 июля 2020

Предположим, у меня есть контейнер div (блочный элемент), а внутри пустой встроенный блочный элемент. В этом случае элемент контейнера имеет высоту. Думаю, это из-за высоты строки. Но почему, если я заменяю внутренний элемент (отображать встроенный блок) на блок или встроенный элемент, почему бы не создать высоту?

.container {
  background-color: red;
}
<div class="container">
  <div style="display: inline-block;"></div>
</div>

<div class="container">
  <div style="display: inline;"></div>
</div>

<div class="container">
  <dis style="display:block;"></dis>
</div>

1 Ответ

3 голосов
/ 09 июля 2020

Чтобы понять это, вам необходимо знать разницу между BF C (контекст форматирования блока) и IF C (встроенный контекст форматирования.

Если в вашем контейнере есть только блочных элементов, это создаст BF C:

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

В этом случае для расчета высоты вашего контейнера учитываются только высота и поле элемента блока внутри, и у вас есть только один пустой элемент, поэтому высота равна 0.

При наличии an inline-block / inline элементы, вы вызовете создание IF C, и история будет другой:

При встроенном форматировании con text поля располагаются по горизонтали один за другим, начиная с верхней части содержащего блока. Между этими полями соблюдаются горизонтальные поля, границы и отступы. Блоки могут быть выровнены по вертикали по-разному: их нижняя или верхняя часть может быть выровнена, или базовые линии текста внутри них могут быть выровнены. Область прямоугольника angular, содержащая прямоугольники, которые образуют линию, называется линейным прямоугольником.

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

Как вы обнаружили, мы будем иметь дело со строками, и line-height будет учитываться здесь для определения высоты каждого линейного поля (в вашем случае у вас есть только один)

Теперь разница между inline и inline-block заключается в пустом пространстве. В случае элемента inline у вас закончится пустой контейнер, потому что все пустое пространство исчезнет. Подробнее здесь: https://www.w3.org/TR/2011/REC-CSS2-20110607/text.html#white -space-prop .

Если вы измените алгоритм пробела (и добавите пробел), вы получите ту же высоту, что и с inline-block элемент.

.container {
  background-color: red;
  margin:5px;
  white-space:pre;
}
<div class="container"><div style="display: inline-block;"></div></div>

<div class="container"><div style="display: inline;"> </div></div>

Помимо пробелов, inline-block немного отличается, потому что:

Блоки строкового уровня, которые не являются строчными блоками (такие как замененные элементы встроенного уровня, элементы встроенного блока и элементы встроенной таблицы) называются atomi c блоками встроенного уровня , поскольку они участвуют в своем встроенном контексте форматирования как одиночный непрозрачный блок .

Это не тривиально для понимания, но, используя простые слова, вы можете увидеть элемент inline-block как элемент, в котором содержимое внутри не взаимодействует с внешним миром (с учетом пробелов, разрыва строки и т. д. c), и даже если inline-block пуст, у нас будет поле со строкой

Вот базовый пример c, чтобы увидеть разница:

.container {
  margin: 5px;
  font-size:30px;
}

div {
  outline:1px solid green;
}
<div class="container">
  a<div style="display: inline-block;"> some text here </div> text here
</div>

<div class="container">
   a<div style="display: inline;"> some text here </div> text here
</div>

<div class="container">
  a<div style="display: inline-block;"> some text<br> here </div> text here
</div>

<div class="container">
   a<div style="display: inline;"> some text<br> here </div> text here
</div>

Последний случай - когда в вашем контейнере есть элементы inline / inline-block и , а также block. В этом случае мы запускаем BF C, но мы должны учитывать анонимные блоки блоков , где мы размещаем встроенные элементы.

если блок-контейнер (например, сгенерированный для DIV выше) имеет внутри него блок уровня блока (например, P выше), , тогда мы заставляем его иметь внутри только блоки уровня блока .

Затем вы можете увидеть блок анонимного блока как IF C и получить рекурсивное определение. BF C, где у вас есть разные блоки, и каждый из них может быть BF C или IF C и т. Д.

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

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