Интернетчик » site » CSS: ГЛОБАЛЬНАЯ УСТАНОВКА BOX-SIZING

CSS: ГЛОБАЛЬНАЯ УСТАНОВКА BOX-SIZING

box-sizing (читается «бокс-сайз») — CSS-свойство, определяющее способ подсчёта браузером итоговых размеров блочного элемента. На практике существуют два основных значения, полностью исключающие друг друга: content-box и border-box

  1. Значения свойства box-sizing
  2. Как задаётся значение свойства box-sizing
  3. Наследование свойства box-sizing
  4. Паттерн: Наследование через корень
  5. Паттерн: Прямое назначение
  6. «Авторитетное сравнение»
  7. Сравнение вариантов
  8. Заключение
  9. Как это работает
  10. Итог
  11. Суперитог

Значения свойства box-sizing

content-box
Значение «box-sizing» по умолчанию. Мерим внутреннее содержимое блока (content), без учета отступов и рамок-бордеров:
«Размер блока» = content.
border-box
Складываем размеры: содержимое (content) + внутренние отступы (padding) + толщина рамки (border).
«Размер блока» = content + padding + border.
border-box, популярное ныне значение свойства box-sizing — учитывает размеры блока по внешнему краю элемента

Как задаётся значение свойства box-sizing

Наследование свойства box-sizing

Особенности наследования.
Включение наследования необратимо. Включенное однажды наследование свойства box-sizing: inherit; нельзя остановить или отменить. Наследование действует по цепочке вниз и НЕ! прекращается никогда. Доступно лишь переопределение (изменение) значения свойства для потомков. Механизм inherit не отключается. В CSS нет правила или команды, которая отключает наследование box-sizing: inherit;, как, например, text-decoration: none;

Паттерн: Наследование через корень

Популярный способ глобальной установки box-sizing получил название «Паттерн: Наследование через корень» и реализует каскадную CSS-логику: задаём box-sizing: border-box на корневой элемент html и inherit-распространяем значение на все элементы, включая псевдоэлементы.

/* Паттерн: Наследование через корень [inheritance-based] */

html {
  /* Задаём корню (корневому элементу)
  стартовое базовое значение */ 
  box-sizing: border-box; 
}

/* Устанавливаем наследование «от корня» */
*, *::before, *::after {
  margin     : 0;
  padding    : 0;
  /* Элемент всегда берёт значение
     box-sizing у своего родителя */
  box-sizing : inherit; 
}

/* • Все элементы наследуют box-sizing от корня html
   (в нашем случае: border-box).
   •• Если элементу ниже по тексту явно задать content-box,
   это значение будет наследоваться всеми его потомками
   до нового явного изменения (переназначения).

   ••• Так работает вторая строка нашего кода:
   *, *::before, *::after { box-sizing: inherit; } */

Прим. Указание [margin:0;padding:0;] — не имеет никакого отношения к нашей теме и указано, исключительно, чтобы «не портить глаза»

Паттерн: Прямое назначение

Паттерн: «Прямое назначение» — не менее популярен и часто (если не всегда) используется в небольших проектах. Смысл его предельно ясен: никакого наследования и прямая установка box-sizing каждому элементу.

/* Паттерн: Прямое назначение [direct assignment] */

*, *::before, *::after {
  margin     : 0;
  padding    : 0;
  /* Задаем сразу всем и конкретно каждому элементу,
     явно, напрямую и без всякого наследования */
  box-sizing : border-box;
}

/* • Все элементы получают box-sizing явно и напрямую
   (в нашем случае — border-box).
   •• Если НИЖЕ, в коде CSS, элементу ЯВНО задать content-box, значение
   НЕ! будет наследоваться потомками,
   потому как, для всех элементов применяется глобальное правило:
   *, *::before, *::after { box-sizing: border-box; }
   ••• За сим, значения, отличные от заданного нами базового
   прямого назначения (box-sizing:border-box;),
   при необходимости — задаем постоянно, явно и снова, каждому элементу. */

6. «Авторитетное сравнение»

7. Сравнение вариантов

Вариант 1 (inheritance-based)

Принцип работы: изменил значение у элемента-родителя → это значение пошло от родителя вниз ко всем вложенным дочерним элементам, пока не задали новое значение box-sizing (не переопределили).

Вариант 2 (direct assignment)

На практике чаще используют Вариант 1.

8. Заключение

Главное отличие вариантов 1 и 2: наследование свойства box-sizing по дереву DOM:

9. Как это работает

Вариант 1 [inheritance-based] (наследование)

Вариант 2 [direct assignment] (напрямую)

10. Итог

11. Суперитог

Если сжать до предела:

Главное различие между вариантами — это не способ задания свойства, а тип управления поведением внутри дерева.

Вариант 1 (inherit)

Ты управляешь не элементами, а потоками значений.

Любое изменение — это не просто точечная правка, а вмешательство в распространение значения.

Ты задаёшь не состояние элемента, а направление, по которому это состояние будет жить дальше.

Это означает:

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

Архивные тексты и практическое объяснение

Вариант 1 [inheritance-based]:

Вариант 2 [direct assignment]:

Практика (как это работает)

Разница между вариантами проявляется не просто в наличии/отсутствии механизма наследования, а в том, что происходит, если изменить box-sizing внутри дерева:

Вариант 1 [inheritance-based]

Девиз: "изменил здесь → пошло дальше вниз, пока снова не переопределили"

Вариант 2 [direct assignment]

Девиз: "изменил здесь — здесь и закончилось. Надо пять раз под ряд — задавай пять раз под ряд. Наследования нет, свойство не передается вниз"