Я знаю, что это старая проблема, я сталкивался с ней много раз. Проблема в том, что все исправления здесь представляют собой взломы, которые потенциально могут иметь непредвиденные последствия.
Во-первых, есть простое объяснение основной проблемы. Из-за того, как работает сворачивание полей, если первый элемент внутри контейнера имеет верхнее поле, это верхнее поле эффективно применяется к самому родительскому контейнеру. Вы можете проверить это самостоятельно, выполнив следующие действия:
<div>
<h1>Test</h1>
</div>
В отладчике откройте это и наведите на div. Вы заметите, что сам div фактически размещается там, где ограничивается верхнее поле элемента H1 . Такое поведение предусмотрено браузером.
Так что это легко исправить, не прибегая к странным хакам, как это делается в большинстве сообщений здесь (без оскорблений, это просто правда) - просто вернитесь к исходному объяснению - ...if the first element inside a container has a top margin...
- После этого вам понадобится первый элемент в контейнере НЕ должен иметь верхнего поля. Хорошо, но как это сделать, не добавляя элементы, которые семантически не мешают вашему документу?
Легко! Псевдо-элементы! Вы можете сделать это с помощью класса или предопределенного миксина. Добавьте :before
псевдоэлемент:
CSS через класс:
.top-margin-fix:before {
content: ' ';
display: block;
width: 100%;
height: .0000001em;
}
При этом, следуя приведенному выше примеру разметки, вы измените свой div как таковой:
<div class="top-margin-fix">
<h1>Test</h1>
</div>
Почему это работает?
Первый элемент в контейнере, если он не имеет верхнего поля, устанавливает позицию начала верхнего поля следующего элемента. Добавляя :before
псевдоэлемент, браузер фактически добавляет несемантический (другими словами, подходящий для SEO) элемент в родительский контейнер перед вашим первым элементом.
В. Почему высота: .0000001em?
A. Высота требуется, чтобы браузер подтолкнул элемент поля вниз. Эта высота фактически равна нулю, но она по-прежнему позволяет добавлять отступы к самому родительскому контейнеру. Поскольку он фактически равен нулю, он также не повлияет на макет контейнера. Прекрасный.
Теперь вы можете добавить класс (или лучше, в SASS / LESS, миксин!), Чтобы исправить эту проблему, вместо добавления странных стилей отображения, которые приведут к неожиданным последствиям, когда вы захотите сделать другие вещи с вашими элементами, целенаправленно устраняя поля на элементах. и / или заменяя его заполнением или странными стилями позиции / флота, которые на самом деле не предназначены для решения этой проблемы.
overflow:hidden
лучше в 90% случаев.