У меня есть div
( родитель ), который содержит другой div
( ребенок ). Родитель - это первый элемент body
без определенного стиля CSS. Когда я установил
.child
{
margin-top: 10px;
}
Конечным результатом является то, что вершина моего ребенка все еще выровнена с родителем. Вместо того, чтобы переместить ребенка на 10px вниз, мой родитель переместился на 10px вниз.
Мой DOCTYPE
настроен на XHTML Transitional
.
Что мне здесь не хватает?
edit 1
Мой родитель должен иметь строго определенные размеры, потому что у него есть фон, который должен отображаться под ним сверху вниз (в идеальном пикселе). Таким образом , установка вертикальных полей на нем не является не идти .
edit 2
Это поведение одинаково на FF, IE, а также CR.
Ответы:
Находите альтернативу в дочерних элементах с полями в DIV. Вы также можете добавить:
или:
Это предотвращает падение полей . Границы и отступы делают то же самое. Следовательно, вы также можете использовать следующее, чтобы предотвратить коллапс верхнего края:
Обновление по популярному запросу. Суть проблемы заключается в обработке текстового содержимого. Например:
Поскольку браузер сворачивает поля, текст будет выглядеть так, как вы ожидаете, а
<div>
теги-обертки не влияют на поля. Каждый элемент обеспечивает интервал вокруг него, но интервал не будет удвоен. Края<h2>
и<p>
не складываются, а скользят друг в друга (они рушатся). То же самое происходит для<p>
и<ul>
элемента.К сожалению, с современным дизайном эта идея может укусить вас, когда вы явно хотите контейнер. Это называется новым контекстом форматирования блока в CSS.
overflow
Или запас трюк даст вам это.источник
<h2>
,<p>
,<ul>
не получит странные пробелы или «двойные» поля таким образом.margin: 5px 10px;
id, ожидаем 2 деления 5 пикселей сверху и 20 пикселей между ними, а не 5 пикселей сверху и 10 пикселей между ними. если бы я хотел, чтобы 10 пикселей между ними указали idmargin: 5px 5px;
. я искренне желаю, чтобы было корневое правило, которое я мог бы разместить, чтобы остановить падение всех полей. я ненавижу, что мне приходится удваивать размер полей на бумаге, чтобы заставить их делать то, что я хочу на экране. и это главное ... какая катастрофаЭто нормальное поведение (по крайней мере, среди реализаций браузера). Поля не влияют на позицию дочернего элемента по отношению к его родителю, если только у родительского элемента нет отступов, и в этом случае большинство браузеров добавят поле дочернего элемента к отступам родителя.
Чтобы получить желаемое поведение, вам необходимо:
источник
.parent {border: solid 1px;}
Хотя все ответы решают проблему, но они идут с компромиссами / корректировками / компромиссами, такими как
floats
, У вас есть плавать элементыborder-top
, Это толкает-1px
родительский элемент как минимум на 1 пиксель вниз, что затем должно быть скорректировано с введением маржи для самого родительского элемента. Это может создать проблемы, когда родитель уже имеетmargin-top
относительные единицы.padding-top
тот же эффект, что и при использованииborder-top
overflow: hidden
, Не может использоваться, когда родитель должен отображать переполненный контент, например выпадающее менюoverflow: auto
, Вводит полосы прокрутки для родительского элемента, который имеет (намеренно) переполнение содержимого (например, тени или треугольник подсказки)Проблема может быть решена с помощью псевдоэлементов CSS3 следующим образом
https://jsfiddle.net/hLgbyax5/1/
источник
margin-top: -1px
кажется ненужным. Но мне это нравится.margin-top: -1px
и другоеheight: 0
кажется ненужным. Проверено в Chrome. Но лучшее решение..parent:after...
добавить стиль
display:inline-block
к дочернему элементуисточник
родительский элемент не должен быть пустым, по крайней мере,
перед дочерним элементом.источник
Это то, что сработало для меня
http://jsfiddle.net/97fzwuxh/
источник
Я обнаружил, что внутри вашего .css> если вы установите свойство display элемента div в inline-block, это решит проблему. и маржа будет работать так, как ожидается.
источник
Оптимальное CSS-решение
Используйте следующий код для добавления бездетного первого ребенка к непреднамеренно движущемуся div:
Преимущество этого метода заключается в том, что вам не нужно изменять CSS любого существующего элемента, и, следовательно, он оказывает минимальное влияние на дизайн. Кроме того, добавляемый элемент является псевдоэлементом, которого нет в DOM-дереве.
Поддержка псевдоэлементов широко распространена: Firefox 3+, Safari 3+, Chrome 3+, Opera 10+ и IE 8+. Это будет работать в любом современном браузере (будьте осторожны с более новым
::before
, который не поддерживается в IE8).контекст
Если первый дочерний элемент элемента имеет
margin-top
, родительский объект будет корректировать свою позицию как способ свертывания избыточных полей. Почему? Это просто так.Учитывая следующую проблему:
Вы можете исправить это, добавив дочерний элемент с таким содержимым, как простое пространство. Но мы все ненавидим добавлять пробелы для решения проблемы, связанной только с дизайном. Поэтому используйте
white-space
свойство для фальсификации контента.Где
position: relative;
обеспечивает правильное расположение исправления. Иwhite-space: pre;
избавляет вас от необходимости добавлять какой-либо контент - например, пробел - в исправление. Иheight: 0px;width: 0px;overflow: hidden;
гарантирует, что вы никогда не увидите исправление.Возможно, вам придется добавить
line-height: 0px;
илиmax-height: 0px;
убедиться, что высота на самом деле равна нулю в древних браузерах IE (я не уверен). И по желанию вы можете добавить<!--dummy-->
к нему в старых браузерах IE, если он не работает.Короче говоря, вы можете сделать все это только с помощью CSS (что устраняет необходимость добавления фактического дочернего элемента в HTML-дерево DOM):
источник
overflow: hidden;
для родителя.Чтобы предотвратить "Div parent", используйте поле "div child":
В parent используйте эти css:
источник
margin
Элементов содержится внутри.child
разрушаются.В этом примере
p
получаетmargin
из браузера стили по умолчанию. По умолчанию браузерfont-size
обычно 16px. Имеяmargin-top
более 16 пикселей,#child
вы начинаете замечать, что он перемещается на позицию.источник
У меня тоже была эта проблема, но я предпочел предотвратить взломы с отрицательной маржей, поэтому я поставил
<div class="supercontainer"></div>
вокруг всего этого есть отступы вместо краев. Конечно, это означает больше дивитита, но это, вероятно, самый чистый способ сделать это правильно.
источник
Интересно, что мое любимое решение этой проблемы еще не упомянуто здесь: использование поплавков.
HTML:
CSS:
увидеть это здесь: http://codepen.io/anon/pen/Iphol
обратите внимание, что в случае, если вам нужна динамическая высота для родителя, она также должна плавать, поэтому просто замените
height:100px;
наfloat:left;
источник
Альтернативное решение, которое я нашел, прежде чем я знал правильный ответ, состояло в том, чтобы добавить прозрачную границу к родительскому элементу.
Ваша коробка будет использовать дополнительные пиксели, хотя ...
источник
Использование
top
вместоmargin-top
другого возможного решения, если это уместно.источник