Таким образом, у меня есть следующая структура
<div id="container">
<div id="head"></div>
<div id="body"></div>
<div id="foot"></div>
</div>
Я только использую идентификаторы в целях иллюстрации, таким образом, это даже не обязательно для полной страницы.
Я хочу, чтобы мой контейнер указал фиксированный размер... или относительный размер, не имеет значения. Позволяет для пользы аргумента, говорят 300 пкс высотой. Также overflow: hidden
Я хочу, чтобы голова/нога расширилась для установки содержанию в себе, таким образом, height: auto
достаточно.
Я хочу, чтобы тело расширилось для установки остающемуся пространству промежуточная голова и нога. Если содержание является слишком большим, то прокрутите (overflow: auto
).
height: 100%
на #body
не работает, потому что затем это получает высоту 300 пкс как родитель и продвигает часть себя и нижнего колонтитула из родителя.
Наличие головы и ноги position: absolute
не работает потому что путем вынимания их из потока документации, некоторого содержания #body
скрыт. Для фиксации этого, мы можем использовать padding-top/нижнюю часть, но мы не можем установить a padding-top: xxpx
/padding-bottom: xxpx
на #body
потому что мы не знаем необходимой высоты головы/нога следовательно, почему они height: auto
.
Править:
Я пытался преобразовать контейнер/голову/тело/ногу в таблицу где #body
height: 100%
. Это работает отлично за исключением того, что #body
не прокрутит, если содержание станет слишком большим, вместо этого вся таблица расширяется для показа всего содержания. Это не желаемое поведение, поскольку мне нужно #body
прокручивать, нет #content
или это - родитель.
Какие-либо предложения?
Единственное решение, которое сразу приходит на ум, - это display: table-cell, хотя вы сталкиваетесь с проблемой отсутствия поддержки в ie6 и ie7.Может быть, предоставить правило для хороших браузеров и некоторый javascript для вычисления разницы в высоте, например?
Изменить:
Вот другой подход - использование jQuery для вычисления смещения. Имейте в виду, что это всего лишь быстрая и грязная попытка - ее нужно будет протестировать в браузере, и вам понадобится простая обработка ошибок и т. Д., Но это может быть отправной точкой.
Не уверен, что вам нужен javascript, но я не вижу, чтобы это было сделано в чистом CSS.
Я изменил идентификаторы на классы, чтобы вы могли иметь несколько блоков fixedHeight:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js'></script>
<script>
$(function() {
$(".fixedHeight").each(function() {
var head = $(this).find(".head");
var body = $(this).find(".body");
var foot = $(this).find(".foot");
body.css("margin-top", head.height()).css("margin-bottom", foot.height());
});
});
</script>
<style>
.head {
background-color: red;
position: absolute;
top: 0;
width:100%;
}
.body {
background-color: blue;
color: white;
overflow: auto;
position:absolute;
top:0;
bottom:0;
width:100%;
margin:2.5em 0;
}
.foot {
background-color: green;
position: absolute;
bottom: 0;
width:100%;
}
.container {
background-color: #aaa;
border: 10px solid orange;
height: 300px;
width: 30%;
position: absolute;
}
</style>
</head>
<body>
<div class="container fixedHeight">
<div class="head">
<h1>Header Content</h1>
</div>
<div class="body">
<p>Body Content</p>
<p>Body Content</p>
<p>Body Content</p>
<p>Body Content</p>
<p>Body Content</p>
<p>Body Content</p>
</div>
<div class="foot">
<p>Footer Content</p>
</div>
</div>
</body>
</html>
Хорошо, вот небольшое исследование, которое я провел, чтобы вроде как заставить это работать.
#head {
background-color: red;
width: 100%;
position: absolute;
top: 0;
left: 0;
}
#body {
background-color: blue;
color: white;
border: 0 none;
overflow: auto;
height: 100%;
padding-top: 2.5em;
padding-bottom: 2.5em;
box-sizing: border-box;
webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
}
#foot {
background-color: green;
width: 100%;
position: absolute;
bottom: 0;
left: 0;
}
#container {
background-color: #aaa;
border: 10px solid orange;
height: 300px;
width: 30%;
overflow: show;
position: absolute;
}
Предполагается, что я могу вычислить размеры #head
и #foot
и установить общий размер для заполнения соответствующего местоположения #body
. Это вытолкнет содержимое тела из области, которую занимает # голова / # ступня из-за их абсолютного позиционирования.Проблема здесь в том, что полоса прокрутки обрезается частично сверху / снизу, потому что смещается только контент, а полоса прокрутки - нет.
Для ширины это не проблема.