Распространенная проблема при использовании плавающих блоков заключается в том что они не растягивают внешний контейнер.
Проблема
Используем следующий CSS:
div.container { border: 1px solid #000000; } div.left { width: 45%; float: left; } div.right { width: 45%; float: right; }
и смотрим что происходит:
float: left
float: right
Необходимо чтобы черная граница охватывала плавающие блоки. Но этого не происходит, т.к. внешний контейнер не имеет высоты.
Старое решение
Старое решение заключалось в добавлении дополнительного элемента со свойством clear: both.
float: left
float: right
Однако лучше избегать лишних элементов.
Новое решение
Нужно добавить следующие свойства к внешнему контейнеру:
div.container { border: 1px solid #000000; overflow: auto; width: 100% }
Использование width необходимо для активации свойства «hasLayout» в IE.
У элементов в IE есть нестандартное свойство DOM: hasLayout. Когда оно установлено, они ведут себя иначе, чем без этого свойства. Например div с hasLayout=True расширяется, чтобы вместить в себя любые float-элементы. И любой его потомок также будет иметь hasLayout=True. hasLayout включается неявно, например, если задать ширину или высоту для элемента и во многих других случаях.
Смотрим что происходит:
float: left
float: right
Есть несколько моментов заслуживающих внимания.
- Метод работает с тремя значениями
overflow: auto, hiddenиscroll. Использованиеscrollсоответственно добавит полосы прокрутки, несмотря на то нужны они или нет. - Для некоторых браузеров необходимо указание
widthилиheightдля внешнего контейнера. Например для IE 6 и ниже нужно указать ширину, в 7-ом если не указывать ширину, то тогда необходимо указать корректныйDoctype. Стоит заметить что в 7-ом IE внешний контейнер растягивается и без применения вышеописанных методов. - Указание 100%-й ширины является оптимальным вариантом, хотя в некоторых других случаях возможны и другие значения.




Спасибо! Интересная информация. Я в последнее время пытаюсь перейти на данный способ.
[...] your web typography, and never need to worry about those pesky compatibility issues again (I wish!).«Очистка» плавающих блоков. Новое для меня решение известной проблемы. Я то [...]
А для чего нужно overflow: auto;?
Без overflow не работает.
nnial 2007 – salvatore iaconesi – del.icio.us poetry seems quite interesting – J.Sanders
У этого способа есть недостаток. Например, если у плавающего элемента нужно указать отрицательный margin, то он будет обрезан, чего не происходит при . Как с этим бороться я пока не знаю.
Ваня, overflow: visible ?
О господи, какой ужас. Как раз overflow:auto и есть «старый» способ очистки
Сейчас модно очищать плавающие блоки через псевдокласс :after. Т.е. в данном примере достаточно написать
div.container:after {content:'';
clear:both;
}
а для IE просто указать height:1%.
ИМХО, более гибкое решение.
С каким doctype это работает?
Я использую XHTML Strict
Спасибо, очень помогло)