Справочник · CSS
float: обтекание текстом
Свойство float прижимает элемент к левому или правому краю контейнера, а текст и строчные элементы обтекают его с другой стороны — как картинку в журнальной статье. Значения: left, right и none. Раньше float использовали для колонок сайта, сейчас для раскладки есть Flexbox и Grid, а float остался для обтекания.
float: left— элемент слева, текст обтекает справа.- Плавающий элемент частично выходит из потока: родитель может «схлопнуться».
display: flow-rootу родителя заставляет его обнять плавающих детей.clear: bothопускает элемент ниже всех плавающих.- Для колонок и сеток используй Flexbox и Grid, а не float.
Минимальный пример
.article img.left {
float: left;
width: 240px;
margin: 4px 20px 12px 0;
}<div class="article">
<img class="left" src="/images/clay.webp" alt="Мастер у гончарного круга" width="240" height="180">
<p>Текст абзаца обтекает фотографию справа, а когда она заканчивается, занимает всю ширину…</p>
</div>Картинка прижата к левому краю, текст идёт справа от неё и под ней, когда она закончилась. Отступ справа и снизу не даёт тексту прилипать к фотографии.
Значения float
| Значение | Что происходит |
|---|---|
none | обычный элемент, по умолчанию |
left | прижат к левому краю, обтекание справа |
right | прижат к правому краю, обтекание слева |
inline-start, inline-end | к началу или концу строки с учётом направления письма |
Плавающий элемент становится блочным: у строчного span с float начинают работать width и height. Внутри flex- и grid-контейнера float игнорируется.
Почему родитель схлопывается
/* родитель не видит плавающую картинку и становится ниже неё */
.media { border: 1px solid #ddd; }
.media img { float: left; }
/* решение: родитель обнимает плавающих детей */
.media { display: flow-root; }Плавающий элемент выходит из обычного потока для блоков: родитель считает свою высоту только по остальному содержимому. Если внутри одна картинка с float, рамка и фон родителя сжимаются, а картинка торчит снизу. display: flow-root создаёт новый контекст форматирования, и родитель снова учитывает плавающих детей. Раньше для этого писали «clearfix» с псевдоэлементом или overflow: hidden.
clear: остановить обтекание
.article h2 { clear: both; } /* заголовок раздела ниже картинки */
.note { clear: left; } /* ниже только левых плавающих */clear запрещает элементу стоять рядом с плавающими и опускает его ниже. Значения: left, right, both. Типичный случай: картинка выше абзаца, и следующий заголовок не должен заезжать ей сбоку.
Обтекание по форме: shape-outside
.avatar-float {
float: left;
width: 160px;
height: 160px;
border-radius: 50%;
shape-outside: circle(50%);
margin-right: 20px;
}По умолчанию текст обтекает прямоугольник элемента. shape-outside задаёт настоящую форму обтекания: круг, эллипс, многоугольник или контур картинки с прозрачностью. Работает только у плавающих элементов.
float для раскладки — это прошлое
/* так верстали раньше */
.col { float: left; width: 33.333%; }
.row::after { content: ""; display: table; clear: both; }
/* так сейчас */
.row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }До Flexbox и Grid колонки сайта строили на float и чинили схлопывание «clearfix». Такой код встречается в старых проектах и шаблонах. Для новых раскладок он не нужен: float не умеет выравнивать по высоте, не даёт gap и ломается от длинного содержимого. Если видишь float в сетке — это кандидат на переписывание на Grid.
float на узком экране
.article img.left { float: none; width: 100%; margin: 0 0 16px; }
@media (min-width: 40rem) {
.article img.left { float: left; width: 240px; margin: 4px 20px 12px 0; }
}На телефоне рядом с картинкой шириной 240px останется узкая полоска в пару слов на строку. Обычно на узком экране обтекание отключают, а картинку ставят во всю ширину над текстом.
float или flex
Обтекание: картинка или цитата в тексте статьи, вокруг которой течёт абзац.
Раскладка: колонки, ряды карточек, шапка. Выравнивание, промежутки, никакого схлопывания.
Частые ошибки
- Строят колонки сайта на float вместо Flexbox или Grid.
- Не учитывают схлопывание: рамка и фон родителя не обнимают плавающую картинку.
- Забывают отступ у плавающей картинки, и текст прилипает к ней.
- Оставляют обтекание на телефоне, и текст рядом превращается в столбик из слов.
- Пишут float детям flex-контейнера и удивляются, что ничего не меняется.
Доступность
float меняет только положение, порядок чтения остаётся как в HTML. Ставь плавающую картинку в коде рядом с текстом, к которому она относится, и давай ей осмысленный alt. На узких экранах отключай обтекание — узкую колонку текста тяжело читать всем, особенно при увеличенном шрифте.
Поддержка браузерами
float и clear работают во всех браузерах. display: flow-root, shape-outside и логические значения inline-start и inline-end поддерживаются актуальными версиями браузеров.
Практика
Сверстай фрагмент статьи: фотография слева шириной 240px с отступом, вокруг неё два абзаца текста, затем заголовок раздела, который всегда начинается ниже фотографии. Сделай так, чтобы рамка блока обнимала фотографию, а на телефоне фото стояло во всю ширину над текстом.
Показать решение
.article { display: flow-root; border: 1px solid #e5e7eb; padding: 16px; }
.article img.left { width: 100%; margin-bottom: 16px; }
.article h2 { clear: both; }
@media (min-width: 40rem) {
.article img.left { float: left; width: 240px; margin: 4px 20px 12px 0; }
}Частые вопросы
Как сделать обтекание картинки текстом?
Задай картинке float: left или right и отступ с противоположной стороны. Текст обтечёт её автоматически.
Почему родитель не обнимает плавающий элемент?
Плавающие элементы не учитываются в высоте родителя. Поставь родителю display: flow-root.
Что делает clear: both?
Опускает элемент ниже всех плавающих элементов слева и справа, чтобы он не стоял с ними рядом.
Нужно ли использовать float для вёрстки колонок?
Нет, это устаревший приём. Колонки и сетки делают на Flexbox и Grid.
Почему float не работает внутри flex?
Дети flex- и grid-контейнеров не могут быть плавающими — свойство игнорируется.