2011/11/02

Макет с выравненными колонками

Подкинули задачу. Макет страницы в 4 блока: хедер/футер, сайд/контент. Сайд с контентом должны быть оформлены в скругленные рамки одинаковой высоты. Под современные браузеры (допустимы прямоугольные рамки в IE8).

Изюминка в колонках одинаковой высоты, не таблица:)

Рамка рисунком

Сначала придумал вариант завернуть пару сайд/контент как <div style="display:inline-block;"> и оформить рамки колонок рисунком, залитым в подложку.

.tpl-side
.tpl-content

подложка с рисунком

  • - сложная подложка, рамка рисунком
  • + будет работать и в старых IE (через <div style="display:inline;zoom:1;">)

Таблица на CSS

А можно с помощью стилей превратить блоки в таблицу со свойственными плюшками: выравнивание колонок, заполнение окна, центрирование текста и т.д. При этом разметка останется семантической и браузеру для отрисовки не надо ждать пока закачается вся таблица. Весь макет:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
<meta http-equiv="Content-Type" content="text/xml; charset=UTF-8" />
<title></title>
<style type="text/css">
html,body {
 margin : 0;
 padding : 0;
 height : 100%;
 border : none;
}

div[class|="tpl"] {
 box-sizing  : border-box;
 -moz-box-sizing  : border-box;
 -webkit-box-sizing : border-box;
}

div.tpl-header, div.tpl-footer {
 background : #faa;
 height  : 80px;
 position : relative;
 z-index  : 1;
}
div.tpl-footer {
 height  : 70px;
 margin-top  : -150px;
}
div.tpl-page {
 background : #aaf;
 border-spacing : 15px;
 display  : table;
 height  : 100%;
 padding  : 80px 0 70px 0;
 position : relative;
 top  : -80px;
 width  : 100%;
}
div.tpl-side, div.tpl-content {
 background : #afa;
 border  : solid 1px #444;
 border-radius : 5px;
 border-spacing : 15px;
 display  : table-cell;
 padding  : 10px;
}
div.tpl-side {
 width  : 200px;
}
</style>

<!--[if lte IE 7]>
<style>
div.tpl-page, div.tpl-header, div.tpl-footer {
 display  : block;
}
div.tpl-side, div.tpl-content {
 display  : inline;
 margin  : 15px;
 vertical-align : top;
 zoom  : 1;
}
</style>
<![endif]-->

</head>
<body>

 <div class="tpl-header"> .tpl-header </div>
 <div class="tpl-page">
  <div class="tpl-side"> .tpl-side </div>
  <div class="tpl-content"> .tpl-content </div>
 </div>
 <div class="tpl-footer"> .tpl-footer </div>

</body>
</html>

Итак, .tpl-page - блок растянут на всё окно, разделен на 2 колонки .tpl-side и .tpl-content (сколько угодно), сверху и снизу отступы, в которые задвигаются .tpl-header и .tpl-footer.

Пробовал развить идею - хедер и футер представить частями таблицы, но тогда придётся вводить в разметку дополнительные элементы с display:table-column-group - вся семантика насмарку. Оставил как есть.

курим маны:

2012-01

Обнаружился любопытный дефект. В FF(3.6.25, 9.0.) при доктайпе html5, задвиганиe блоков .tpl-header, .tpl-footer с помощью отрицательного значения top растягивает контейнер html и после блока body появляется пустой отступ, размером соответствующим смещениям блоков .tpl-header, .tpl-footer. Лечится просто: вместо отрицательного значения top используем отрицательное значение margin-top. В данном случае, достаточно это сделать для .tpl-footer. Эффект редкий и при тесте в обновлённом FF(3.6.26, 10.0) не проявился.

2013-06 habrahabr: Верстка: два блока одинаковой высоты

Комментариев нет:

Отправить комментарий