Блочная модель, единицы и float-раскладка

Зачем:У каждого элемента есть содержимое, внутренний отступ, рамка и внешний отступ, и половина «странностей» вёрстки возникает из-за них. После урока вы считаете размеры блока, выбираете между px, rem и процентами и можете прочитать старую раскладку на float.

30 минут

Озвучено синтезом речи (Qwen3-TTS), голос не принадлежит человеку.

Блочная модель — устройство элемента в CSS как коробки: содержимое, внутренний отступ padding, рамка border и внешний отступ margin.

Каждый элемент это коробка

Для браузера любой элемент на странице прямоугольная коробка. Коробка из четырёх слоёв, как матрёшка, считая изнутри:

  1. содержимое (текст, картинка);
  2. padding: внутренний отступ от содержимого до рамки;
  3. border: рамка;
  4. margin: внешний отступ, расстояние до соседей. Он прозрачный и ничего не закрашивает.

Все странности, вроде «я задал ширину 200, а блок получился 250», вырастают отсюда. По умолчанию (это называется box-sizing: content-box) ширина, которую вы пишете, относится только к содержимому, а внутренний отступ и рамка добавляются сверху. Так считали с самого начала, но в 2000-х это так раздражало, что сначала Internet Explorer считал по-другому («по-человечески»), а потом и стандарт признал: можно выбрать box-sizing: border-box, и тогда ширина означает весь блок.

Покрутите ползунки и переключите режим.

Из чего сделан блок
Содержимое 240px
  • margin: внешний отступ, ничего не закрашивает
  • border: рамка
  • padding: отступ внутри рамки
  • содержимое

Вы написали width: 240px и это ширина только содержимого. Блок целиком: 240 + 2×16 (padding) + 2×4 (border) = 280px, а вместе с внешними отступами занимает в строке 312px.

Поэтому в начале любого стилевого файла пишут box-sizing: border-box: размер блока такой, как вы написали, и расчёты не удивляют.

Поэтому почти любой стилевой файл начинается так:

html {
  box-sizing: border-box;
}

*,
*::before,
*::after {
  box-sizing: inherit;
}

Звёздочка * означает «все элементы». Мы задаём border-box корню и просим всех наследовать, и тогда любой блок можно при необходимости вернуть к прежнему.

Проверьте себя: блок width: 300px, padding: 20px, border-box. Сколько ширины осталось содержимому?

260 пикселей: 300 минус по 20 внутреннего отступа с каждой стороны. Рамки в примере нет.

Единицы: что с чем сравнивается

  • px: пиксель. Фиксированный размер, который не зависит ни от чего. Для тонких линий (рамка в 1px) подходит.
  • rem: размер шрифта корневого элемента. По умолчанию 16px, но человек может увеличить шрифт в настройках браузера, и все rem вырастут вместе. Поэтому размеры текста и отступов пишут в rem. Так сайт слушается читателя.
  • em: размер шрифта текущего элемента. Полезен для отступов, которые должны расти вместе с текстом (например, внутри кнопки), но вложенные em перемножаются, и путаницы много. Начинайте с rem.
  • %: доля размера родителя. Для ширины колонок.
  • vw и vh: доля ширины и высоты окна. Берите осторожно: на телефоне высота окна меняется при прокрутке.
  • ch: ширина цифры «0» в текущем шрифте. Идеальна для ширины строки текста: max-width: 65ch.

Одно из правил, которое стоит запомнить: не задавайте размер шрифта в px у html или body: так вы отменяете настройку читателя.

Float: как делали колонки

Сначала ради картинки в тексте: свойство float: left сдвигает блок к левому краю, а текст обтекает его справа. В середине 2000-х, когда для раскладки были только таблицы, а они давно считались дурным тоном, авторы взяли float и сделали из него колонки: основному блоку float: left, боковому float: right.

У приёма есть цена. Плавающий блок «вынут» из потока, и родитель, в котором лежат одни плавающие блоки, схлопывается до нуля высоты. А подвал, который идёт следом, пытается занять место рядом с колонками. Лечили свойством clear: both у подвала или хитрым «clearfix» у родителя. Попробуйте на схеме: снимите и поставьте галочки.

Две колонки на float
Основное: главная колонка с текстом страницы. Её высота зависит от текста.
Боковая: контакты
Подвал

Колонки встали рядом, но контейнер (пунктир) схлопнулся: float «вынимает» блок из потока, и контейнеру не на что опереться. Подвал полез наверх и обтекает колонки. Включите clear или clearfix. Сегодня колонки делают flexbox и grid, где такой возни нет. А float остался для своей первой задачи: чтобы текст обтекал картинку.

Был и пик этой моды: в 2006 году статья «In Search of the Holy Grail» (журнал A List Apart) описала, как сделать три колонки: центральная резиновая, боковые фиксированные, а в исходном коде основное содержимое идёт первым. Для этого понадобился десяток хитрых правил, и вся «святость» была в том, что иначе не получалось. Через восемь лет та же задача сводилась к нескольким строкам flexbox. Во всяком старом сайте вы встретите float: теперь вы знаете, откуда он и почему он там.

Проверьте себя: почему подвал заезжает под плавающие колонки?

Плавающий блок вынут из потока, и следующий элемент ведёт себя так, будто колонок нет. Чтобы подвал встал ниже, ему задают clear: both.

Практика

Вы в эпохе 2005 года. Ваша страница уже одета, и сейчас она вытянута в одну колонку. Сделайте две колонки на float: так же, как делали тогда. Не пугайтесь, если подвал сначала уедет не туда: исправить это нужно как раз свойством clear.

Сумма ширин колонок в процентах должна быть меньше ста: между ними остаётся зазор. Проценты и rem в этом упражнении не случайны: они позволяют странице растягиваться и сжиматься. Фиксированные ширины в пикселях хуже: страница на телефоне вылезет за экран.

Что было не так с 2005 годом

Колонки на float держались на соглашениях и «хаках»: стоило добавить внутрь колонки слишком широкую картинку, и вся раскладка падала. Фиксированная ширина в 960 пикселей (на экраны 1024 × 768) считалась стандартом, и на телефоне такие сайты приходилось увеличивать пальцами. Вы переделаете этот сайт в эпохе 2014 года, когда придут flexbox, grid и адаптивность.

Практика

Готовлю вашу страницу…

Тест

Вопрос 1 из 6

У блока width: 200px; padding: 20px; border: 5px solid, и действует box-sizing: content-box. Какова ширина блока на странице (без внешних отступов)?

Один ответ

Карточки

Эти карточки попадут в повторение, когда вы завершите урок.

  • Из чего состоит блок?

    Ответ

    Из содержимого, внутреннего отступа (padding), рамки (border) и внешнего отступа (margin). Они вложены друг в друга, как матрёшка.

  • Зачем box-sizing: border-box?

    Ответ

    Чтобы width означала весь блок вместе с отступом и рамкой, а не только содержимое. Тогда блок такой, как вы написали, и 100% не вылезает за край.

  • Какую единицу брать?

    Ответ

    Шрифты и отступы в rem (уважают настройки человека), ширину в % или ch, тонкие линии в px, высоту экрана в vh и аккуратно.

  • Что такое float и clear?

    Ответ

    float сдвигает блок влево или вправо, и остальное обтекает его. clear: both ставит блок ниже плавающих. Колонки на float: приём 2000-х, сегодня их делает flexbox или grid.

Источники

Дальше

Теперь вы знаете: блочная модель, единицы измерения: px, rem, em, %, vw, Float-раскладка и «святой Грааль».