Розмір розміру коробки CSS3: поле поля; Чому ні?


139

Чому ми не маємо box-sizing: margin-box;? Зазвичай, коли ми вкладаємо box-sizing: border-box;свої стилі, ми справді маємо на увазі колишнього.


Приклад:

Скажімо, у мене є макет сторінки на 2 стовпці. Обидві стовпчики мають ширину 50%, але вони виглядають якось некрасиво, оскільки жолобу немає (проміжок посередині); Нижче наведено CSS:

.col2 {
    width: 50%;
    float: left;
}


Щоб застосувати жолоб, ви можете подумати, що ми можемо просто встановити правий запас на першому з двох стовпців; щось на зразок цього:

.col2:first-child {
    margin-right: 24px;
}

Але це призведе до того, що другий стовпець перетвориться на новий рядок, тому що це дійсно наступне:

50% + 50% + 24px > 100%

box-sizing: margin-box;вирішив би це питання шляхом включення поля у обчислену ширину елемента. Я вважаю це дуже корисним, якщо не кориснішим box-sizing: border-box;.


30
"Чому ми не маємо box-sizing: margin-box;?" Оскільки, хоча горизонтальні поля не руйнуються, така пропозиція серйозно заважатиме вертикальному краху. У будь-якому випадку, якщо ви хочете запропонувати щось для стандартизації, Stack Overflow не є правильним місцем. Спробуйте списки розсилки.
BoltClock

16
У певних ситуаціях ви можете це обійти, скориставшись border: xxx solid transparent;межею border-box. Це порушить деякі інші речі, наприклад, такі як box-shadow.
Натан Осман

28
Чи закриваємо ми зараз усі питання щодо стандартів як "неконструктивних" ?? Це справедливе запитання, і він навіть має пряму відповідь: у нас його немає, box-sizing: margin-boxтому що він би не працював з руйнуванням маржі.
thomasrutter

@thomasrutter: У той момент, коли я закрив це, не було більш чітко вираженої причини, що було більше року тому. У будь-якому випадку "неконструктивного" вже немає (мається на увазі ні, ми насправді нічого не закриваємо як неконструктивне), і оскільки в цілому "я маю ідею, ось як це працює, давайте зробимо це стандартом!" річ була видалена з моменту останнього закриття, тепер насправді це звучить як практичне "чому X не може працювати"? питання. Це все ще неймовірно спекулятивне питання (мої міркування вище насправді є не що інше, як освічена здогадка), але я не хочу далі коментувати це.
BoltClock

чому б просто не мати внутрішнє обгортання / поділ,
ashley

Відповіді:


55

Ви не можете використати width: calc(50% - 24px);для своїх колег? Потім встановіть ваші поля.


