Трехколоночный макет на CSS с одинаковой высотой колонок

Представляю Вашему вниманию еще один 3-хколоночный макет страницы, реализованный с помощью XHTML и CSS.

Вот так он выглядит в миниатюре:

Особенности:

  • Оба сайдбара (левая и правая колонки) расположены с правой стороны. Такой тип страницы сейчас очень популярен, он используется на многих блогах.
  • HTML-код основной колонки расположен до начала кода обоих сайдбаров.
  • Все 3 колонки визуально растягиваются одинаково по вертикали при увеличении высоты одной из них. При этом не используются изображения.
  • Универсальность – макет можно использоваться как в случае с фиксированной шириной страницы, так и в случае с “резиновой” шириной. Для этого необходимо применить соответствующие CSS-свойства у 3-х блоков (в примере есть комментарии).
  • Кроссбраузерность проверена в основных популярных браузерах: Opera 9.23, FireFox 2.0, IE 6, IE 7, Safari/Win.
  • Валидный XHTML, валидный CSS.

HTML-код

Основа макета выглядит следующим образом:

<html>
<body>

<div id="wrapper">

  <div id="header"></div>

  <div id="container">

    <div id="sub-container">
      <div id="wrpr">

        <div id="content">
          <div id="text"></div>
        </div>

        <div id="left"></div>

      </div>
    </div>

    <div id="right"></div>

  </div>

  <div id="footer"></div>

</div>

</body>
</html>

В связи с тем, что в “резиновом” варианте в Internet Explorer 7 наблюдался небольшой отступ справа от правой колонки, пришлось задействовать дополнительный контейнер #wrpr. При фиксированной верстке данный контейнер не нужен.

CSS-код

Здесь публикую только код, отвечающий за расположение и визуализацию колонок. Все остальное в примере.

#wrapper {
  /* для фиксированной ширины */
  width: 900px;
  margin: 0 auto;

  /* для "резиновой" ширины
  width: expression((documentElement.clientWidth||document.body.clientWidth)<995?'1000px':'');
  min-width: 1000px; */
}
#container {
  width: 100%;
  background: #D5FFD5; /* фон основной колонки */
}
* html #container {height: 1%;}
#container:after {
  /* закрываем плавающие блоки */
  content: '.';
  display: block;
  clear: both;
  visibility: hidden;
  height: 0;
  line-height: 0;
}
#sub-container {
  float: left;
  border-right: 200px solid #BFF2FF; /* фон правого сайдбара */

  /* для фиксированной ширины */
  width: 700px;

  /* для "резиновой" ширины
  width: 100%;
  margin-left: -200px; */
}
#wrpr {
  /* для "резиновой" ширины
  margin-left: 200px; */
}
#content {
  width: 100%;
  float: left;
}
#text {
  border-right: 200px solid #FFF2BF; /* фон левого сайдбара */
}
#left {
  float: left;
  width: 200px;
  margin-left: -200px;
  background: #FFF2BF; /* фон левого сайдбара */
  position: relative;
}
#right {
  float: left;
  width: 200px;
  margin-left: -400px;
  background: #BFF2FF; /* фон правого сайдбара */
  border-left: 200px solid #FFF2BF; /* фон левого сайдбара */
}

Пример

Смотрим готовый пример страницы, сверстанной описанным методом.

Для удобства можно скачать архив с примером универсальной трехколоночной страницы на CSS.

* * *

Аренда оптического волокна.

