У меня есть div заголовка в качестве первого элемента в моем div-оболочке, но когда я добавляю верхнее поле к h1 внутри div заголовка, он толкает весь div заголовка вниз. Я понимаю, что это происходит всякий раз, когда я применяю верхнее поле к первому видимому элементу на странице.
Вот пример фрагмента кода. Спасибо!
div#header{
width: 100%;
background-color: #eee;
position: relative;
}
div#header h1{
text-align: center;
width: 375px;
height: 50px;
margin: 50px auto;
font-size: 220%;
background: url('../../images/name_logo.png') no-repeat;
}
<div id="header">
<h1>Title</h1>
<ul id="navbar"></ul>
</div>
overflow:hidden
лучше в 90% случаев.overflow: hidden
илиoverflow: auto
может вызвать нежелательные побочные эффекты, некоторые из которых вы можете не заметить с первого взгляда. Я обнаружил, что изменениеmargin
наpadding
помогает, как следует из ответа ниже. Однако до сих пор не понимаю, почему происходит вся проблема.У меня нет твердого объяснения о том, почему это происходит, но я это исправил, изменяя
top-margin
кtop-padding
, или добавлениеdisplay: inline-block
к стилю элемента.РЕДАКТИРОВАТЬ: это моя теория
У меня есть ощущение, что это как-то связано с тем, как поля сворачиваются (объединяются).
из W3C Collapsing Margins :
Моя теория заключается в том, что, поскольку ваш первый элемент находится рядом с телом, два поля объединяются и применяются к телу: это заставляет содержимое тела начинаться ниже примененного свернутого поля в соответствии с блочной моделью .
Бывают ситуации, когда поля не сжимаются, с которыми, возможно, стоит поиграть (из Collapsing Margins ):
источник
Это некоторые из способов избежать коллапса полей между родительскими и дочерними элементами. Используйте тот, который лучше подходит к остальной вашей стилистике:
display
значение, отличное отblock
.float
значение, отличное отnone
.padding
. Например, если у вас естьmargin-top: 10px
, замените наpadding-top: 10px;
.position
(absolute
илиrelative
) с атрибутамиtop
,bottom
и т.д. Например , если у васmargin-top: 10px
, заменитеposition: relative; top: 10px;
.padding
или aborder
в той стороне, где сворачиваются поля . Граница может быть 1px и прозрачной.overflow
значение, отличноеvisible
от родительского элемента.источник
Я знаю, что это старая проблема, я сталкивался с ней много раз. Проблема в том, что все исправления здесь представляют собой взломы, которые потенциально могут иметь непредвиденные последствия.
Во-первых, есть простое объяснение основной проблемы. Из-за того, как работает сворачивание полей, если первый элемент внутри контейнера имеет верхнее поле, это верхнее поле эффективно применяется к самому родительскому контейнеру. Вы можете проверить это самостоятельно, выполнив следующие действия:
В отладчике откройте это и наведите на div. Вы заметите, что сам div фактически размещается там, где ограничивается верхнее поле элемента H1 . Такое поведение предусмотрено браузером.
Так что это легко исправить, не прибегая к странным хакам, как это делается в большинстве сообщений здесь (без оскорблений, это просто правда) - просто вернитесь к исходному объяснению -
...if the first element inside a container has a top margin...
- После этого вам понадобится первый элемент в контейнере НЕ должен иметь верхнего поля. Хорошо, но как это сделать, не добавляя элементы, которые семантически не мешают вашему документу?Легко! Псевдо-элементы! Вы можете сделать это с помощью класса или предопределенного миксина. Добавьте
:before
псевдоэлемент:CSS через класс:
При этом, следуя приведенному выше примеру разметки, вы измените свой div как таковой:
Почему это работает?
Первый элемент в контейнере, если он не имеет верхнего поля, устанавливает позицию начала верхнего поля следующего элемента. Добавляя
:before
псевдоэлемент, браузер фактически добавляет несемантический (другими словами, подходящий для SEO) элемент в родительский контейнер перед вашим первым элементом.В. Почему высота: .0000001em?
A. Высота требуется, чтобы браузер подтолкнул элемент поля вниз. Эта высота фактически равна нулю, но она по-прежнему позволяет добавлять отступы к самому родительскому контейнеру. Поскольку он фактически равен нулю, он также не повлияет на макет контейнера. Прекрасный.
Теперь вы можете добавить класс (или лучше, в SASS / LESS, миксин!), Чтобы исправить эту проблему, вместо добавления странных стилей отображения, которые приведут к неожиданным последствиям, когда вы захотите сделать другие вещи с вашими элементами, целенаправленно устраняя поля на элементах. и / или заменяя его заполнением или странными стилями позиции / флота, которые на самом деле не предназначены для решения этой проблемы.
источник
display: flex
будет работать в этом случае. Укажите родительский элемент,display: flex;
а затем укажите маржу в соответствии с вашими требованиями кh1
тегу.источник
Столкнитесь с этой проблемой сегодня.
overflow: hidden
не сработало, как ожидалось, когда за мной последовало больше элементов.Итак, я попытался изменить свойство display родительского div и
display: flex
работал !!!Надеюсь, это может кому-то помочь. :)
источник
Эту проблему может решить добавление небольшого отступа к верху родительского элемента.
Это полезно, если вам нужно, чтобы элемент внутри родительского элемента был видимым за пределами родительского элемента, например, если вы создаете эффект перекрытия.
источник
Это происходит из-за обвала маржи. Когда дочерний элемент касается границы родительского элемента и любой из них применяется с полями, тогда:
Выигрывает самая большая маржа (применяется).
если у кого-то из них есть маржа, то оба будут делить то же самое.
Решения
источник