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?


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.


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



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>


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;


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.


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ł.


2
Jest to to samo, co odpowiedź udzielona przez @rvarcher.
8bitjunkie
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.