← Назад к вопросам
Как использовать box-sizing: border-box кроме *?
1.3 Junior🔥 121 комментариев
#HTML и CSS
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
box-sizing: border-box без универсального селектора *
Хотя использование * { box-sizing: border-box; } — очень популярный подход, существует несколько альтернатив для более точного контроля, которые могут быть лучше в некоторых ситуациях.
Проблема с * селектором
/* Работает, но влияет на ВСЕ элементы, включая ::before и ::after */
* {
box-sizing: border-box;
}
/* Может вызвать неожиданное поведение с некоторыми библиотеками */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
Вариант 1: Наследование от html
/* Самый рекомендуемый подход */
html {
box-sizing: border-box;
}
*,
*::before,
*::after {
box-sizing: inherit;
}
Плюсы:
- Явное наследование через inherit
- Можно переопределить для конкретных элементов
- Производительнее чем
*с border-box - Работает со всеми псевдоэлементами
Практический пример:
html {
box-sizing: border-box;
}
*,
*::before,
*::after {
box-sizing: inherit;
}
/* Для форм можно переопределить если нужно */
input[type="search"],
input[type="number"] {
box-sizing: content-box; /* Переопределяем если нужно */
}
Вариант 2: Селективный подход
/* Применяем только к основным структурным элементам */
html,
body,
main,
article,
section,
nav,
header,
footer,
div,
p,
span {
box-sizing: border-box;
}
/* Для медиа элементов оставляем content-box */
img,
video,
iframe {
box-sizing: content-box;
}
Вариант 3: BEM/компонентный подход
/* В Tailwind или CSS-in-JS подходе */
.component {
box-sizing: border-box;
}
.component > * {
box-sizing: border-box;
}
.component img {
box-sizing: content-box; /* Исключение для изображений */
}
Вариант 4: CSS Reset библиотека
/* Используя modern-normalize или подобное */
/* Эти библиотеки уже содержат оптимальные настройки */
@import "modern-normalize";
/* Дополнить при необходимости */
::-webkit-input-placeholder {
box-sizing: border-box;
}
Пример в React/Next.js проекте
/* styles/globals.css */
html {
box-sizing: border-box;
}
*,
*::before,
*::after {
box-sizing: inherit;
}
body {
margin: 0;
padding: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto;
}
/* Исключения при необходимости */
input[type="search"] {
box-sizing: content-box;
}
Вариант 5: Tailwind CSS подход
<!-- В tailwind.config.ts уже есть оптимальная конфигурация -->
// tailwind.config.ts
export default {
theme: {
extend: {}
},
// Tailwind уже применяет border-box для всех элементов
}
/* Генерируемый Tailwind CSS включает: */
*,
::before,
::after {
border-color: rgb(229, 231, 235);
border-style: solid;
border-width: 0;
box-sizing: border-box;
}
Сравнение подходов
| Подход | Производительность | Гибкость | Наследование | Рекомендация |
|---|---|---|---|---|
* { } | Средняя | Низкая | Нет | - |
html + inherit | Высокая | Высокая | Да | ✔ ЛУЧШИЙ |
| Селективный | Высокая | Высокая | Нет | Хорош для сложных |
| BEM компоненты | Высокая | Очень высокая | Да | Хорош для масштаба |
| Tailwind | Встроен | Низкая | Да | ✔ Современный |
Почему inherit лучше
/* Правильный способ */
html {
box-sizing: border-box;
}
*,
*::before,
*::after {
box-sizing: inherit;
}
/* Теперь можно легко переопределить для компонента */
.modal-dialog {
box-sizing: content-box; /* Применится ко всем потомкам */
}
.modal-dialog * {
box-sizing: inherit; /* Наследуют content-box от родителя */
}
Важные замечания
-
Разница между
border-boxиcontent-box:content-box: ширина = контент (padding/border добавляются сверху)border-box: ширина = контент + padding + border
-
Со строковыми элементами (inline):
/* box-sizing работает только с block и inline-block */ span { box-sizing: border-box; } /* Не будет видимого эффекта */ span { display: inline-block; box-sizing: border-box; } /* Сработает */ -
SVG элементы:
svg * { box-sizing: border-box; /* Может потребоваться отдельно */ }
Вывод: наиболее практичный подход — использовать html { box-sizing: border-box; } с наследованием через *::before, *::after { box-sizing: inherit; }, так как он обеспечивает лучший баланс производительности, гибкости и предсказуемости поведения.