margin-top во вложенном div

У меня проблема с margin-top во вложенном div - когда я применяю margin-top к вложенному div, поле применяется к родительскому div вместо вложенного div.

Есть идеи?


person JuanPablo    schedule 23.05.2010    source источник
comment
в некоторых случаях вы также можете попробовать padding-top: 40px только для тестирования. Вы также можете использовать padding-top: 40px! Important;   -  person Junior Mayhé    schedule 23.05.2010
comment
Кажется, это один из бесчисленных примеров того, как CSS делает то, что должен. Однако то, что он должен делать, совершенно нелогично.   -  person nicodemus13    schedule 18.04.2014
comment
Очень красивое объяснение, почему это происходит и как с этим работать. sitepoint.com/web-foundations/collapsing-margins   -  person sidneydobber    schedule 13.11.2014
comment
Возможный дубликат Почему этот стиль CSS с верхним краем не работает?   -  person Pavel Gatnar    schedule 12.04.2016


Ответы (6)


Поля уменьшатся по замыслу. Также добавьте 1px отступа, и все должно работать нормально.

person edl    schedule 23.05.2010
comment
Этому есть вполне приемлемое объяснение: howtocreate.co.uk/tutorials/css/margincollapsing - person Frank Nocke; 09.04.2013

Я получаю решение с overflow: auto в родительском div.

person JuanPablo    schedule 23.05.2010
comment
Это, безусловно, лучшее решение ... это должен быть правильный ответ! - person Pier; 19.04.2012
comment
Я поддерживаю это! Именно то, что я искал! - person James Ford; 25.10.2012
comment
Отличное решение, я этого не знал! Большое спасибо - person szanata; 30.08.2013
comment
Большое спасибо за ваше решение :) - person d3vpasha; 17.09.2016

Вот как работают поля ... маржа - это пространство между следующим элементом с полем / заполнением / подобным. Он не обязательно определяется как его родительский элемент. См. спецификацию.

Вот несколько способов обхода проблемы

Используйте Padding вместо

Это просто означает, что вместо использования margin-top: 10px; вы используете padding-top: 10px;. Это подходит не для всех случаев.

Странный взлом, который я обнаружил

Сомневаюсь, что обнаружил это изначально, но на днях решил проблему вот так. У меня был <div id="header" />, который я тоже хотел сделать верхним, и его верхнее поле также толкало родительский элемент (body элемент) вниз. Итак, я сделал это с элементом body ...

body {
    padding-top: 1px;
    margin-top: -1px;
}

Это заставило мою маржу работать. Вы также можете попробовать использовать рамку, например border: 1px solid #ccc.

Также было бы разумно оставить примечание в комментариях CSS, чтобы объяснить, почему у вас есть эта особенная пара правил. Я только что добавил /* this is to stop collapsing margins */.

Дальнейшее чтение

Ознакомьтесь с этими другими вопросы о переполнении стека

person alex    schedule 23.05.2010

Причина, по которой overflow: auto изменяет родительский div, чтобы разрешить вложенный margin-top, заключается в том, что он создает новый контекст форматирования. Любой div, который позиционируется как абсолютный, фиксированный, плавающий или с переполнением, кроме видимого, создает новый контекст форматирования. Родительский div становится корнем этого нового контекста форматирования, и сворачивающиеся поля не применяются к корневым элементам.

Более подробно:

Контексты форматирования могут быть встроенными или блочными, и только контексты блочного форматирования сжимают свои поля. Эти контексты форматирования формируют поток документа.

Контекст форматирования блока - это просто все элементы уровня блока (например, div, p, table), расположенные один за другим по вертикали внутри содержащего блока до конца документа / контейнера или до тех пор, пока не будет установлен новый контекст форматирования.

В случае вложения верхний край дочернего элемента сворачивается вместе с верхним краем родительского элемента, поскольку оба блока div являются частью контекста форматирования блока. Если установить для переполнения значение auto, родительский div становится контейнером нового контекста форматирования, а дочерний элемент - первым элементом блока в нем. Таким образом, два поля больше не «примыкают», поскольку родительский div теперь является корневым.

Надеюсь, это поможет.

Коробочная модель: http://www.w3.org/TR/CSS2/box.html#collapsing-margins

Модель визуального форматирования: http://www.w3.org/TR/CSS2/visuren.html#normal-flow

person pfrendly    schedule 09.06.2013

«Свертывающиеся поля» - ваша проблема. Здесь вы можете понять, что это такое и почему он все еще жив: http://www.sitepoint.com/web-foundations/collapsing-margins/

Я прочитал в Интернете в поисках подходящего решения и, наконец, нашел эту статью: http://www.seifi.org/css/understanding-taming-collapsing-margins-in-css.html

Короче говоря, у вас есть несколько способов решить вашу проблему:

1) граница в родительском div (может быть прозрачной)

2) отступы в родительском div

3) переполнение: авто

4) float: left

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

person LucaM    schedule 19.09.2014

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

position:fixed;
person shadow    schedule 14.09.2017