Jak zapobiec zmianie szerokości lub wysokości właściwości wypełnienia w CSS?

227

Tworzę witrynę za pomocą DIVs. Wszystko działa, chyba że utworzę DIV. Tworzę je w ten sposób (przykład):

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

Gdy dodam padding-leftwłaściwość, szerokość DIVzmian zmieni się na 220 pikseli, a chcę, aby pozostała na poziomie 200 pikseli.

Załóżmy, że tworzę inny DIVo anotherdivdokładnie takiej samej nazwie newdivi umieszczam go w środku, newdivale newdivnie ma wypełnienia i anotherdivma padding-left: 20px. Dostaję to samo, newdivszerokość będzie wynosić 220 pikseli.

Jak mogę rozwiązać ten problem?

Sam
źródło
3
Przykro mi to mówić, ale podoba mi się, jak IE sobie z tym radzi ... Ma dla mnie o wiele więcej sensu ...
Nicu Surdu

Odpowiedzi:

390

Dodaj nieruchomość:

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

Uwaga: To nie będzie działać w przeglądarce Internet Explorer poniżej wersji 8.

Pramod
źródło
14
To świetne rozwiązanie dla granic, ale w jaki sposób pomaga to wypełniać?
Kato
6
To czysta magia! - Naprawia model pudełka, który wszyscy znamy i nienawidzimy! tzn. sprawia, że ​​działa tak, jak sugeruje intuicja - raczej niż specyfikacje - ale o ile wiem, nie łamie też żadnych specyfikacji: D Ten artykuł wyjaśnia to dobrze ... stackoverflow.com/questions/779434/
Technicalbloke
2
@technicalbloke Twój link wraca do tego pytania.
mhenry1384,
11
Ups, tak, skopiuj i wklej koguta. To jest link, który chciałem udostępnić ... paulirish.com/2012/box-sizing-border-box-ftw
Technicalbloke
1
Wielu z was powinno rozważyć szerokość: auto trick poniżej. Działa w różnych przeglądarkach, mniej kodu itp.
Ryan Shillington
39

Umieść div w swoim newdiv za pomocą width: autoimargin-left: 20px

Usuń wypełnienie z newdiv.

Strona modelu W3 Box ma dobre informacje.

Rvarcher
źródło
1
Po co używać dwóch div, skoro można użyć jednego?
Aaron Franke,
26

Spróbuj tego

box-sizing: border-box;
Ajay Gupta
źródło
11

Jeśli chcesz wciąć tekst w div bez zmiany rozmiaru div, użyj CSS text-indentzamiast padding-left.

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

<br>

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

mvndaai
źródło
1
To jedyne rozwiązanie, które znalazłem, działa dla mojego div o stałej szerokości. zmiana rozmiaru pudełka nie powstrzymała niestety wyściółki przed uderzeniem w szerokość, więc dzięki tonie za wskazanie tej niesamowitej małej właściwości.
Stevo
8

po prostu dodaj box-sizing: border-box;

Felix Wong
źródło
12
Jest to po prostu dokładnie to samo, co inne odpowiedzi tutaj już mówią.
Neil Lunn
1

kiedy dodam właściwość padding-left, szerokość DIV zmienia się na 220px

Tak, to jest dokładnie zgodne ze standardami. Tak to powinno działać.

Załóżmy, że tworzę inny DIV o nazwie innydiv dokładnie taki sam jak newdiv, i umieszczam go w newdiv, ale newdiv nie ma dopełnienia, a inny div ma dopełnienie-lewo: 20px. Rozumiem to samo, szerokość newdiv wyniesie 220 pikseli;

Nie, newdiv pozostanie szeroki na 200 pikseli.

Guffa
źródło
2
Guffa, wcale nie tak powinny działać standardy. Wypełnienie zdecydowanie nie powinno wpływać na wymiary elementu, na który jest nakładany. Z największym szacunkiem, czy to możliwe, że mylisz „wypełnienie” z „marginesem”?
da5id
1
Tak, wypełnienie ma zdecydowanie wpływać na wymiary elementu. Myślę, że to ty jesteś zdezorientowany ... jak proponujesz, aby margines wpływał na wymiary elementu?
Guffa
Wiesz, myślę, że oboje mamy rację. Jestem tak przyzwyczajony do radzenia sobie z efektami, że całkowicie zapomniałem o standardzie. Znalazłem tutaj dobre wytłumaczenie quirksmode.org/css/box.html
da5id
Przepraszam, panie Guffa. Ale ze względów praktycznych (o czym przecież mówimy) moja rada jest nadal dobra, prawda?
da5id
Cóż, masz rację, o ile występuje błąd modelu pudełka, ale to nie dotyczy tego pytania ... :)
Guffa
-1

po prostu zmień szerokość div na 160px, jeśli masz wypełnienie 20px, to dodaje 40px do szerokości diva, więc musisz odjąć 40px od szerokości, aby utrzymać div wyglądający normalnie i nie zniekształcony z dodatkową szerokością na nim i twój tekst wszystko zawalił.

Sean
źródło
2
Jest to to samo, co odpowiedź udzielona przez @rvarcher.
8bitjunkie