5
Це дуже залежить від браузера. Ймовірно, близько 2020 року ie15 підтримає це, і вам буде дозволено використовувати це також у своїй роботі :-(
peterh - Відновіть Моніку

1
Здається, це не так добре працює у Firefox? (або щось інше, що я зробив, це не так)
Laurengineer

@Morgan Feeney: Так, але розмір поля не має значення, яке називається полем маржина (у чому вся суть цього питання). Навіть якщо таке значення було введене зараз, як ви пропонуєте виправлення / поліфілінг / прошивання його в існуючі браузери?
BoltClock

Так, але ... конкретно, відповідаючи на відповідь, що пропонує calc () як спосіб вирішення.
Morgan Feeney

Не впевнений, що це стосується конкретного прикладу, але головний негатив щодо використання calc () у нашому сценарії (як у FF 53.0.3) полягає в тому, що його поведінка не аналогічна ширині: X%; З того, що ми можемо бачити "calc", робиться під час первинного візуалізації в статичний Xpx. Це означає, що на відміну від ширини: X%, обчислений стовпець не змінює розмір автоматично з розміром контейнера.
Панчо

16

Я думаю, ми могли б мати box-sizing: margin-box. Модель css box точно показує, якими є позиції поля кадрів.

Є невеликі проблеми - наприклад, поля з полями можуть перекриватися - але їх важко вирішити.

Я думаю, ситуація така ж, як ми бачимо з overflow-x& overflow-yкомбінаціями, з абсолютними позиціонованими знаками в осередках таблиці, з комбінацією min | max-width | висоти з розміром поля тощо.

Є функції, дійсно прості функції, які розробники браузерів просто не розробляють.

ІМХО, box-sizing: margin-boxбули дуже корисною функцією. Ще однією корисною функцією було те box-sizing: padding-box, що воно існує принаймні в стандарті, але воно не було реалізовано в жодному з основних браузерів. Навіть у новітньому хромі!


Примітка: коментар @Oriol: Firefox реалізував розмір коробки: padding-box. Але інші цього не зробили, і це було вилучено із специфікації. Firefox видалить його у версії 50. Сумно.


2
Firefox реалізував box-sizing: padding-box. Але інші цього не зробили, і це було вилучено із специфікації. Firefox видалить його у версії 50. Сумно.
Оріол

6

Хлопець вгорі запитує про додавання поля до загальної ширини, включаючи прокладку та облямівку. Річ у тому, що поле застосовується поза коробкою, а прокладки та облямівка - ні при використанні border-box.

Я намагався досягти border-marginідеї. Я знайшов, що якщо використовуючи margin, ви можете або додати клас .lastостаннього елемента (з полями, а потім застосувати маржу нуля, або використовувати :last-child/:last-of-type). Або додайте рівні поля напротив (подібне до версії для набивання вище).

Дивіться приклади тут: http://codepen.io/mofeenster/pen/Anidc

border-boxобчислює ширину елемента + його прокладку + його межу як загальну ширину. Тож якщо у вас є 2 divс, які шириною 50%, вони будуть суміжними. Якщо ви додасте 8pxдо них прокладки, то у вас буде жолоб 16px. Поєднайте це з обгортковим елементом, який також має прокладки 8px- у вас буде добре викладена сітка з рівними жолобами по всьому шляху.

Дивіться цей приклад тут: http://codepen.io/mofeenster/pen/vGgje

Останній - мій улюблений метод.


4

Я впевнений, що все це очевидно, але я все одно набираю це, бо ... ну, мені потрібні вправи. Чи не буде такий результат не таким ефективним, як box-sizing: margin-box;:

.col2 {
    width: 45%;
    height: 90%;
    margin: 5% 2.5%;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    float: left;
}

http://jsfiddle.net/Fg3hg/

box-sizingвикористовується для контролю, з якої точки оцінюється накладка та бордюр загального розміру елемента. Тож якщо не коштувати включити pxполя з %шириною (як це завжди буває), простіше підрахувати, яка повинна бути відносна відсоткова сума, оскільки вам не потрібно включати прокладки та рамки до визначеної ширини.


9
Випадок використання для чогось подібного до поля поля полягає в тому, щоб дозволити змішування відсоткових ширин з полями пікселів. Якщо ви хочете два 50% -ві поля з запасом 1px між ними, цього неможливо досягти з відсотковим запасом в 1% аналогічних - деякі невеликі розміри екрана округлятимуть 1% до 0 пікселів, і раптом у вас немає поля. Нам дійсно потрібна додаткова підтримка браузера для calc (), як показує @Slouch, або модель flexbox.

1
Якщо це турбота, батьківський контейнер буде менше 100 пікс., І я би сподівався, що деякі елементи дизайну будуть передумані в цей момент. Є ще деякі речі, які ви могли б зробити з вкладеними елементами тощо, але, так, змінні обчислення були б досить допінговими. Якщо ви займаєтесь такими речами, як sass або менше, я думаю, що вони роблять багато цього. Я грав з ними, але ще не є джедай.
Плюмер

2
Що ви пропонуєте - це робота. Це не ідеальний спосіб писати CSS, коли ви працюєте зі складними макетами. Ви припускаєте, що дизайнер чи автор хочуть використовувати відсотки у своєму дизайні. Також незалежно від цього питання, навіть якщо ви використовуєте функцію calc () для розробки інтервалів за допомогою піксельних полів, це все-таки обмежує дизайнера, оскільки вони повинні заздалегідь визначити, що таке жолоблення, а не дозволяти перезаписувати його за допомогою CSS.
безмежний

Я не розумію вашої точки зору. Проблема полягала в тому, що включення px та% викликає розриви рядків, оскільки маржа не включена в обчислення розміру. Поле не включається в розмір елемента, це простір, який ви хочете відобразити навколо елемента. Плюс, як би margin-boxвпоратися з багатовимірними розрахунками маржі? @mediaточки прориву, max-widthі min-widthпрацювати просто чудово. Я думаю, що це margin-boxможе скоротити деякий набряк, але я також отримую причини, чому це може вважатися зайвим.
Пластун

Чому ніхто не згадує про те, що цей запас Значення відсотка є відсотком ширини з якоїсь причини ... не має значення висота чи ширина. Використовується ширина батьківського. Що, мабуть, найменше, тому код вище не повинен працювати і не працює. якщо ви не зробите висоту і ширину рівними.
Мухаммед Умер

4

Це пояснюється тим, що атрибут розміру коробки відноситься до розміру елемента після обчислення заданих параметрів, що залежать від розміру (прокладки, межі). "box-sizing: border-box" встановлює висоту / ширину елемента і враховує обшивку, а також ширину рамки. Обсяг поля елемента є більшим, ніж сам елемент, тобто він модифікує потік сторінки та оточуючих її елементів, отже, безпосередньо змінюючи те, як елемент вписується в його батьківщину щодо своїх братів. Зрештою, значення атрибута "поле для поля" може спричинити великі проблеми і по суті таке саме, як безпосередньо встановити висоту / ширину елементів.


1
мої вибачення, але я не розумію, як включення прокладки, межі та запасу в просторовий розрахунок через "margin-box" концептуально відрізнятиметься від включення прокладки та border через "border-box". Напевно, це лише варіація на ту саму тему?
Панчо

1

На Codrops є кілька хороших статей на тему ефекту поля і ряду змушені переповнюватись. Вони пропонують використовувати блок rem або em з нормалізатором css, встановивши розмір шрифту 100% для всіх браузерів, тоді, коли ви встановлюєте ширину і поля, легко відстежувати ефект на ширину рядка, просто робивши примітку в коментарях до загальна ширина. Перетворення 16 пікселів в 1 ем - це спосіб вирахування цільових вікон перегляду загальної кількості витдх.

Працюючи так, як мінімум, на етапі розробки, а потім, якщо ви хочете "чуйні" шаблони, ви можете конвертувати ширину в%, включаючи ширину поля.

Інший і часто простіший спосіб, яким вони пропонують обробляти жолоби, - це використовувати псевдо після та content: '';на кожному з ваших стовпців, який, як я вважаю, працює дуже добре. Якщо ви встановите клас div, який є визначеним останнім стовпцем, таким як кінець, ви можете націлити на нього, щоб не мати псевдо після або ширший; що завжди найкраще підходить для вашого макета.

Додатковий бонус від використання цього методу псевдоелементів полягає в тому, що він також дає ціль для тіней, які можуть дати більш 3d ефект і більшу глибину плоскому зображенню також на моніторі читачів. На даний момент я експериментую з цим ефектом, розширюючи масштаби ефектів, які використовуються на кнопках, 'налаштовує' градієнти та z-індекс.


1

Розміри елементів , що не замінюються, на рівні блоку в нормальному потоці повинні задовольняти

margin-left + border-left-width + padding-left + width + padding-right + border-right-width + margin-right = ширина блоку, що містить

При надмірному обмеженні браузери повинні коригувати або лівий, або правий край. Я думаю, що означає, що ширина поля поля повинна дорівнювати ширині блоку, що містить (тобто 100%).

У вашому випадку прозорі межі з box-sizing: border-boxможе працювати так само, як і поля .


1

Можливо, встановіть кордон на 0% непрозорості за допомогою RGBA і використовуйте кордон як запас.


Звучить як хак, але зробив би цю роботу.
Морган Фіні

Це може виявитися корисним, якщо ви не хочете використовувати обгортки для досягнення завдання.
безмежний

... якщо вам насправді не потрібен кордон
FrancescoMM

@FrancescoMM - трохи "галасливий", але ви можете зробити коробку з прозорою рамкою "шириною поля" (і без поля), і всередині цього помістіть коробку з видимою межею ширини, яку ви бажаєте відобразити (знову не маючи маржа)
Панчо

1
Я просто не можу дотримуватися такого мислення. Чи є щось більш природне, ніж сказати, що я хочу дві коробки 1px, кожен займає 50%вільне місце? Саме це і margin-boxзробило б. Або забудьте поле поле та подумайте про доступний простір. Не 50% батьківського контейнера, але 50% того, що залишилося. Немає «кальку», немає «5% маржі», немає такого безладу ...
maaartinus

0

Існує цікава ситуація при використанні розміру коробки всередині корпусу

відсутність вмісту, поле без кордону не дає жодного значення на лівому правому полі% перерахунок цих алгоритмів перерахування двох вікон

  .body{
    box-sizing: border-box;
    margin:0 3%;
  }

Версії Firefox до 57 також підтримували значення padding box для розміру коробки, хоча це значення було видалено із специфікації та пізніших версій браузера.

Так що маржинажна коробка навіть не планується ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.