Почему margin-top верхнего div будет применяться к `<body>`?
Здесь я разместил демо http://jsfiddle.net/LxYMv/1/.
Как вы можете видеть, <body>
получает margin-top: 10px из верхнего div, а затем <html>
просканируется черный фон. Означает ли это, что я не могу дать верхнему div положительную маржу?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style>
html{color:#000;background:#FFF}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,select,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,button,caption,cite,code,dfn,em,input,optgroup,option,select,strong,textarea,th,var{font:inherit}del,ins{text-decoration:none}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:baseline}sub{vertical-align:baseline}legend{color:#000}
html{background:black}
body{background:white}
</style>
</head>
<body>
<div style="margin-top:10px;background:red;height:100px">Here the top div begins</div>
<div style="height:800px">A long long div</div>
</body>
</html>
Ответы
Ответ 1
Это называется разворот маржи.
Когда элемент с пометкой находится внутри элемента без прокладки или границы, маржа будет применяться вне родительского элемента, а не между дочерним элементом и родительским ребром.
Основной причиной такого поведения является то, что маржа указывает минимальное расстояние между элементами, а не расстояние вокруг элемента, например padding, определяет расстояние вокруг содержимого элемента.
Ответ 2
Вы можете обойти это, добавив padding: 0.01px;
в <body>
. Поскольку он настолько мал, он эффективно округляется до 0px
, но затем тело начинается там, где оно должно.
Ответ 3
Это означает, что если ребенок начнет точно, где родительский, у которого нет поля, начинается, тогда на него повлияет маржа childs. Вы можете использовать свойство padding
, чтобы получить желаемый результат:
body{
padding-top:10px;
}
Ответ 4
Вот как работают поля. Поля родительского и дочернего элементов сворачиваются вместе так же, как элемент, появляющийся ниже другого, рухнет. Используйте padding для дочернего элемента, если вы хотите, чтобы родительский элемент не перемещался.
Ответ 5
Я думаю, что модель коробки объясняет это поведение: http://www.w3.org/TR/CSS2/box.html
В частности, эти строки:
"Свернутый запас считается смежным с другой маржой, если какой-либо из его компонентных полей примыкает к этой границе". & Амп;
"Верхняя граница элемента блока потока в потоке сворачивается с его первым верхним полем верхнего уровня на уровне блока, если элемент не имеет верхней границы, нет верхнего заполнения, а у ребенка нет разрешения."
Вместо добавления поля к дочернему элементу вы можете добавить одноименное дополнение к родительскому элементу или применить некоторую границу к родительскому элементу, и вы получите то, что хотите.
Ответ 6
Как сказал @Guffa:
Это называется сбрасыванием краев.
Когда элемент с запасом находится внутри элемента без прокладки или границы, маржа будет применяться вне родительского элемента вместо между дочерним элементом и родительским ребром.
Чтобы разработать немного: решение заключается в использовании отступов вместо поля. В вашем случае вы должны добавить padding-top: 10px
в body
и удалить margin-top
из <div>
Если вы хотите создать контейнер, который предотвратит сбой внутренних полей, выходящих за пределы контейнера, вам нужно будет добавить дополнение или границу к контейнеру. Если вы не хотите ни одной из этих видимых функций, вы можете добавить отрицательный запас и отменить его с положительным отступом. Вот так:
<div style="margin:-1px; padding:1px;"> ... </div>
вы можете сделать то же самое на своем элементе тела, если хотите.
Изменить: вот ваш jsFiddle, обновленный, чтобы использовать трюк margin/padding в элементе body
Ответ 7
Попробуйте добавить это:
<div style="overflow:hidden;height:1%">
<div style="margin-top:10px;background:red;height:100px">Here the top div begins</div>
</div>
Я думаю, он решает ваши проблемы.