30
07
09

Размещение трех блоков (колонок) на странице

Рубрики: Верстка
Тэги: ,

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

Известно также, что для решения данной задачи предусмотрено специальное правило, задающее “обтекание”, или иначе — float. Ну, хорошо, давайте возьмем следующую схему и попробуем применить к ней это полезное правило:

threeblocks1.gif

Голубой рамкой схематично обозначен общий контейнер, в котором у нас должны разместиться на одной горизонтальной линии три одинаковых блока с номерами 1, 2, 3. В листе стилей CSS мы первому блоку зададим такое правило:

#1 {float: left;}

Блоку номер 3 такое правило:

#3 {float: right;}

Но что нам делать с блоком номер 2? Какое правило задать ему: левое или правое “обтекание”? Вот именно на этом и спотыкаются многие начинающие верстальщики. По сути, нет никакой разницы, какое правило задать второму блоку. Но это в идеальных условиях. На деле же часто существует масса нюансов. К примеру, если это блоки из текста, но в каждом из них этого текста разное количество. Тогда возможна ситуация, когда один блок как бы “подлезает” под другой.

Поэтому чтобы раз и навсегда избавиться от подобных заморочек, есть очень простое решение, которое к тому же хорошо развивает пространственное мышление — штука для верстальщика весьма нужная и полезная. Следует упростить задачу. Если у нас будет всего лишь два блока, то и вопрос отпадет сам собой. А как из трех сделать два? Правильно! Нужно два из них объединить в один. Следующая картинка наглядно поясняет суть этого действа:

threeblocks2.gif

То есть, необходимо в коде страницы добавить еще один блок, в который войдут блоки 1 и 2. Назовем его, к примеру, subcontainer. Тогда в листе стилей CSS нам останется только прописать правила для этого нового блока, задав ему float: left; Внутри же него 1-й блок будет иметь все то же правило float: left;, а блок номер 2 — float: right;

Для наглядности приведу пример кода страницы и кусок листа стилей CSS:

<div id="container">
<div id="subcontainer">
<div class="1">Содержимое блока 1</div>
<div class="2">Содержимое блока 2</div>
</div>
<div class="3">Содержимое блока 3</div>
</div>

#subcontainer {float: left;}
#1 {float: left;}
#2 {float: right;}
#3 {float: right;}

