Техника «самоочистки»

Хочу рассказать об одной полезной технике, которой пользуюсь в последнее время. Обычно, для создания колонок при бестабличной верстке, используются плавающие элементы. Но свойство float изначально предназначалось совсем для другого. Отсюда и вытекают некоторые неудобства, такие, как необходимость применения свойства clear. Например, чтобы родительский блок имел ту же высоту, что и внутренние колонки, или, чтобы последующий контент вёл себя, как подобает, а не выскакивал в ненужных местах между колонками.

Обычно вставляется див нулевой высоты, типа div.clear, т.е.  семантически лишний код.

Но очистку можно делать и другим способом, без использования лишних элементов в коде. Поможет нам в этом стандартный псевдо-элемент :after. Техника «самоочистки» заключается в том, что этому элементу задается свойство clear.

Допустим, нам надо сделать две колонки в контенте.

Без использования техники «самоочистки» код, вероятно, выглядел бы так:


<div class="cols">
  <div class="col1">Текст1</div>
  <div class="col2">Текст2</div>
  <div class="clear"></div>
</div>

Но возможно сделать так (что, на мой взгляд, намного симпатичнее):


<div class="cols">
  <div class="col1">Текст1</div>
  <div class="col2">Текст2</div>
</div>

CSS-код:


.cols div{
  float: left;
  width: 50%;
}
.cols:after{
  content: ".";
  display: block;
  height: 0;
  clear: both;
  visibility: hidden;
}

В IE, естественно, это работать не будет. Но есть способ заставить IE действовать, так, как нам нужно. В отдельный файл для IE дописываем:


.cols{
  height:1%;
}

Или, если лень создавать отдельный файл для IE, можно прямо в коде указать: //height: 1%.

Результирующий CSS-код будет выглядеть так:


.cols{
  //height: 1%;
}
.cols div{
  float: left;width: 50%;
}
.cols:after{
  content: ".";
  display: block;
  height: 0;
  clear: both;
  visibility: hidden;
}

Работающий пример

PS. Есть и другой способ добиться нужного нам html-кода — это задать свойство overflow: hidden; у дива .cols (Техника «easyfix»). Его обширно ещё не использовал, поэтому ручаться за него не могу.

PPS. Техника «самоочистки», естественно, придумана не мной. Этот способ был вычитан в книге Седерхольма «Пуленепробиваемый Web-дизайн» и известен в сети уже давно.

mex
29 ноября
overflow: hidden; реально работает, и гораздо более удобен, чем clear.
Для фф, оперы, сафари и ие7 идет

.cols {
min-height:1%; /*min-height нужен для ие7, чтобы вернуться в нормальный поток + пропадает баг с появлением временами незадокументированных пустот */
overflow:hidden;
}
* html .cols {
height:1%;
overflow:visible; /*чтобы ие6 не выводил 1%-ые полоски*/
}

29 ноября
Mex, лично мне всё равно чем пользоваться — за меня вставляет в нужном месте код мой настроеный редактор :-)
Но для читабельности кода, видимо, overflow: hidden удобнее, в этом я согласен.
На одном сайте уже испробовано. С поддержкой браузерами проблем не замечал, кроме ранней Оперы 7.0beta и Netscape Navigator 7 (сейчас это конечно уже не актуально).
Но не очень понятно почему браузеры так себя ведут и почему overflow: hidden очищает флоаты. В спецификации CSS про это пока ничего не нашел. Вдруг будущие версии браузеров будут вести себя иначе?
И ещё надо помнить. При использовании overflow:hidden в стилях для печати надо это правило отменять, иначе браузеры печатать будут только первую страницу.
mex
29 ноября
Ну, имхо, Опера 7.0beta, это несерьезный показатель. Как и ие4 и иже с ними.

Про печать, оно абсолютно верно )))

Зато есть замечательный момент, из-за которого overflow:hidden мне очень импонирует. Когда делаешь резину, левый блок float:left, правый - float:right, оба фиксированной ширины X, а центральный - margin:0 Xpx и в нем, в центральном диве, есть еще флоаты,то при использовании метода :after очищаются не только флоаты центрального дива, но и боковые тоже, чего хотелось бы избежать. overflow:hidden как раз решает эту проблему.
chizh
6 декабря
Способ конечно ничего, но я бы сильно надеялся на height:1%, проблема в том что hasLayout, никто не отменял :-( height включает его, а включеный hasLayout у блока в котором много элементов это "бомба замедленного действия", попробуйте если интересно побаловаться... Кстати одна из подобных проблем проявляеться прям на этой странице в IE6 ;-)

7 декабря
Chizh, при использовании любых нестандартных приемов имеются какие-либо подводные камни) То что Вы говорите надо иметь ввиду, конечно. Думаю, в каждом конкретном случае надо проверять и смотреть, если есть проблемы — искать способ исправить.
Tilly Tavretskaya
14 декабря
мне все-таки способ с overflow:hidden; нравится больше, все-таки он без хака, единственное чем не удобен-тем что нужно этому блоку еще ширину задавать для ие
mex
18 декабря
Кстати, в описанном случае самоочистка .cols не будет работать под ие7. Он еще не понимает :after и уже не понимает height:1%; Для него надо добавлять
.cols {
min-heght:1%;
}
Владимир Вашурин
5 Февраля

Для IE лучше использовать такой CSS код:

zoom: 1;

, что б очистка происходила сама.