CSS box-sizing — як рахується ширина елемента


Властивість box-sizing дозволяє змінити алгоритм розрахунку розмірів блоку, щоб властивості width і height задавали розміри не контенту, а саме розміри блоку.

Властивість box-sizing

Без задання, коли ви вказуєте ширину блоку (width), браузер розраховує її без врахування меж (border) та внутрішніх відступів (padding), вказавши border-box у якості значення властивості box-sizing, браузер почне враховувати кордони та відступи у формуванні ширини та висоти блоку.

Типовий алгоритм за замовчуванням використовує content-box, а це означає, що будь-які розміри, які ви надаєте, використовуються лише для визначення розміру вікна вмісту - будь-які поля і межі виводяться за межами вікна вмісту. Тому, застосовуючи ширину 200 пікселів та поле 10 пікселів до елемента, елемент буде займати загальну ширину 220 пікселів (припускаючи, що повзунок додається до всіх чотирьох сторін або, принаймні, з лівого та правого боку). Це відбувається тому що підкладка додана до ширини вікна.

Ви можете використовувати значення border-box, щоб змінити це так, що будь-які поля та межі будуть включені в розміри висоти та ширини елемента. У цьому випадку елемент буде займати лише 200 пікселів, тому що заповнення додано до внутрішньої частини елемента.

Ця властивість особливо важлива для створення адаптивного дизайну.

автор: NagarD

Загальний опис

автор: NagarD

Нотатка

Деякі фахівці рекомендують веб-розробникам застосовувати значення border-box для всіх елементів на сторінці.

автор: NagarD

Синтаксис

box-sizing: content-box|border-box|initial|inherit;

Властивість box-sizing може отримувати 4 значень:

content-box

Грунтується на стандартах CSS, при цьому властивості width і height задають ширину і висоту контенту і не включають в себе значення відступів, полів і кордонів.

автор: NagarD

border-box

Властивості width і height включають в себе значення полів і кордонів, але не відступів (margin). Ця модель використовується браузером Internet Exporer в режимі сумісності.

автор: NagarD

initial

Встановлює властивість у значення без задання

автор: NagarD

inherit

Вказує на спадковість властивості від свого батьківського елемента

автор: NagarD

Значення без задання: content-box
Наслідує: Ні
Анімується: Ні
JavaScript синтаксис: object.style.boxSizing="border-box"

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
10 29 5.1 7 12 8
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
4 18 29 6

Приклади

+ запропонувати свій приклад у пісочниці

Обом блокам задано width: 300px, однакові рамки й відступи. З content-box (типово) 300px — це лише вміст, тож блок реально ширший; з border-box у 300px входить усе.

HTML

<div class="cb">content-box: 300px — тільки вміст, рамки додаються зверху</div>
<div class="bb">border-box: 300px разом із рамками й відступами</div>

CSS

div {
    width: 300px;
    padding: 20px;
    border: 10px solid #0172ad;
    margin-bottom: 8px;
    background: #eef6ff;
}

.cb { box-sizing: content-box; }
.bb { box-sizing: border-box; }
автор: NagarD

Дві колонки по 50% з рамками і відступами стоять пліч-о-пліч: завдяки border-box рамки не додаються до ширини, інакше 50% + рамки перевищили б 100% і друга колонка з'їхала б униз.

HTML

<div class="col">ліва колонка 50%</div>
<div class="col">права колонка 50%</div>

CSS

.col {
    box-sizing: border-box;
    width: 50%;
    float: left;
    padding: 12px;
    border: 2px solid #0172ad;
    background: #eef6ff;
}
автор: NagarD

Використання властивості

HTML

<div id="content-box">
		<p>
      <h3>box-sizing: content-box;</h3>
      <h4> Цей контейнер має розмір 400px. Ширину + 40px. padding + 20px = 480px.</h4>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
		tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
		quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
		consequat.</p>
	</div>
	<div id="border-box">
		<p>
      <h3>box-sizing: border-box;</h3>
      <h4>Цей контейнер має розмір 400px.</h4> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
		tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
		quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
		consequat.</p>
	</div>

CSS

div {
			transition:;
		}

		#content-box{
			width:400px;
			background:#ccc;
			padding:20px;
			border:10px solid black;
			box-sizing: content-box;
			-moz-box-sizing: content-box;
			-webkit-box-sizing: content-box;
			float:left;
			margin-right: 20px;
		}

		#border-box {
			width:400px;
			background:#ccc;
			padding:20px;
			border:10px solid black;
			box-sizing: border-box;
			-moz-box-sizing: border-box;
			-webkit-box-sizing: border-box;
			float:left;
		}
автор: NagarD

Різні значення у дії

HTML

<div class="field-items">
   <div class="field-item even">
      <div id="playground-result">
         <div id="playground-property" style="padding: 20px; border: 3px solid red; width: 200px; box-sizing: content-box">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Ducimus omnis ut eveniet dolorem ratione, mollitia expedita porro provident? Officia, blanditiis. Aliquam aut saepe obcaecati ullam quas totam placeat molestias consectetur!</div>
      </div>
      <div class="grid-x grid-margin-x">
        <p>Вибери потрібне значення для властивості <b>box-sizing</b>:</p>
         <div id="playground-value" class="cell medium-12 large-6">
           <label><input type="radio" name="value" value="content-box" checked="">content-box</label> 
           <label><input type="radio" name="value" value="border-box">border-box</label></div>
         <div id="playground-code" class="cell medium-12 large-6">
           
            <pre>div {
  width: 400px;
  padding: 20px; 
  border: 3px dashed #c26558;
  box-sizing: <span id="playground-code-value">content-box</span>;
}<div class="preloader"><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div></pre>
         </div>
      </div>
   </div>
</div>

CSS

#playground-property{
  margin-bottom: 20px;
  font-size: 18px;
}
pre{
  background: lightgrey;
  font-weight: 700;
  font-size: 17px;
}
p{
  font-size: 18px;
}

JS

var radios = document.querySelectorAll('#playground-value input[type="radio"]');

function changeHandler(event) {
  document.getElementById('playground-property').style.boxSizing = this.value;document.getElementById('playground-code-value').innerText = this.value;
}
Array.prototype.forEach.call(radios, function (radio) {
  radio.addEventListener('change', changeHandler);
});
автор: NagarD

Два блоки з однаковими width: 200px, padding: 20px і border: 5px. Верхній рахується як content-box і фактично займає 250px, нижній із border-box — рівно 200px.

HTML

<div class="ruler">лінійка 200px</div>

<div class="box content">content-box</div>
<div class="box border">border-box</div>

CSS

.ruler {
    width: 200px;
    background: #ffe9b0;
    border-top: 2px solid #c08a00;
    border-bottom: 2px solid #c08a00;
    font: 13px sans-serif;
    text-align: center;
    margin-bottom: 10px;
}
.box {
    width: 200px;
    padding: 20px;
    border: 5px solid #4a6fa5;
    background: #e8eef7;
    font: 14px sans-serif;
    margin-bottom: 10px;
}
.content { box-sizing: content-box; }
.border  { box-sizing: border-box; }
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле веде сходинками (розділ → тип → сторінка), а хибний ключ підкреслить хвилею.
[[!sandbox/S0oh1hBm]] Живий приклад окремим рядком — саме вікно результату. Той самий ключ зі знаком !: наберіть [[! і дійдіть сходинками до потрібної сторінки, список покаже її приклади.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Правка
Зворотний зв'язок
Вхід