Когда элемент с полем содержится в другом элементе, родительский элемент не всегда оборачивает / не содержит это поле.
Многие вещи заставят родительский элемент содержать дочернее поле:
border: solid;
position: absolute;
display: inline-block;
overflow: auto;
(И это всего лишь небольшое тестирование, несомненно, есть еще кое-что.)
Я бы предположил, что это связано со схлопыванием полей, но:
- На странице спецификации W3C нет описания такого поведения.
- Здесь нет перекрывающихся полей.
- Поведение всех браузеров в этом вопросе похоже.
- На поведение влияют триггеры, не связанные с полями.
Какова логика, по которой элемент со значением по умолчанию overflow: auto
должен содержать материал, отличный от того, в котором переполнение установлено на авто?
Почему все, кроме поведения по умолчанию обычного div, должно предполагать, что поле содержится в родительском элементе - и почему обычное значение по умолчанию не должно включать поле?
РЕДАКТИРОВАТЬ: Окончательный ответ заключается в том, что W3C действительно определяет это поведение, но это:
- В спецификациях нет никакого смысла.
- The specs mix, without any word of explanation:
- 'free margins' (margins that would touch the top or bottom of their parent are not contained by the parent) and
- «свернутые поля» (смежные поля могут перекрываться).
Демо:
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>