`. Так что его отступ учитывается.
## Заполнение блока-родителя
Итак, мы научились располагать другие элементы *под* `float`. Теперь рассмотрим следующую особенность.
**Из-за того, что блок с `float` удалён из потока, родитель не выделяет под него места.**
Например, выделим для информации о Винни-Пухе красивый элемент-контейнер `
`:
```html
Винни-Пух
Картинка
Текст.
```
Стиль контейнера:
```css
.hero {
background: #D2B48C;
border: 1px solid red;
}
```
Результат [edit src="winnie-clear-4"]получившегося кода[/edit]:
[iframe src="winnie-clear-4" border="1" height=300 link edit]
Элемент с `float` оказался выпавшим за границу родителя `.hero`.
Чтобы этого не происходило, используют одну из следующих техник.
### Поставить родителю float
Элемент с `float` обязан расшириться, чтобы вместить вложенные `float`.
Поэтому, если это допустимо, то установка `float` контейнеру всё исправит:
```css
.hero {
background: #D2B48C;
border: 1px solid red;
*!*
float: left;
*/!*
}
```
[iframe src="winnie-clearfill-float" border="1" height=300 link edit]
Разумеется, не всегда можно поставить родителю `float`, так что смотрим дальше.
### Добавить в родителя элемент с clear
Добавим элемент `div style="clear:both"` в самый конец контейнера `.hero`.
Он с одной стороны будет "нормальным" элементом, в потоке, и контейнер будет обязан выделить под него пространство, с другой -- он знает о `float` и сместится вниз.
Соответственно, и контейнер вырастет в размере:
```html
Винни-Пух
Картинка
Текст.
*!*
*/!*
```
Результат -- правильное отображение, как и в примере выше. [edit src="winnie-clearfill-div"]Открыть код[/edit].
Единственный недостаток этого метода -- лишний HTML-элемент в разметке.
### Универсальный класс clearfix
Чтобы не добавлять в HTML-код лишний элемент, можно задать его через `:after`.
```css
.clearfix:after {
content: "."; /* добавить содержимое: "." */
display: block; /* сделать блоком, т.к. inline не может иметь clear */
clear: both; /* с обеих сторон clear */
visibility: hidden; /* сделать невидимым, зачем нам точка внизу? */
height: 0; /* сделать высоту 0, чтобы не занимал место */
}
```
Добавив этот класс к родителю, получим тот же результат, что и выше. [edit src="winnie-clearfill-clearfix"]Открыть код[/edit].
### overflow:auto/hidden
Если добавить родителю `overflow: hidden` или `overflow: auto`, то всё станет хорошо.
```css
.hero {
*!*
overflow: auto;
*/!*
}
```
Этот метод работает во всех браузерах, [edit src="winnie-clearfill-overflow"]полный код в песочнице[/edit].
Несмотря на внешнюю странность, этот способ не является "хаком". Такое поведение прописано в спецификации CSS.
Однако, установка `overflow` может привести к появлению полосы прокрутки, способ с псевдоэлементом `:after` более безопасен.
## float вместо display:inline-block
При помощи `float` можно размещать блочные элементы в строке, похоже на `display: inline-block`:
[codetabs src="gallery-float" border="1" height=550 link edit]
Стиль здесь:
```css
.gallery li {
float: left;
width: 130px;
list-style: none;
}
```
Элементы `float:left` двигаются влево, а если это невозможно, то вниз, автоматически адаптируясь под ширину контейнера, получается эффект, аналогичный `display: inline-block`, но с особенностями `float`.
## Вёрстка в несколько колонок
Свойство `float` позволяет делать несколько вертикальных колонок.
### float:left + float:right
Например, для вёрстки в две колонки можно сделать два `
`. Первому указать `float:left` (левая колонка), а второму -- `float:right` (правая колонка).
Чтобы они не ссорились, каждой колонке нужно дополнительно указать ширину:
```html
Шапка
Левая колонка
Правая колонка
```
Стили:
```css
.column-left {
float: left;
width: 30%;
}
.column-right {
float: left;
width: 70%;
}
.footer {
clear: both;
}
```
Результат (добавлены краски):
[codetabs src="two-columns" border="1" height=440]
В эту структуру легко добавить больше колонок с разной шириной. Правой колонке можно было бы указать и `float:right`.
### float + margin
Ещё вариант -- сделать `float` для левой колонки, а правую оставить в потоке, но с отбивкой через `margin`:
```css
.column-left {
float: left;
width: 30%;
}
.column-right {
margin-left: 30%;
}
.footer {
clear: both;
}
```
Результат (добавлены краски):
[codetabs src="two-columns-2" border="1" height=440]
В примере выше -- показана небольшая проблема. Колонки не растягиваются до одинаковой высоты. Конечно, это не имеет значения, если фон одинаковый, но что, если он разный?
В современных браузерах (кроме IE10-) эту же задачу лучше решает flexbox.
Для старых есть различные обходы и трюки, которые позволяют обойти проблему в ряде ситуаций, но они выходят за рамки нашего обсуждения. Если интересно -- посмотрите, например, [Faux Columns](http://goodline.spb.ru/III-05-002.html).