неожиданный запас с очень простым HTML - PullRequest
5 голосов
/ 25 ноября 2008

У меня очень простой HTML. Красный div находится внутри синего div и имеет верхнее поле 10 px. В браузерах, отличных от ie, синяя рамка находится на расстоянии 10 пикселей от верхней части области просмотра, а красный div находится в самом верху синего div. То, что я ожидаю, это поведение ie: красный div должен быть на расстоянии 10 px от вершины синего div. Почему не-то есть браузеры отображаются так? (Я полагаю, что это неправильное поведение IE, но почему?)

И как правильно это сделать?

почему пусто? http://img92.imageshack.us/img92/7662/blankmr7.jpg

<html>
<head>
<style>
body { margin:0; padding:0; }
.outer
{
    background-color: #00f;
    height: 50px;    
}
.inner
{
    height: 20px;
    width: 20px;
    background-color: #f00;
    margin: 10px 0 0 10px;
}
</style>
</head>
<body>
<div class="outer">
    <div class="inner">
    </div>
</div>
</body>
</html>

Ответы [ 5 ]

9 голосов
/ 25 ноября 2008

Столько, сколько ответ Страгера уже объясняет столько, сколько вам нужно знать о том, почему это происходит, а именно о том, что это происходит так, как это происходит в браузерах, отличных от IE, потому что спецификации так говорят - я думаю, что он выбрал неправильную цитату из раздела спецификации CSS 2.1 о сворачивающихся полей .

Процитированный им пункт объясняет, как могут сжиматься поля, а не как они могут "перемещаться" к родительскому элементу.

Это скорее объясняет:

  • Если верхнее и нижнее поля бокса соприкасаются, то поля могут сжиматься. В этом случае положение элемента зависит от его связи с другими элементами, поля которых свернуты.
    • Если поля элемента свернуты с верхним полем его родителя, то край верхней границы поля определяется так же, как край родителя.

Или, в несколько более удобочитаемой форме, в документации для разработчиков Mozilla :

Родитель и первый / последний ребенок:

Если нет границы, отступа, встроенного содержимого или свободного пространства для разделения поля margin верхнего элемента с его верхним полем его первого дочернего блока, или нет границы, отступа, встроенного содержимого, высоты, минимальной высоты или max-height, чтобы отделить поле margin-bottom блока с полем margin его последнего потомка, после чего эти поля свернутся. Свернутое поле заканчивается за пределами родительского элемента.

Что касается того, как это исправить, я бы, наверное, выбрал решение overflow: auto Крис Ллойд предложил (столько, сколько это может иметь побочные эффекты).

Но тогда это действительно зависит от того, как именно выглядит остальная часть вашего кода. В этом простом примере вы можете легко изменить margin на дочернем элементе на padding на родительском элементе.

Или вы можете использовать дочерний элемент или просто позиционировать его ...

Или как насчет обратного clearfix , если вы хотите стать действительно модным:

.outer:before {
    content: ".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
}
4 голосов
/ 25 ноября 2008

Поля объединяются. Вывод, созданный IE, вероятно, неверен.

В спецификациях (которые для меня сейчас недоступны):

Два или более смежных вертикальных поля блоков блоков в нормальном потоке рушатся. Результирующая ширина поля - это максимальная ширина смежных полей.

Вы можете использовать границы вместо полей, для цвета границы установлено прозрачное.

3 голосов
/ 25 ноября 2008

Существует довольно подходящий ответ на этот вопрос: overflow: auto;

<html>
<head>
<style>
body { margin:0; padding:0; }
.outer
{
    background-color: #00f;
    height: 50px;
    overflow: auto;
}
.inner
{
    height: 20px;
    width: 20px;
    background-color: #f00;
    margin: 10px 0 0 10px;
}
</style>
</head>
<body>
<div class="outer">
    <div class="inner">
    </div>
</div>
</body>
</html>
0 голосов
/ 25 ноября 2008

Ок, решение без переполнения авто:

<html>
<head>
<style>
body { margin:0; padding:0; }
.outer
{
    background-color: #00f;
    height: 50px;
    border: 1px solid transparent;
}
.inner
{
    height: 20px;
    width: 20px;
    background-color: #f00;
    margin: 10px 0 0 10px;
    padding: 0;
}
</style>
</head>
<body>
<div class="outer">
    <div class="inner">
    </div>
</div>
</body>
</html>

Внутренний элемент хочет, чтобы на него что-то давило, и это обеспечивает бодер (или заставляет браузер учитывать переполнение).

0 голосов
/ 25 ноября 2008

Может быть, IE видит DOM как div.inner с div.outer в качестве родительского узла (и вычисляет смещение от него),
и что у других браузеров вместо них есть оба, отвечающие на элемент body?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...