Фиксированный трёхколоночный макет

Влад Мержевич

Трехколоночный макет часто используется в тех случаях, когда двух колонок уже недостаточно или требуется особым образом разделить материал. Например, одна колонка отдается под навигацию, вторая под контент, а в третьей публикуются новости сайта или другая информация (рис. 5.13). Три колонки обеспечивают большую свободу выбора размещения материалов вроде иллюстраций, рекламных баннеров, объявлений и др,

Рис. 5.13. Трёхколоночный макет

Методы формирования колонок похожи на методы для двухколоночного макета, это применение свойств float и position. Независимо от способа структура кода похожа. Контейнером выступает слой layout, для которого задаётся общая ширина макета и выравнивание, внутри располагаются слои создающие колонки.

<div class="layout"> 
  <div class="nav">Левая колонка</div> 
  <div class="content">Центральная колонка</div> 
  <div class="sidebar">Правая колонка</div> 
</div>

Порядок слоёв в контейнере может меняться в зависимости от некоторых условий или вообще не играет роли, как в случае позиционирования.

Использование позиционирования

Для слоя layout устанавливается относительное позиционирование, а для слоёв nav, content и sidebar — абсолютное. При таком сочетании положение элементов меняется относительно родителя с помощью свойств left, right, top, bottom. Впрочем, из этого набора понадобится только left и right (пример 5.8).

Пример 5.8. Свойство position

XHTML 1.0CSS 2.1IECrOpSaFx

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Трёхколоночный макет</title>
  <style type="text/css">
   .layout { 
    width: 980px; /* Ширина макета */
    margin: auto; /* Выравнивание по центру */
    position: relative; /* Относительное позиционирование */
   }
   .nav, .content, .sidebar { 
    position: absolute; /* Абсолютное позиционирование */
    color: #FFF; /* Цвет текста */
   }
   .nav { 
    background: #7895A4; /* Цвет фона */
    width: 180px; /* Ширина */ 
   }
   .content { 
    background: #F0EAD6; width: 600px; color: #000;
    left: 180px; /* Положение от левого края */
   }
   .sidebar { 
    background: #C38A6D; width: 200px; 
    right: 0; /* Положение от правого края */
   }
  </style>
 </head>
 <body>
  <div class="layout">
   <div class="nav">Левая колонка</div>
   <div class="content">Центральная колонка</div>
   <div class="sidebar">Правая колонка</div>
  </div>
 </body>
</html>

Из-за того, что координаты колонок устанавливаются относительно родителя, не имеет значение порядок слоёв в коде. Можно поменять слои местами, чтобы контент загружался первым, а навигация последней или наоборот.

Использование float

Свойство float в силу своей универсальности не раз выручало нас, вот и в этот раз с его помощью можно создать трёхколоночный макет, причём двумя разными методами. Первый основан на том, что float добавляется ко всем слоям с одновременным указанием ширины (пример 5.9).

Пример 5.9. float для всех колонок

XHTML 1.0CSS 2.1IECrOpSaFx

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Трёхколоночный макет</title>
  <style type="text/css">
   .layout { width: 980px; margin: auto; }
   .nav, .content, .sidebar { 
   float: left; /* Плавающий элемент */
  }
  .nav { width: 180px; background: #7895A4; color: #FFF; }
  .content { width: 600px; background: #F0EAD6; }
  .sidebar { width: 200px; background: #C38A6D; color: #FFE; }
 </style>
 </head>
  <body>
   <div class="layout">
    <div class="nav">Левая колонка</div>
    <div class="content">Центральная колонка</div>
    <div class="sidebar">Правая колонка</div>
  </div>
 </body>
</html>

Естественно, суммарная ширина всех колонок не должна превышать ширину макета. В коде слои идут слева направо, как показано в примере 5.8.

Второй метод использует сочетание свойств float и margin. Для левой колонки значение свойства float устанавливается left, а для правой — right, а также их ширина. Центральной колонке задаётся отступ слева и справа на соответствующую ширину левой и правой колонки.

.nav { /* Левая колонка */
 float: left; /* Обтекание справа */
 width: 180px; /* Ширина колонки */
}
.sidebar { /* Правая колонка */
 float: right; /* Обтекание слева */
 width: 200px; /* Ширина колонки */
}
.content { /* Центральная колонка */
 margin: 0 200px 0 180px; /* Отступы слева и справа */ 
}

При этом порядок слоёв также меняется, поскольку плавающие элементы должны идти первыми.

<div class="nav">Левая колонка</div>
<div class="sidebar">Правая колонка</div>
<div class="content">Центральная колонка</div>

Полный код приведён в примере 5.10.

Пример 5.10. Использование float и margin

XHTML 1.0CSS 2.1IECrOpSaFx

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Трёхколоночный макет</title>
  <style type="text/css">
   .layout { width: 980px; margin: auto; }
   .nav, .content, .sidebar { 
    color: #FFF; /* Цвет текста */
   }
  .nav { background: #7895A4; width: 180px; float: left; }
  .sidebar { background: #C38A6D; width: 200px; float: right; }
  .content { 
   background: #F0EAD6; color: #000;  
   margin: 0 200px 0 180px;
  }
  </style>
 </head>
 <body>
  <div class="layout">
   <div class="nav">Левая колонка</div>
   <div class="sidebar">Правая колонка</div>
   <div class="content">Центральная колонка</div>
  </div>
 </body>
</html>

CSS по теме

Не выкладывайте свой код напрямую в комментариях, он отображается некорректно. Воспользуйтесь сервисом cssdeck.com или jsfiddle.net, сохраните код и в комментариях дайте на него ссылку. Так и результат сразу увидят.