как совместить заголовок с фиксированной высотой с гибким макетом страницы - PullRequest
3 голосов
/ 05 марта 2009

Проблема: как совместить фиксированную высоту с гибким макетом страницы?

  • Высота "bodyDiv" должна быть: 100% (window.innerWidth меньше? Px ).
  • Высота "a" & "b" должна быть: 50% от (body.div.height меньше? Px ).

<HTML>
    <body>
        <div id="headerDiv" style="height:?px">fixed height</div>
        <div id="bodyDiv" style="height:100%">flexible height
            <div id="a" style="height:50%">flexible height</div>
            <div id="x" style="height:?px">fixed height</div>
            <div id="b" style="height:50%">flexible height</div>
            ...
        </div>
    </body>
<HTML>

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

CSS-выражения тоже не вариант, так как к моему знание, которое в любом случае будет ограничено IE 5-7.

Итак, потратив 3 дня, пытаясь исправить это, используя любой Сочетание отрицательных и положительных полей, я наконец Я должен признать свое поражение, наконец, попросив общественную помощь.

Ответы [ 4 ]

6 голосов
/ 05 марта 2009

С риском потерять мою репутацию.

Я бы предложил сделать что-то вроде этого:

<table style="height:100%;width:100%">
  <tr style="vertical-align:top;height:50px;background-color:#faa;">
    <td>Fixed</td></tr>
  <tr style="vertical-align:top;background-color:#afa;">
    <td>Flexible</td></tr>
  <tr style="vertical-align:top;height:100px;background-color:#faa;">
    <td>Fixed</td></tr>
  <tr style="vertical-align:top;background-color:#afa;">
    <td>Flexible</td></tr>
</table>

Это будет оскорблять верстку v пуристов семантики, но оно выполнит свою работу и избавит вас от нескольких дней возни с div и CSS.

P.S. Это просто иллюстрация, стили должны действительно быть во внешней таблице стилей и связаны идентификаторами элементов.

1 голос
/ 05 марта 2009

Боюсь, это невозможно сделать с помощью чистого CSS / HTML. Я был бы самым счастливым, если бы я был неправ. Было несколько связанных вопросов по SO (не прочитал их все, некоторые из них могут касаться немного разных проблем):

  1. Сделать div заполнить высоту оставшегося пространства экрана
  2. Как заставить блок DIV расширяться до нижней части страницы, даже если у него нет содержимого?
  3. Как создать div, чтобы заполнить все пространство между верхним и нижним колонтитулами div
  4. Как я могу масштабировать div до 100% высоты и ширины внутри другого элемента

Существуют различные «решения», но ни одно из них не является идеальным. Дайте мне знать, если вы нашли лучший способ решить эту проблему.

0 голосов
/ 11 мая 2009

Ну, это та же самая бесконечная история о таблицах и CSS для разметки. CSS-пурист сказал бы, что макеты CSS быстрее загружаются? быстрее рендериться браузером? меньше кода ??? В реальной жизни и при наличии «визуальных» стилей на соответствующем листе CSS макеты таблиц содержат гораздо меньше символов, чем при использовании CSS. Не веришь в это? Просто попробуйте сделать полную высоту браузера, фиксированную ширину, горизонтально по центру, заголовок / 2 столбца, содержимое / нижний колонтитул, простой макет с CSS и таблицами ... получить код, вставить в Word и подсчитать количество слов. Код CSS не короче в 2 раза, чем код таблицы! Скажите, сколько CSS-вещей вам нужно сделать, чтобы скопировать текст шириной 100% и высотой 100% в середине макета экрана, например:

<table width=100% height=100%><tr><td align="center" valign="middle">Some text</td></tr></table>

или

* {
margin:0px;
padding:0px;    
}

html, body {
height:100%;
min-height: 99%;
}

.test {
border: 1px solid #cccccc;
height:100%;
position:relative;
}

.test2{
display:inline;
height:24px;
width:24px;
left:50%;
top:50%;
}
<div class="test"><div class="test2">test</div></div>

