Блочная модель, единицы и float-раскладка
Зачем:У каждого элемента есть содержимое, внутренний отступ, рамка и внешний отступ, и половина «странностей» вёрстки возникает из-за них. После урока вы считаете размеры блока, выбираете между px, rem и процентами и можете прочитать старую раскладку на float.
30 минут
Озвучено синтезом речи (Qwen3-TTS), голос не принадлежит человеку.
Блочная модель — устройство элемента в CSS как коробки: содержимое, внутренний отступ padding, рамка border и внешний отступ margin.
Каждый элемент это коробка
Для браузера любой элемент на странице прямоугольная коробка. Коробка из четырёх слоёв, как матрёшка, считая изнутри:
- содержимое (текст, картинка);
- padding: внутренний отступ от содержимого до рамки;
- border: рамка;
- margin: внешний отступ, расстояние до соседей. Он прозрачный и ничего не закрашивает.
Все странности, вроде «я задал ширину 200, а блок получился 250», вырастают отсюда. По умолчанию (это называется box-sizing: content-box) ширина, которую вы пишете, относится только к содержимому, а внутренний отступ и рамка добавляются сверху. Так считали с самого начала, но в 2000-х это так раздражало, что сначала Internet Explorer считал по-другому («по-человечески»), а потом и стандарт признал: можно выбрать box-sizing: border-box, и тогда ширина означает весь блок.
Покрутите ползунки и переключите режим.
- 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 «вынимает» блок из потока, и контейнеру не на что опереться. Подвал полез наверх и обтекает колонки. Включите 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
Карточки
Эти карточки попадут в повторение, когда вы завершите урок.
Из чего состоит блок?
Ответ
Из содержимого, внутреннего отступа (padding), рамки (border) и внешнего отступа (margin). Они вложены друг в друга, как матрёшка.
Зачем box-sizing: border-box?
Ответ
Чтобы width означала весь блок вместе с отступом и рамкой, а не только содержимое. Тогда блок такой, как вы написали, и 100% не вылезает за край.
Какую единицу брать?
Ответ
Шрифты и отступы в rem (уважают настройки человека), ширину в % или ch, тонкие линии в px, высоту экрана в vh и аккуратно.
Что такое float и clear?
Ответ
float сдвигает блок влево или вправо, и остальное обтекает его. clear: both ставит блок ниже плавающих. Колонки на float: приём 2000-х, сегодня их делает flexbox или grid.
Источники
- The box model (MDN) CC BY-SA, по-английски
- Floats (MDN) CC BY-SA, по-английски
- Box Model (web.dev) CC BY, по-английски
- Блочная модель — Дока только ссылка, по-русски
- Holy grail (web design) (Википедия) CC BY-SA, по-английски
Дальше
Теперь вы знаете: блочная модель, единицы измерения: px, rem, em, %, vw, Float-раскладка и «святой Грааль».