Что делает float
float прижимает элемент к одной стороне контейнера и позволяет следующему за ним тексту его обтекать:
Margin у плавающего блока не дает тексту касаться его. Этот зазор управляется именно отступами; самому тексту нельзя задать отступ в сторону float.
Значения
| Значение | Результат |
|---|---|
none (по умолчанию) | Без float |
left | Прижат к левому краю |
right | Прижат к правому краю |
inline-start | Прижат к началу строки: слева в русском, справа в арабском или иврите |
inline-end | Прижат к концу строки |
inline-start и inline-end следуют направлению письма, поэтому раскладка на них правильно отражается на страницах справа налево. Плавающий элемент еще и становится блочным: display: inline превращается в block, поэтому width и height применяются даже к span или img.
Изображения с обтеканием текстом
Классическое применение: изображение в статье, а текст его обтекает. Прижмите по одному к каждой стороне:
clear: остановить обтекание
clear означает «начни ниже всех предыдущих float с этой стороны». Задайте его элементу, который не должен стоять рядом с float, например заголовку следующего раздела:
Первый заголовок втискивается рядом с float. Второй начинается под ним. clear принимает left, right, both, inline-start, inline-end и none.
Схлопывающийся родитель и flow-root
Float находятся вне обычного потока, поэтому контейнер, все дочерние элементы которого плавающие, не имеет ничего в потоке и схлопывается до нулевой высоты. Его фон и рамка превращаются в тонкую линию над float:
display: flow-root создает новый блочный контекст форматирования, который всегда вмещает свои float. Старый код добивается того же через «clearfix»:
.clearfix::after {
content: "";
display: block;
clear: both;
}
overflow: hidden или auto тоже вмещают float, но с побочным эффектом обрезки; смотрите overflow.
Float не для раскладки
До flexbox и grid целые раскладки страниц строили из плавающих колонок, с clearfix и расчетами ширины повсюду. Эта эпоха прошла: float не умеют центрировать, не умеют делать колонки одинаковой высоты и ломаются, когда меняется размер содержимого. Для строк и колонок используйте display: flex или display: grid, а float оставьте для обтекания текстом. Чтобы центрировать изображение, а не обтекать его текстом, смотрите центрирование картинки.
Обтекание по форме
shape-outside позволяет тексту следовать форме, а не прямоугольнику float. Работает только у плавающих элементов:
.avatar {
float: left;
width: 120px; height: 120px;
border-radius: 50%;
shape-outside: circle(50%);
margin-inline-end: 16px;
}
Частые ошибки
- Родитель с нулевой высотой. Все его дочерние элементы плавающие. Добавьте
display: flow-root. - Float для колонок или навигации. Используйте flexbox или grid.
- Ожидание
float: center. Такого нет. Центрируйте через flexbox, grid илиmargin: 0 auto. - Содержимое после float обтекает его, хотя не должно. Задайте ему
clear: bothили поместите float и его текст в контейнерflow-root. - Физические
leftиrightна многоязычном сайте. Используйтеinline-startиinline-end, чтобы раскладка отражалась в языках справа налево.
Часто задаваемые вопросы
Что делает float в CSS?
Убирает элемент из обычного потока и прижимает его к левому или правому краю контейнера. Текст и строчное содержимое, которые идут после него, его обтекают.
Что делает clear?
clear переносит элемент ниже всех предыдущих float с указанной стороны: clear: left, clear: right или clear: both. Так останавливают обтекание float содержимым.
Почему у родителя плавающего элемента нулевая высота?
Float находятся вне обычного потока, поэтому у родителя, в котором только плавающие дочерние элементы, нет содержимого в потоке, и он схлопывается. Добавьте родителю display: flow-root, и он вырастет, вместив свои float.
Что такое clearfix?
Прием, чтобы родитель вмещал свои float, традиционно псевдоэлемент ::after с clear: both. Сегодня ту же задачу одной строкой решает display: flow-root у родителя.
Стоит ли использовать float для раскладки?
Нет. Float использовали для колонок до появления flexbox и grid. Для раскладки используйте flexbox или grid, а float оставьте для его исходной задачи: обтекания текстом изображения или цитаты-выноски.