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.