Расчеты родительского и дочернего измерения - PullRequest
1 голос
/ 21 января 2011

Может кто-нибудь помочь мне понять, почему размер #child не совпадает с размером #parent?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Title</title>
    </head>
    <body>
        <div id='parent' style='border: 1px solid black'>
            <div id='child' style='background-color: #888888'>
                <p>Here is some content</p>
                <div id='grandchild' style='margin-bottom: 1em'>
                    <p>A little more content</p>
                </div>
            </div>
        </div>
    </body>
</html>

Ответы [ 3 ]

3 голосов
/ 21 января 2011

Вот что происходит:

Падение маржи.Ответ Джероена указал мне на спецификации блочной модели W3C для коллапсирующих полей , которые вызывали у меня головную боль и не совсем отвечали на вопрос о границе (на которую сначала указал Одед).Затем я нашел эту статью и сложил решение вместе (я говорю только о верхних полях, но точно такое же решение применимо к нижним полям).

  1. Когда соприкасаются вертикальные поля двух элементов [уровень блока], используется большее поле и меньшее поле отбрасывается.

  2. Все в вашем кодесчитается элементом уровня блока, включая теги <html> и <body>.

  3. По умолчанию <body> имеет margin-top 8 пикселей в родительском элементе <html>.

  4. Первый тег <p>имеет значение по умолчанию margin-top 16 пикселей.

  5. Свертывание полей не ограничивается братьями и сестрами, поэтому тег <p> начинает проверять позицию и поля родительского тега.

  6. Элемент #child имеет margin-top, равный 0. Верхнее поле <p> касается верхнего поля #child, поэтому они сжимаются до единого поля 16px (16> 0).,Поле 16px тега <p> «проталкивает» и действует как поле для тега #child.

  7. Поле 16px из <p> по-прежнему проверяет наличие полей непосредственно над ним,Далее будет тегом #parent, который также имеет верхнюю границу 0.

  8. НО, граница 1px на #parentпрепятствует дальнейшему продвижению <p>. <p> больше не будет сталкиваться с полями над ним, потому что он касается границы 1px.Таким образом, разрушение останавливается внутри верхней границы #parent.

  9. Отображается верхнее поле размером 16px, а под ним - тег #child с полем 0px, свернутым.

Вот почему *Поле 1074 * на 32 пикселя выше, чем поле #child: поля <p> "прорывались" до тех пор, пока не достигли чего-то, что не было поля (граница 1 пикселя).Итак, что произойдет, если граница 1px на #parent не была там, чтобы остановить разрушение?

  1. Выполните шаги 1-7 выше.

  2. Верхнее поле

    <p> попадает в верхнее поле элемента #parent 0px.Опять же, <p> - это большее поле (16 против 0), поэтому свертывание продолжается вверх.

  3. <p> верхнее поле достигает тега <body>.<body> имеет верхнее поле по умолчанию 8 пикселей.Тег <p> больше, поэтому теперь тег <body> «унаследовал» верхнее поле 16px, а 8px отбрасывается.

  4. Верхнее поле <p> достигает<html> тег.Поскольку <html> является корневым элементом, свертывание останавливается здесь.Тег <body> визуализируется с верхним полем 16px, а элементы #parent, #child и <p> отображаются ниже;<p> плотно прилегает к окну #parent, потому что через него разбилось поле.

Причина, по которой мне потребовалось так много времени, чтобы понять это та же самая причина, по которой я не слышалколлапсирующих полей до сегодняшнего дня: Firebug четко не отображает коллапсирующие поля .В Firebug тег <p> по-прежнему показывает, что он удерживает верхнее поле в 16px.Это правда.Тем не менее, нет никаких признаков того, что какое-либо свертывание имело место - тег <body> по-прежнему отображает верхнюю границу 8px, даже если он был отброшен.

Я рад, что знаю это сейчас;это проясняет большую путаницу, которую я имел в отношении макетов страниц.


Редактировать:

Статья, на которую я ссылался , действительно стоит прочитать.Он не только дал мне информацию, необходимую мне для ответа, но и детализировал, как в IE7 тег <body> не участвует в разрушении границ.Это многое объясняет.

1 голос
/ 21 января 2011

Из-за стандартных полей на p и bottom-margin на #grandchild.Они разрушаются со стандартным полем body.

. Вы можете сбросить поля на body, p и т. Д. И использовать отступы вместо полей, чтобы избежать этого;прокладки не разрушаются.

1 голос
/ 21 января 2011

Поскольку ваш родительский div имеет границу 1 пиксель вокруг себя, а дочерний - нет.

Это добавляет 2 пикселя к ширине и высоте родительского div.

...