Комментарии (24)

  1. 25 ноября 2007 г. в 21:26

    Оба сайдбара (левая и правая колонки) расположены с правой стороны.

    Звучит дико :)
    Лично я против использования раскраски через border. По эстетическим причинам и по причинам проблемного редизайна таких макетов.

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

      1. Shustry
        17 июня 2010 г. в 12:57 / ответ на коммент void

        Да простит их гуру вёрстки, ибо не ведуют дети, что лепечут :)
        А способ реальный. Сам его давно юзаю. Есть другое решение: использовать бэкграунд для родителя, который уже 100% в высоту (например body). Но способ с бордерами мне, лично, больше нравицо. Во первых не нужен лишний файл-бэкграунд. Во-вторых, кошерней смотрицо в режиме “без графики”.
        Пример, где я использовал: laysa.ru

  2. 26 ноября 2007 г. в 19:02

    Не вижу ничего проблемного в редизайне макетов такого типа.

  3. ASh
    26 ноября 2007 г. в 19:27

    Я, конечно, тоже поддерживаю мысль, что, по сути, использование бордера как места под колонку нелогично и вообще (действительно) дико. Но на практике мы действительно имеем проблему с кроссбраузерной версткой трехколоночной страницы. Те же отрицательные отступы аналогично должны быть названы “дикими”. Поэтому, пусть каждый для себя решает, что он будет использовать в жизни. Я думаю и этот способ имеет право на жизнь если он реально работает. А вам, Dimox, спасибо за хорошо описанный вариант.

  4. 26 ноября 2007 г. в 20:21

    Я, конечно, понимаю нелогичность такого метода разметки. Но дивовая верстка не дает возможность использовать такие же средства представления страницы, как с помощью таблиц (виной все та же пресловутая кроссбраузерность), например, вытягивание на вcю высоту экрана, поэтому, используя дивы приходится применять различные трюки, чтобы получить нужный эффект. ИМХО, с CSS2 это неизбежно. И в этом нет ничего страшного.

    ASh, пожалуйста ;).

  5. 26 ноября 2007 г. в 20:25

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

  6. 26 ноября 2007 г. в 20:35

    Мангуст, не все, что предлагается – для массового использования.

  7. Взлом-щик
    27 ноября 2007 г. в 15:34

    А если сделать ширину не фиксированного размера а 100%, все колонки останутся на своих местах? Не люблю, когда меня искусственно ограничивают и загоняют в определенные рамки…, это всеравно что написать на сайте: “сайт нормально отображается только через Internet Explorer”

  8. 27 ноября 2007 г. в 17:47

    Да, конечно колонки останутся на своих местах.

  9. gordi
    27 ноября 2007 г. в 19:25

    Наезд текста на картинку на реальном сайте надо поправить :)

  10. 27 ноября 2007 г. в 22:30

    gordi, я когда и верстал, и писал эту статью, вспоминал тебя, потому что у меня практически то же самое получилось :)

    И еще. Я хотел показать этот вариант именно с использованием бордюров.

  11. gordi
    27 ноября 2007 г. в 23:04

    Как ты наверно помнишь, делал с border-ом дизай для LastoBlog :)
    Мороки там было не меряно :)
    Сейчас думаю на резиновый контент переходить.
    С Вадимом, уже обсуждал этот вопрос.
    Слишком уж у него дизайн узнаваем :)

  12. 27 ноября 2007 г. в 23:24

    Да, помню, конечно. Бордюров там немеряно ))). Так у него еще в самом начале типа резинового и был диз.

    На счет узнаваемости – как он может быть не узнаваем, если блог популярен? Или ты имешь в виду, что схожие дизы используются на многих других сайтах?

  13. gordi
    27 ноября 2007 г. в 23:34

    >Так у него еще в самом начале типа резинового и был диз.
    Так то еще на таблицах было :)
    Практически все используют диз по дефолту.
    Клонов пруд пруди, лень наверное самим, что либо менять
    или не могут, работает и ладно :)

  14. 28 ноября 2007 г. в 11:53

    Во всем сказанном согласен с тобой.

  15. Владимир
    22 июня 2008 г. в 20:44

    Это все хорошо, конечно, но…
    Столкнулся сейчас с такой же проблемой, но ещё осложненной тем, что футер должен быть всегда прилеплен к низу.
    Может подскажете, что-нибудь?

  16. 22 июня 2008 г. в 23:03

    Владимир, в этой статье описаны возможные способы.

  17. Владимир
    23 июня 2008 г. в 12:07

    Спасибо, почитаем!

  18. 4 января 2009 г. в 19:11

    Спасибо – скачал оба дизайна. С версткой на DVD у меня пока не очень(

  19. ThePlace
    24 марта 2010 г. в 14:57

    В IE 5.5 криво отображается правая колонка

    1. 24 марта 2010 г. в 16:14 / ответ на коммент ThePlace

      Извините, вы в каком веке живете? =)

  20. ps
    20 октября 2010 г. в 13:50

    А как сделать так, чтобы между колонками были отступы? Колонки имеют background, но между ними прозрачные отступы и просвечивался основной фон страницы?

    1. Владимир
      20 октября 2010 г. в 18:03 / ответ на коммент ps

      Сделать это можно через задание ширины колонок и отступов (margin).

Ваш комментарий

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код