Как сделать колонки одной высоты

Как сделать колонки одной высоты 637

июня 16, 2009

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

Правильный способ

Наиболее правильным на сегодняшний день способом верстки многоколоночных макетов является использование CSS-свойства display: table-, например, вот так:

<div style="display:table-cell;width:50%"> <div style="display:table-row"> <div style="display:table-cell;background:red">column 1</div> <div style="display:table-cell;background:blue">column 2</div> </div> </div>

Проблема в том, что это не работает в IE6/7, которые составляют значительную долю рынка браузеров. Что ж, придется воспользоваться альтернативным способом.

Альтернативный способ

Как обычно, сначала разберем проблему на составляющие. Предположим, у нас есть двухколоночный макет, первая колонка шириной 25% от контейнера, а вторая — 50%:

col1

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

Наиболее очевидным и стабильно работающим способом создания колонок из блоков является использование CSS-свойства float. Однако, как вы уже поняли, это не решит нашей проблемы с колонками разной высоты:

col2

Какие свойства есть у float-блоков? Они находятся в потоке, значит, могут влиять на высоту контейнера. То есть если мы обрамим блоки контейнером и создадим у него правильный контекст форматирования (либо через clear-элемент, либо через overflow: hidden), наш контейнер примет высоту наибольшей колонки:

col3

А если мы добавим не один, а два контейнера, то оба они будут высотой с наибольший блок:

col4

Обращаем внимание на размеры колонок: первая 25%, вторая 50%. То есть вторая колонка ровно в 2 раза больше первой. Соответственно, если первому — внешнему — контейнеру мы задаим ширину в 25%, а второму — внутреннему — 200% (две ширины внешнего контейнера, что будет соответствовать 50% относительной всей страницы) и сместим его на ширину контейнера вправо, мы получим подобие того, чего хотим добиться:

col5

Осталось разобраться с текстовыми колонками. У нас появился новый контейнер, от которого рассчитываются размеры колонок. Так как левая колонка должна быть шириной в 25% от страницы, а ширина внутреннего контейнера равна 50% от страницы, то новая ширина колонки будет равна 50% (50% × 0.5 = 25%). Сама колонка не должна влиять на ширину, но все еще должна быть в потоке, поэтому подавляем влияние ширины колонки на поток с помощью margin-right:-100%, а сам элемент смещаем влево на половину ширины контейнера, то есть на 50%. Получаем именно то, что нам нужно:

col6

А вот сам HTML-код, с помощью которого реализуется эта конструкция:

<style type="text/css"> .col-wrap1 { width:25%; background:blue; } .col-wrap2 { width:200%; margin-right:-100%; / чтобы IE6 не раздвигал контейнер / position:relative; left: 100%; background:red; } .col1 { float:left; width:50%; margin-right:-100%; position:relative; left:-50%; } .clear { clear:both; font-size:0; overflow:hidden; / тройной презерватив для IE / } </style> <div class="col-wrap1"> <div class="col-wrap2"> <div class="col1">left column</div> <div class="col2">center column</div> <div class="clear"></div> </div> </div>

Резюмируя все вышесказанное: я создал два контейнера, который являются дублерами основных колонок, и раздвигаются по высоте этими самыми колонками. Остается добавить, что этот способ является более гибким, чем использование CSS-свойств display: table-, потому что сами колонки можно перемещать с помощью свойств top и left. Чтобы продемонстрировать потенциал этого решения, я сделал специальный пример. Обратите внимание, что у каждой колонки есть свой бордюр и фоновая картинка, выровненная по правому нижнему краю, что в принципе не возможно в других известных способах.

На основе этого способа можно создать и больше растягивающихся колонок одинаковой высоты. Пример: сайт ВТБ24. Там три колонки одинаковой высоты; верстка осложняется тем, что первые две колонки должны быть в общей рамке, между которыми есть вертикальный разделитель. Когда я готовился к одному из мастер-классов, в одной книге про «качественную верстку» (естественно, западного автора), я прочил, что такое реализовать невозможно 🙂 Для меня это стало очередным подтверждением, что там не умеют верстать качественные растягивающиеся сайты.

Два слова о верстке макетов

На первый взгляд может показаться, что этот способ слишком специфический и подходит далеко не для каждого макета. Это не так. Основной трюк заключается в том, чтобы правильно определить модульную сетку и ширину колонок и контейнеров. Пока дизайнеры не слышат, признаюсь: первое, что я делаю при верстке макета — удаляю гайды, которые нарисовал дизайнер. Они мне нужны лишь для того, чтобы понять, как должны выравниваться блоки, саму модульную сетку я делаю на основе тщательного анализа макетов (на это может уйти целый рабочий день). После этого 7 колонок превращаются в 2 контейнера-дублера с 2…4 колонками в каждом. Может, потом подробнее опишу этот момент, пока могу дать общий совет, старайтесь подбирать такие ширины контейнеров и колонок, чтобы они делили 100 без остатка, а именно: 50%, 25%, 20%, 10%, 5%, 2%, 1%. Тогда вы сможете без особых хлопот выравнивать блоки по горизонтали в вертикали в независимых контейнерах.

Метки: column, css, float, html


Как сделать колонки одной высоты 75

Как сделать колонки одной высоты 166

Как сделать колонки одной высоты 182

Как сделать колонки одной высоты 935

Как сделать колонки одной высоты 878

Как сделать колонки одной высоты 189

Как сделать колонки одной высоты 930

Как сделать колонки одной высоты 934

Как сделать колонки одной высоты 67

Как сделать колонки одной высоты 725

Как сделать колонки одной высоты 673

Как сделать колонки одной высоты 146

Как сделать колонки одной высоты 390

Как сделать колонки одной высоты 8

Как сделать колонки одной высоты 490

Вязание нитками крючком игрушекКак сделать печь с плитойСтихи поздравления сыночку в день рождения от мамыЛучшие подарки девушке на 30 летСигнализатор на фидер своими рукамиФантики для конфеты поделки своими рукамиКак убрать шпоры на ступнях в домашних условияхУход за фикусом в горшке в домашних условияхКак сделать лебедей из пластиковых бутылок с инструкциейПоздравление с днем рождения дети радуют тебяПоздравление с юбилеем заведующую детским садом сценарийСам делаю ремонт на кухне своими рукамиКак сделать стояк в ваннойПоздравление с днем рождения к подарку тортСделать гримёрное зеркало своими руками

Читать далее:

  • Средство против грибка в домашних условиях
  • Нежирные сыры в домашних условиях
  • Подарки охотнику своими руками
  • Лифт не работает как сделать
  • Открытка с юбилеем брату от сестры