Фиксированная колонка + резиновая + clear:both
Дата публикации: 23.02.2009
Последнее обновление: 04.03.2009
Имеем макет, состоящий из одной фиксированной по ширине колонки (leftColumn) и правой (rightColumn), заполняющей всю оставшуюся область. В правой колонке выстраиваем два блока (block1 и block2) в одну линию, с помощью float: left. Третий блок (block3) должен расположиться сразу под боками 1 и 2:
Как должны расположиться блоки |
HTML:
<div class="leftColumn">
. . .
</div>
<div class="rightColumn">
<p class="block1">
. . .
</p>
<p class="block2">
. . .
</p>
<div class="block3">
. . .
</div>
</div>
CSS:
.leftColumn {
width: 200px;
float: left;
background: #eb0505;
}
.rightColumn {
margin-left: 220px;
background: #050feb;
}
.rightColumn .block1,
.rightColumn .block2 {
float: left;
width: 300px;
margin-right: 20px;
background: #ebde05;
}
.rightColumn .block3 {
background: #eb8105;
clear: both;
}
Проблема
clear: both сработает для всех плавающих блоков и блок 3 расположиться по высоте под левой колонкой:
Как получается |
Решение
Добавляем контейнер, где clear: both будет срабатывать только для элементов, находящихся в нем:
<div class="leftColumn">
. . .
</div>
<div class="rightColumn">
<div class="container">
<p class="block1">
. . .
</p>
<p class="block2">
. . .
</p>
<div class="block3">
. . .
</div>
</div>
</div>
CSS:
.leftColumn {
width: 200px;
float: left;
background: #eb0505;
}
.rightColumn {
margin-left: 220px;
background: #050feb;
}
.rightColumn .block1,
.rightColumn .block2 {
float: left;
width: 300px;
margin-right: 20px;
background: #ebde05;
}
.rightColumn .block3 {
background: #eb8105;
clear: both;
}
.container {
display: table; /* эмулируем таблицу (второй вариант это использование float, но тогда немного больше проблем с IE) */
width: 100%; /* это нужно для IE */
}
* html .container {
margin-left: -3px; /* исправляем небольшой косяк в IE6 */
}
Проверено в:
Теги: каркас верстки

Как должны расположиться блоки
Как получается