Верстка трехколоночного макета страницы с помощью CSS

19 сентября 2007 г.

В тот момент, когда я стал переходить на дивовую верстку, а произошло это почти год назад (как быстро летит время), одним из серьезных уроков, которые я должен был освоить, был простой и удобных способ верстки трехколоночного макета страницы с использованием <div>‘ов и каскадных таблиц стилей.

Хорошо, когда кто-то уже сделал подобное до тебя, не приходится заново “придумывать колесо”. Достаточно найти готовое решение, которое следует хорошенько запомнить и адаптировать под себя, если потребуется. Моим замечательным помощником по данному вопросу стал уже не однократно упоминаемый мной сайт Layout Gala, на котором предлагается множество хороших макетов для верстки страниц со всевозможными вариантами представления контента.

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

Особенности данного макета:

  • Текучая (резиновая) верстка - растяжка происходит за счет контентной части, левая и правая колонки фиксированные. Я так полагаю, что этот макет можно изменить и под одновременное растяжение всех 3-х частей. Но пока мне этого не приходилось делать.
  • Используется фактор внутренней поисковой оптимизации - блок с контентом расположен в коде до начала левой и правой колонки. Этот один из моих любимых моментов в дивовой верстке. Контент начинается практически в самом начале разметки страницы. При желании можно и хэдер, если он достаточно большой, разместить ниже кода контента.

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

Структура HTML-кода

При использовании оригинального кода макета с Layout Gala в нашем “любимом” IE наблюдался следующий баг - при быстром сужении окна браузера левая колонка съезжала к центру. Чтобы от этого избавиться, я поместил блоки контента и обоих колонок в дополнительный контейнер с id=”container” и указал ему ширину в 100%.

  1. <html>
  2. <body>
  3.  
  4. <div id="wrapper">
  5.  
  6.   <div id="header"></div>
  7.  
  8.   <div id="container">
  9.  
  10.     <div id="content">
  11.       <div id="text">
  12.  
  13.       </div>
  14.     </div>
  15.  
  16.     <div id="left"></div>
  17.  
  18.     <div id="right"></div>
  19.  
  20.     <div class="clear"></div>
  21.   </div>
  22.  
  23.   <div id="footer"></div>
  24.  
  25. </div>
  26.  
  27. </body>
  28. </html>

CSS-таблицы

Приведу здесь только ту часть CSS-кода, которая формирует 3 колонки в блочном варианте верстки (остальное будет в примере). Прошу обратить внимание, что для того, чтобы сработало CSS-свойство #container {width: 100%;} для устранения бага в IE, необходимо одновременно задействовать правила минимальной ширины для основного блока (width: expression и min-width).

  1. #wrapper {
  2.   width: 100%;
  3.   width: expression((documentElement.clientWidth||document.body.clientWidth)<;995?'1000px':'');
  4.   min-width: 1000px;
  5. }
  6. #container {width: 100%;}
  7. #content {
  8.   width: 100%;
  9.   float: left;
  10. }
  11. #text {margin: 0 250px;}
  12. #left {
  13.   float: left;
  14.   width: 250px;
  15.   margin-left: -100%;
  16. }
  17. #right {
  18.   float: left;
  19.   width: 250px;
  20.   margin-left: -250px;
  21. }

Пример

Можно посмотреть на готовый пример макета страницы в три колонки с использованием блочной верстки (2 колонки фиксированные).

автор: Dimox | рубрика CSS-верстка | TrackBack