Так что CSS лучше для макета, потому что что? Проще поддерживать? Скажите, сколько раз кто-нибудь настроил бы макет страницы, когда он полностью готов и работает? Если только нет жены / мужа в пределах досягаемости да, правильно, "больше" "меньше" правильно, как 1 0? Лучший дизайн / разделение кода? Конечно, вашему дизайну не нужны эти DIV, SPAN, P или любые другие теги, которые вы хотите.

Я всегда думаю: используйте гибридный код, чтобы делать все, что вы хотите, за меньшее время, чтобы отобразить, как вы хотите, независимо от того, CSS или таблицы или таблицы CSS +! Для меня таблицы как для макета являются лучшими, CSS для оптимизации и визуализации визуальных элементов. В конце концов, клиенты не будут заботиться об огурце, если их сайты сделаны с помощью css или со столами или с использованием дерева и гвоздей. :) Скажите мне вескую причину, почему я должен использовать чистый подход CSS, чтобы получить, скажем, 3 столбца, полностью центрированные по ширине, фиксированный средний столбец, полная высота браузера. БЕЗ CSS-настроек, исправлений, хаков ... все действительно работают на веб-сайте Создание знает, что рендеринг таблиц более визуально согласован и требует меньше кода, чем CSS, во всех браузерах.

Быстрый тест :) <div width="100%" height="100%">test</div> будет ли это работать в одиночку ??

0 голосов
/ 06 марта 2009

Следующее делает именно то, что я хочу, а именно:

  • страница ровно 100% ширины и высота
  • верхний и нижний колонтитулы зафиксированы по высоте
  • все остальные элементы являются гибкими в ширина и высота
  • гибкие размеры указаны в количествах на общую сумму 100%
  • статические размеры указаны в пикселях
  • для страницы не требуется JavaScript нагрузка / размер
  • для страницы не нужны выражения css нагрузка / размер
  • нет ужасной задержки перерисовки страницы на странице событие загрузки
  • нет ужасной задержки перерисовки страницы при изменении размера событие
  • скрипт для сплиттеров будет простой из-за 4) и 5)

<html>
  <style type="text/css" media="all">
    html,body,table,div{height:100%;width:100%;}
    html * {outline:0;border:0;margin:0;padding:0;border-collapse:collapse;border-spacing:0;}
    div{float:left}
  </style>
  <body>
    <table>
      <tr style="height:100px;background-color:red;"><td>Fixed</td></tr>
      <tr style="height:100%;"><td>
        <div style="width:25%;margin-right:-4px;background-color:green;">Flexible</div>
        <div style="width:8px;background-color:silver;cursor: e-resize;"></div>       
        <div style="width:50%;margin-right:-4px;margin-left:-4px;background-color:blue;">Flexible</div>
        <div style="width:8px;background-color:silver;cursor: e-resize;"></div>     
        <div style="width:25%;margin-left:-4px;">
          <div style="height:33.33%;margin-bottom:-4px;margin-top:-0px;background-color:green;">Flexible</div>
          <div style="height:8px;background-color:silver;cursor: n-resize;"></div>          
          <div style="height:33.33%;margin-bottom:-4px;margin-top:-4px;background-color:blue;">Flexible</div>
          <div style="height:8px;background-color:silver;cursor: n-resize;"></div>          
          <div style="height:33.33%;margin-bottom:-0px;margin-top:-4px;background-color:yellow;">Flexible</div>
        </div>
      </td></tr>
      <tr style="height:20px;background-color:red;"><td>Fixed</td></tr>
    </table>
  </body>
</html>

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


Я бы хотел сделать это с помощью divs и css только так, как предложил Дэвид, но, как сказано в моем первоначальном посте, я просто не "смог". Прочитайте ссылки, которые вы предложили, и сообщу о «идеальном» решении, если мне удастся его решить. Спасибо за эти ссылки, Дейв.


Новая незначительная проблема: сплиттеры должны иметь 4px ширину / высоту, и они есть. Как ни странно, мне пришлось использовать 8px для разделителей и -4px * 2 для отрицательных полей окружающих элементов. Есть предложения?


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