Техника «самоочистки» среда
21 ноября
Хочу рассказать об одной полезной технике, которой пользуюсь в последнее время. Обычно, для создания колонок при бестабличной верстке, используются плавающие элементы. Но свойство float изначально предназначалось совсем для другого. Отсюда и вытекают некоторые неудобства, такие, как необходимость применения свойства clear. Например, чтобы родительский блок имел ту же высоту, что и внутренние колонки, или, чтобы последующий контент вёл себя, как подобает, а не выскакивал в ненужных местах между колонками.
Обычно вставляется див нулевой высоты, типа div.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%.
Результирующий
.cols{
//height: 1%;
}
.cols div{
float: left;width: 50%;
}
.cols:after{
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
PS. Есть и другой способ добиться нужного нам
PPS. Техника «самоочистки», естественно, придумана не мной. Этот способ был вычитан в книге Седерхольма «Пуленепробиваемый
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;, что б очистка происходила сама.
29 ноября
Для фф, оперы, сафари и ие7 идет
.cols {
min-height:1%; /*min-height нужен для ие7, чтобы вернуться в нормальный поток + пропадает баг с появлением временами незадокументированных пустот */
overflow:hidden;
}
* html .cols {
height:1%;
overflow:visible; /*чтобы ие6 не выводил 1%-ые полоски*/
}