Menu

Float и clear в CSS: обтекание картинки текстом

float прижимает элемент к одной стороне и позволяет тексту обтекать его, как фотографии в журнале. Разберем float left, right и inline-start, clear, почему родитель схлопывается вокруг float и как это исправляет display: flow-root, и почему float больше не используют для раскладки страницы.

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

Что делает 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 оставьте для его исходной задачи: обтекания текстом изображения или цитаты-выноски.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