Установите div на оставшуюся высоту с помощью CSS с неизвестными высотами div сверху и снизу
Можно ли заставить обертку заполнять высоту окна (без прокрутки) и прокручивать центр div без использования элементов с пикселями и javascript?
<div id="wrapper">
<h1>Header</h1>
<div id="center">
<div style="height:1000px">high content</div>
</div>
<div id="footer">Footer</div>
</div>
В принципе, я хочу, чтобы заголовок был виден сверху, а нижний колонтитул всегда был видимым внизу и имел прокручиваемое содержимое в центре, которое занимает высоту восстановления.
Высота заголовка, нижнего колонтитула и центрального divs неизвестна (не установлено px или%, то есть переменный размер шрифта или отступы). Возможно ли это с помощью чистого CSS?
Ответы
Ответ 1
Решение кросс-браузера, полученное из Dan Dascalescu:
http://jsfiddle.net/Uc9E2
html, body {
margin: 0;
padding: 0;
height: 100%;
}
.l-fit-height {
display: table;
height: 100%;
}
.l-fit-height-row {
display: table-row;
height: 1px;
}
.l-fit-height-row-content {
/* Firefox requires this */
display: table-cell;
}
.l-fit-height-row-expanded {
height: 100%;
display: table-row;
}
.l-fit-height-row-expanded > .l-fit-height-row-content {
height: 100%;
width: 100%;
}
@-moz-document url-prefix() {
.l-scroll {
/* Firefox requires this to do the absolute positioning correctly */
display: inline-block;
}
}
.l-scroll {
overflow-y: auto;
position: relative;
height: 1000px;
}
.l-scroll-content {
position: absolute;
top: 0;
bottom: 0;
height: 1000px;
min-height:100px;
}
<div class="l-fit-height">
<section class="l-fit-height-row">
<div class="l-fit-height-row-content">
<p>Header</p>
</div>
</section>
<section class="l-fit-height-row-expanded">
<div class="l-fit-height-row-content l-scroll">
<div class="l-scroll-content">
<p>Foo</p>
</div>
</div>
</section>
<section class="l-fit-height-row">
<div class="l-fit-height-row-content">
<p>Footer</p>
</div>
</section>
</div>
Ответ 2
2014 UPDATE. Современный способ решить эту проблему макета - использовать flexbox
CSS-модель. Он поддерживается всеми основными браузерами и IE11 +.
2012: Правильный способ сделать это с помощью CSS - использовать display: table
и display: table-row
. Это поддерживаемые всеми основными браузерами, начиная с IE8. Это не использует таблицы для отображения. Вы будете использовать divs:
html, body {
height: 100%;
margin: 0;
}
.wrapper {
display: table;
height: 100%;
width: 100%;
background: yellow; /* just to make sure nothing bleeds */
}
.header {
display: table-row;
background: gray;
}
.content {
display: table-row; /* height is dynamic, and will expand... */
height: 100%; /* ...as content is added (won't scroll) */
background: turquoise;
}
.footer {
display: table-row;
background: lightgray;
}
<div class="wrapper">
<div class="header">
<h1>Header</h1>
<p>Header of variable height</p>
</div>
<div class="content">
<h2>Content that expands in height dynamically to adjust for new content</h2>
Content height will initially be the remaining
height in its container (<code>.wrapper</code>).
<!-- p style="font-size: 4000%">Tall content</p -->
</div>
<div class="footer">
<h3>Sticky footer</h3>
<p>Footer of variable height</p>
</div>
</div>
Ответ 3
Использование overflow:auto
позволит вам сделать это.
Ответ 4
Так что вы говорите, это липкий нижний колонтитул. Я пошел и сделал еще несколько исследований, и вот что я имею для вас.
<div id="wrapper" style="height:100%">
<div id="header" style="float:none;"><h1>Header</h1></div>
<div style="overflow:scroll;float:none;height:auto;">high content</div>
<div id="footer" style="clear:both;position:fixed;bottom:0px;"><h1>Footer</h1></div>
</div>
Это даст вам липкий нижний колонтитул. Ключ - позиция: фиксированная и нижняя: 0px;
К сожалению, это означает, что он также парит над любым контентом в scrollview. До сих пор, кажется, только Javascript, чтобы понять это, но я буду продолжать искать.