Як запобігти зміні властивості накладки в ширину або висоту в CSS?


227

Я створюю сайт із DIVs. Все працює, крім випадків, коли я створюю DIV. Я створюю їх так (приклад):

newdiv {
    width: 200px;
    height: 60px;
    padding-left: 20px;
    text-align: left;
}

Коли я додаю padding-leftвластивість, ширина DIVзмін змінюється на 220 пікселів, і я хочу, щоб вона залишалася на рівні 200 пікселів.

Скажімо, я створюю ще одне DIVім’я, anotherdivточно таке ж newdiv, і вкладаю його всередину, newdivале newdivне має прокладки і не anotherdivмає padding-left: 20px. Я отримую те ж саме, newdivширина буде 220 пікселів.

Як я можу виправити цю проблему?


3
Мені сумно сказати, але мені подобається, як IE впорається з цим ... Має набагато більше сенсу для мене ...
Ніку Сурду

Відповіді:


390

Додати власність:

-webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
-moz-box-sizing: border-box;    /* Firefox, other Gecko */
box-sizing: border-box;         /* Opera/IE 8+ */

Примітка. Це не працюватиме в Internet Explorer нижче версії 8.


14
Це чудове рішення для бордюрів, але як це допомагає для прокладки?
Като

6
Це чиста магія! - Він фіксує модель коробки, яку ми всі знаємо і ненавидимо! тобто змушує його працювати так, як пропонує інтуїція - а не специфікації - але, наскільки я знаю, жодна специфікація не порушує: D Ця стаття добре роз'яснює це ... stackoverflow.com/questions/779434/…
технічний

2
@techničkebloke Ваше посилання просто повертається до цього питання.
mhenry1384

11
Ну так, скопіюйте та вставте півень. Це посилання, яким я мав намір поділитися ... paulirish.com/2012/box-sizing-border-box-ftw
технічний

1
Багато з вас повинні врахувати ширину: автоматичний трюк нижче. Працює через веб-переглядачі, менше коду тощо.
Райан Шилінгтон



11

Якщо ви хочете відрізати текст у div, не змінюючи розмір div, використовуйте CSS text-indentзамість padding-left.

.indent {
  text-indent: 1em;
}
.border {
  border-style: solid;
}
<div class="border">
  Non indented
</div>

<br>

<div class="border indent">
  Indented
</div>


1
Це єдине рішення, яке я знайшов, що працював на моєму ділі фіксованої ширини. На жаль, розмір коробки не зупинив накладки від впливу ширини, на жаль, тому тонна подяка за вказівку на цю дивовижну маленьку властивість.
Стево


1

коли я додаю властивість ліворуч, то ширина DIV змінюється на 220 пікселів

Так, саме за стандартами. Ось так і має працювати.

Скажімо, я створюю ще один DIV з назвою Anotherdiv, точно такий же, як newdiv, і вставте його всередину newdiv, але у newdiv немає прокладки, а в Anotherdiv є padding-left: 20px. Я отримую те ж саме, ширина newdiv буде 220px;

Ні, newdiv залишиться шириною 200 пікселів.


2
Гуффа, це не так, як стандарти повинні працювати взагалі. Накладка, безумовно, не повинна впливати на розміри елемента, до якого він застосовується. З найбільшою повагою, чи можливо ви плутаєте "padding" з "margin"?
da5id

1
Так, накладка, безумовно, повинна впливати на розміри елемента. Я думаю, що саме ти плутаєшся ... як ти пропонуєш, щоб маржа вплинула на розміри елемента?
Гуффа

Власне, ви знаєте, я думаю, що ми в певній мірі обидва. Я настільки звик справлятися з ефектами, що повністю забув стандарт. Я знайшов хороше пояснення тут quirksmode.org/css/box.html
da5id

Отже, мої вибачення, пан Гуффа. Але в практичних цілях (про що ми говоримо все-таки) моя порада все ще гарна ні?
da5id

Ну, ви маєте рацію, що є помилка з коробкою, але це питання не стосується ... :)
Гуффа,

-1

просто змініть свою ширину div на 160px, якщо у вас є накладка 20px, це додасть 40px додатково до ширини вашого div, тому вам потрібно відняти 40px від ширини, щоб ваш дів виглядав нормальним і не перекручувався додатковою шириною на ньому і ваш текст весь заплутався.


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