rss Подпишитесь на RSS


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

  1. Денис Климонтов 30.07.2009 08:03

    Зачем такие сложности? Можно обойтись и одой оберткой.

    ‹div id=”container”›
    ‹div class=”1″›Содержимое блока 1‹/div›
    ‹div class=”2″›Содержимое блока 2‹/div›
    ‹div class=”3″›Содержимое блока 3‹/div›
    ‹div class=”clear”›‹/div›
    ‹/div›

    .1, .2, .3 {float: left;}
    .clear {clear: both;}

    Вся прелесть этого метода в том, что можно не ограничивать себя тремя блоками.

  2. Игорь Квентор 30.07.2009 08:37

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

  3. Денис Климонтов 30.07.2009 08:52

    Ну а кто же мешает задать каждому блоку ширину?

  4. gordi 30.07.2009 09:48

    Есть более простые решения.
    А уж от пустого блока с классом “clear”,
    вообще, давно пора отказаться.

  5. Игорь Квентор 30.07.2009 10:44

    :) Ребят, давайте так: есть иные способы? Окей! Покажите рабочие варианты. Это будет хотя бы полезно читателям.

  6. gordi 30.07.2009 11:16

    Забыл дать линк http://csslayouts.ru
    Примерная база будет прирастать :)

  7. .nornad 30.07.2009 22:58

    А на данный момент про три колонки есть только замануха “Макеты трехколоночные
    Скоро…”. Если уж рекламируете свой проект, делайте это хотя бы корректно. Сделали бы пример сначала, что ли…

  8. gordi 31.07.2009 00:43

    К сожалению нет времени, но будет приблизительно так: http://trifler.ru/blog/i/koncept/middle_border_lcr_h.htm

  9. .nornad 31.07.2009 01:03

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

  10. Светлана 01.08.2009 07:49

    Игорь, а зачем дизайн поменяли? Куда улыбочка делась?

  11. Игорь Квентор 01.08.2009 07:58

    Здравствуйте, Светлана! А захотелось вот обновить чуток шаблон. Пусть будет немного строже. :)

  12. Светлана 01.08.2009 12:02

    Я бы скорее ожидала появление “журнальной” темы, из тех, что сейчас более модные что-ли. А тут наоборот, в строгость потянуло. Мне буковок, что в фавиконе остались, не хватает. :)

  13. Игорь Квентор 01.08.2009 13:50

    Увы, до “журнальной” темы я еще не дорос, ибо там активно используются custom fields, с которыми нужно еще разобраться хорошенько.

  14. rust 04.08.2009 14:25

    Игорь, позвольте небольшое замечание - названия классов не должны начинаться с цифр.

  15. Игорь Квентор 04.08.2009 14:37

    Да, верно. Это был всего лишь пример, и номера стоят для наглядности.

  16. Андрей Морковин 13.08.2009 13:43

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

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

    Или есть какой-то более рациональный метод, который делает интересным применение блочной верстки?

    В примере, приведенном в статье, вообще не вижу необходимости гемороится с блоками. Чем, в данном случае, плоха таблица?

  17. abunbux 14.08.2009 00:21

    Вообще-то, для центральной колонки нужно задать margin-left и margin-right на ширину левой и правой колонок. Для центральной ширину ставить не надо. Тогда никуда она не будет подлезать.

  18. Игорь Квентор 14.08.2009 08:14

    abunbux, как вариант - можно. Но не забывайте, что IE по-своему относится к margin-ам. Если у вас дизайн состоит из массы деталей, которые нужно точно состыковать, то придется для IE выписывать в отдельный лист стилей свои правила.

  19. Игорь 25.08.2009 11:59

    ‹div id=”container”›
    ‹div class=”1?›Содержимое блока 1‹/div›
    ‹div class=”2?›Содержимое блока 2‹/div›
    ‹div class=”3?›Содержимое блока 3‹/div›
    ‹div class=”clear”›‹/div›
    ‹/div›

    .1, .2, .3 {float: left;}
    .clear {clear: both;}

    А мне понравился этот вариант, почему бы не сделать? действительно можно задать ширину)))

  20. Игорь 25.08.2009 13:02

    Как можно сделать такую же навигационную панель как в этом сайте http://7k.cz/ ?

  21. Игорь 25.08.2009 13:14

    Кстати в эксплорере 3 блок уходит вниз и вправо???
    А когда я ему задал маленькую ширину так вообще половина сместилась за границу???
    В то время как в мозиле все пучком???

  22. Игорь 26.08.2009 10:38

    С эксплорером вроде бы разобрался, все ровно как в мозиле,
    но есть одно но.
    В данном браузере все на много больше , чем в мозиле и это не очень красиво смотрится. Почему так? и как решить эту задачу(что бы размеры были одинаковы или примерно одинаковы на во всех браузерах)???

  23. Игорь Квентор 26.08.2009 11:01

    >>А мне понравился этот вариант, почему бы не сделать?

    Можно и так. Только если центральный блок будет недостаточно длинным, то третий блок “подлезет” под него.

    Что касается размеров в разных браузерах: ИЕ по-своему вычисляет отступы margin и это следует учитывать. Кроме того, в настройках браузера может быть задан размер шрифта. В ИЕ по-умолчанию установлен средний.

    Про навигационную панель на 7k.cz - какая именно особенность интересует?

  24. Игорь 26.08.2009 13:12

    Можно и так. Только если центральный блок будет недостаточно длинным, то третий блок “подлезет” под него.

    Ну да, я и так сделал по вашему примеру)))

    На счет навигационной панели, мне интересен тот факт, стирание рамки при наведении на ссылку мышкой(в месте ссылки) и фон у ссылок на сколько я понял сделан в фотошопе? или же это какое то свойство скрипта?

    И еще важный момент опять таки по поводу эксплорера, а как же грамотно совместить? Потому что в мозиле все и так очень мелко, а в эксплорере просто здоровенно)))
    Тот же сайт 7k.cz, я посмотрел он и в обоих браузерах смотрится нормально. Я конечно понимаю, что у него табличная верстка, но неужели нельзя, что-то придумать для блочной?

  25. Игорь 26.08.2009 14:20

    И вообще где можно найти хорошие беслпатные скрипты вертикального меню?

  26. Игорь (который заблудился в трех соснах) 26.08.2009 17:58

    Этот эксплорер меня вообще вырубает.
    Поставил цвет фона буквами не отобразил в то время как рамку показал, которую к слову тоже написал буквами.
    ПОставил в цифры только тогда все получилось

  27. Игорь Квентор 27.08.2009 14:08

    > На счет навигационной панели, мне интересен тот факт, стирание рамки при наведении на ссылку мышкой(в месте ссылки) и фон у ссылок на сколько я понял сделан в фотошопе?

    Да, это обычное свойство ссылки - hover. Есть две картинки. У одной справа полоска границы, у второй ее нет, но есть пара закруглений справа и обводка границы по левой стороне. Это хорошо видно, если сохранить страницу с картинками и разглядеть их потом в папке с сохраненными файлами.

  28. Игорь (который заблудился в трех соснах) 27.08.2009 14:51

    Спасибо Игорь)))
    А как же мне поступить с разными размерами в разных браузерах?

  29. Игорь Квентор 28.08.2009 11:21

    Тут надо проверять файл CSS. Возможно идет путаница с заданными размерами шрифтов. Например, в одном наборе (для body к примеру) указаны %, а в последующих то в пикселях (px), то в пунктах (pt). Нужно привести все к одной единице измерения.

  30. Игорь (который заблудился в трех соснах) 28.08.2009 11:32

    Окей проверю.
    А если не получится не могли бы вы принять мою папочку для проверки?

  31. Игорь 24.12.2009 14:39

    Доброго времени суток Игорь.

    Спасибо за хороший пример.
    Работает, очень сильно помогло.
    Но вот один вопрос. Почему нельзя через классы,
    ведь в классах, даже необязательно ни чего брать в субконтейнер.
    Просто левому меню прописать, float:left. Ну на худой конец так

    а в
    css

    .subkontainer{clear:both;}
    .left {float:left;}

  32. Игорь Квентор 27.12.2009 11:26

    Здравствуйте, тезка! Если использовать свойство clear:both; то по обоим сторонам этого блока уже ничего не будет “плавать”, поэтому применить его не получится.

  33. Даниил 14.01.2010 22:28

    Здравствуйте,меня интересует вопрос(не по уроку интересно у меня на сайте 3 колонки и та что посередине прописана через float: clearboth; и записана после первой и третей в коде))
    Можно ли сделать так ,чтобы все колонки имели одинаковую длину и при этом были растяжими(в зависимости от контента)?

  34. Игорь Квентор 15.01.2010 18:47

    Даниил, нет нельзя.

  35. Дмитрий 03.06.2010 11:06

    Игорь,я хочу ролик ютуба выровнять по центру,я применю
    ролик
    а можно что-то попроще ?

  36. Игорь Квентор 04.06.2010 11:33

    В каком смысле попроще?

  37. дмитрий 04.06.2010 11:39

    без применения . Может просто обычным тэгом для текста p-align text И так далее ?

  38. Игорь Квентор 04.06.2010 14:25

    Попробуйте :)

Трэкбеки

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