Почему маржа не должна содержаться в родительском элементе?

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

Многие вещи приведут к тому, что родительский объект будет содержать дочернее поле:

  • border: solid;
  • position: absolute;
  • display: inline-block;
  • overflow: auto;

(И это только из небольшого тестирования, без сомнения, есть и другие.)

Я предполагаю, что это связано с сокращением полей, но:

  1. На странице спецификации W3C нет описания такого поведения.
  2. Здесь нет перекрывающихся полей.
  3. Поведение всех браузеров в этом вопросе похоже.
  4. На поведение влияют триггеры, не связанные с полями.

По какой логике элемент по умолчанию overflow: auto должен содержать материал, отличный от того, в котором для переполнения задано значение auto?

Почему все, кроме поведения обычного div по умолчанию, предполагают, что поле содержит родительский элемент, и почему обычное значение по умолчанию не должно содержать поле?


ОБНОВЛЕНИЕ: Окончательный ответ заключается в том, что W3C действительно определяет это поведение, но это:

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

Демонстрация:

body {
  margin: 0;
}

div.block {
  background-color: skyblue;
}
div.inline-block {
  display: inline-block;
  background-color: lawngreen;
}
div.position-absolute {
  background-color: rgba(255,255,0,.7);
  position: absolute;
  bottom: 0;
  right: 0;
}
div.overflow-auto {
  background-color: hotpink;
  overflow: auto;
}
div.border {
  background-color: aquamarine;
  border: solid;
}

h2 {
  margin: 80px;
  width: 250px;
  border: solid;
}
<div class="block">
  <h2>Is the margin contained (block)?</h2>
</div>
<div class="inline-block">
  <h2>Is the margin contained (inline-block)?</h2>
</div>
<div class="position-absolute">
  <h2>Is the margin contained (position-absolute)?</h2>
</div>
<div class="overflow-auto">
  <h2>Is the margin contained (overflow-auto)?</h2>
</div>
<div class="border">
  <h2>Is the margin contained (border)?</h2>
</div>

Ответ 1

Вот как CSS работает в соответствии с W3C:

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

Более конкретно для вашего случая верхнего div:

Если верхнее и нижнее поля поля соприкасаются, возможно, что поля могут провалиться через него. В этом случае позиция элемента зависит от его отношения с другими элементами, поля которых сжимаются.

  • Если поля элемента свернуты с верхним краем родителя, верхний пограничный край поля определяется как тот же, что и родительский.
  • В противном случае родитель элемента не принимает участия в разваливании маржи или участвует только нижнее поле родителя. Положение верхнего края границы элемента такое же, как если бы элемент имел ненулевую нижнюю границу.

Лучшее, что я могу сделать, это указать на "Свертывание полей" на сайте (Томми Олссоном и Пол OBrien). Они дают подробное объяснение очень с примерами, показывающими вам именно то поведение, которое вы продемонстрировали в примере кода примера.