Комментарии (22): »

  1. Возможно, единственным недостатком, является то, что колонки не одинаковой высоты.
    В своих шаблонах, решал эту проблему иначе.
    Но там тоже минус сложности с резиной.

    @
  2. Да, если в моем примере, в случае с резиновостью, будет нужна одинаковая высота колонок, то придется использовать некоторые хитрые приемы.

    А твое решение высоты колонок мне очень понравилось (помню статью), только, действительно, оно подходит лишь для фиксированной ширины.

  3. Отличный способ. Небольшое замечание: width: 100%; для #wrapper и #container ,
    лишнее. И так растянется)

    @
  4. webvector, для #wrapper, возможно, и не обязательно, но для #container требуется. Причину я описал в статье.

  5. 5
    Хомячина ( 1 год назад ) Ответить

    Классно, спасибо за советы!

  6. Нигде не могу найти , что значит конструкция
    * {margin: 0;padding: 0; font: 14px/17px “Trebuchet MS”, Tahoma, Arial}
    в определении стиля.

    Если не сложно, скиньте ссылку, где это можно почитать на мейл losk@onego.ru

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

    Ссылку не знаю, поищите по ключевым словам “обнуление стилей”.

  8. Спасибо! Только что воспользовался, за полчаса переверстал старый проект, стало гораздо лучше :)

    @
  9. Неплохой шаблон, кратко и заточено под раскрутку. А проблема с разной высотой цветных колонок легко решается использованием графического бэкграунда для блоков container и/или body/html. Задается бэкграунд для левой и правой частей отдельно, с шириной картинки равной ширине боковой колонки.

  10. Подскажите, пожалуйста, как можно сделать колонки одинаковыми по высоте?
    Леву без проблем - подставляю рисунок фона #left и #container.
    Для правой подставляю её фон #right, а вот ниже колонки - как подставить?
    Пробовал ставить в контент и указывать отступ фона, но, само собой не вариант, ибо при растягивании плывёт. (по рецепту http://www.communitymx.com/content/article.cfm?page=2&cid=AFC58)

    ПОМОГИТЕ, плиз!

    @
  11. @
  12. gordi, ты наверное линк попутал. Та статья не об этом. Может дашь, который ты имел ввиду? Спасибо.

    @
  13. Gruz, gordi дал правильную ссылку. В той статье есть ссылка на страницу с примерами - http://trifler.ru/blog/layouts2.html

  14. Я видел ту страницу, но там всё немного не то. 3-хколоночный шаблон там не резиновый по ширине. :-(
    Нашёл по-моему именно то: http://www.pmob.co.uk/temp/3coltest-2.htm
    Но надо ещё проверить.

    @
  15. Вот здесь еще рассматривается этот вопрос - http://blog.sjinks.org.ua/css/209-cross-browser-liquid-three-column-layout-full-height/

  16. Большое спасибо! По-моему то, что надо. Читаю.

    @
  17. Gruz>Я видел ту страницу…
    А с чего вы взяли что она не резиновая?
    Область контента резиновая и это параметр регулируется.
    Или вам надо чтобы все колонки были резиновые?

    @
  18. Она в Лисице резиновая, а в ИЕ - нет (или наоборот). Я пробовал с разными параметрами.

    @
  19. В IE6(7), OPERA9.23, OPREA9.5, FF2.014, FF3
    Все, как и заявлено в статье.
    На странчке примера, специально показан блок с фиксированной шириной больше заданного min-width.
    В чем вы смотрите?

    @
  20. Мы говорим про этот пример?
    http://trifler.ru/blog/i/layouts/example/left_content_right.htm
    В этом виде он фиксированный.
    уменьшил min-height до 770 пкс.
    А максимальный убрал. Вроде в ИЕ7 и ФФ3 нормально.
    Перед тем была проблемма, наверное что-то другое поменял. Спасибо большое!

    @
  21. Все примеры изначально работают.
    Не однократно проверены в боевых условиях.
    Аккуратность и внимательность не повредит :)

    @
  22. Спасибо огромное! Давно искал хороший дивовый шаблон и тут - такой подарок:)

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

Помощь по добавлению кода и форматированию текста в комментарии:
  1. Как отформатировать текст комментария?

    Для этого необходимо использовать HTML-теги, например, <blockquote>, <a>, <strong>, <em> и другие.

  2. Как вывести в комментарии HTML-тег?

    Для этого необходимо заменить угловые скобки < и > на их ASCII-код - соответственно &lt; и &gt;.

    Например, чтобы вывести в комментарии тег <br />, используйте следующую запись: &lt;br /&gt;

  3. Как вставить пример кода без подсветки синтаксиса?

    Для этого используйте запись вида <code>ваш код</code>. При этом для визуального переноса строк кода необходимо задействовать соответствующий HTML-тег. Угловые скобки в коде НУЖНО заменять (см. пункт 2).

  4. Как вставить пример кода с подсветкой синтаксиса?

    Для этого используйте запись вида <code lang="html">ваш код</code>, где в параметре lang указывается нужный язык. Поддерживаемые языки: html, css, php, javascript и другие. Угловые скобки в коде в данном случае НЕ НУЖНО заменять.

Отправляя комментарий, Вы автоматически принимаете правила комментирования на этом блоге.

Правила комментирования на блоге dimox.name:

  1. Первый комментарий всегда проходит премодерацию.
  2. В поле "URL блога" можно указывать только ссылку на главную страницу Вашего блога. Ссылки на прочие веб-ресурсы (в том числе блоги/сплоги, созданные не для людей) будут удалены.
  3. Запрещается использовать в качестве имени комментатора слоганы/названия сайтов, рекламные фразы, ключевые и т.п. слова. В случае несоблюдения этого условия имя изменяется по усмотрению владельца блога. Просьба указывать нормальное имя или ник.
  4. Весьма вероятно, что короткий и неинформативный комментарий вида "Спасибо!", "Интересная статья", будет удален. Исключение составляют знакомые автору блога комментаторы.

Подписаться, не комментируя