переполнение: скрытый на div и теле, различное поведение
учитывая этот html:
<body>
<div id="a"></div>
<div id="b"></div>
</body>
я хочу #b
чтобы заполнить все оставшееся вертикальное пространство своего контейнерного блока, я начал с этого:
body {
height: 500px;
width: 500px;
overflow: hidden;
}
#a {
height: 100px;
width: 100px;
}
#b {
height: 100%;
width: 100%;
}
так #b
высота 100%, что означает, что он принимает высоту своего родительского контейнерного блока, который 500px
, проблема в том, что overflow: hidden;
кажется, не работает, #b
не отсекается.
С другой стороны, если я обернуть #a
и #b
С другим div с теми же свойствами, что и body
выше у меня есть желаемый результат:
#wrap {
height: 500px;
width: 500px;
overflow: hidden;
}
#a {
height: 100px;
width: 100px;
}
#b {
height: 100%;
width: 100%;
}
С этим html конечно:
<body>
<div id="wrap">
<div id="a"></div>
<div id="b"></div>
</div>
</body>
мой вопрос, почему div
и body
кажется, имеют разные поведения с теми же свойствами? и есть ли способ получить тот же эффект без обертки?
чтобы проиллюстрировать вопрос, я создал два jsFiddles:
jsFiddle с тегом тела в качестве обертки:http://jsfiddle.net/3AMtG/
jsFiddle с тегом div в качестве обертки:http://jsfiddle.net/2QWn3/
два jsFiddles с одинаковыми свойствами дают разные результаты. Почему так?
3 ответов
на overflow
свойство имеет определенные специальные поведения, характерные для HTML html
и body
элементы, которые описаны в в CSS2.1 спецификаций. Эти особые случаи предназначены для изменения настроек переполнения на всей странице в обычных обстоятельствах, поэтому авторам просто нужно установить его наhtml
или body
, но не оба.
в этом случае, когда вы подаете заявление overflow: hidden
to body
, это фактически влияет на видовое окно вместо body
(вы это можно увидеть, изменив размер панели предварительного просмотра, чтобы сделать ее короче - полосы прокрутки не будут отображаться на самой панели предварительного просмотра). Это вызывает #b
для переполнения тела обычно, даже если вы даете ему фиксированную высоту, которая меньше суммы #a
и #b
. Другими словами, это как если бы вы никогда не установите его на тело в первую очередь.
если вы устанавливаете overflow
к чему-то другому, чем visible
on html
, однако, это заставляет окно просмотра использовать значение, заданное html
вместо body
, тем самым оставляя декларацию о body
без изменений и позволяя ему вести себя так же, как обертка:
html {
overflow: auto;
}
body {
height: 500px;
width: 500px;
overflow: hidden;
}
тело и div имеют совершенно разные из них. В моей повседневной работе мне нравится создавать свой код таким образом.
<div class='xxx-ctn'>
<div class='xxx-inner'>
<div class='data-wrapper'>
[p|ul|ol|h1-h6|article|section].....
</div>
</div>
</div>
хорошо, я пропустил ваше основание, но я думаю, что это хороший кодирующий хаббит.
элемент Body считается основным родительским элементом, внутри которого находятся другие элементы, отображаемые в окне браузера, поэтому свойство width и height неприменимо к нему. В соответствии с лучшими практиками лучше создать контейнер div, такой как #wrapper, который вы сделали во втором примере.