CSS 100% wysokości z wyściółką / marginesem

To doprowadza mnie do szału już od kilku dni, ale w rzeczywistości jest to problem, który od kilku lat mi się podoba: z HTML/CSS jak Mogę zrobić element, który ma szerokość i / lub wysokość, która jest w 100% elementem nadrzędnym i nadal ma odpowiednie wypełnienie lub marginesy?

Przez "właściwe" mam na myśli, że jeśli mój element nadrzędny jest 200px wysoki i podam height = 100% z padding = 5px spodziewam się, że powinienem otrzymać 190px wysoki element z border = 5px ze wszystkich stron, ładnie wyśrodkowany w element nadrzędny.

Teraz wiem, że nie tak określa standardowy model pudełkowy (chociaż chciałbym wiedzieć dlaczego, dokładnie...), więc odpowiedź oczywista nie działa:

#myDiv {
    width: 100%
    height: 100%;
    padding: 5px;
}

Ale wydaje mi się, że musi być jakiś sposób na wiarygodną produkcję tego efektu dla rodzica o arbitralnej wielkości. Czy ktoś zna sposób wykonania tego (pozornie prostego) zadania?

A tak na marginesie to nie interesuje mnie kompatybilność IE więc powinno (miejmy nadzieję) ułatwi to sprawę.

EDIT: ponieważ poproszono o przykład, oto najprostszy, jaki przychodzi mi do głowy:

<html style="height: 100%">
    <body style="height: 100%">
        <div style="background-color: black; height: 100%; padding: 25px"></div>
    </body>
</html>

Wyzwaniem jest wtedy, aby czarna skrzynka pojawiła się z 25-pikselowym wypełnieniem na wszystkich krawędziach, bez powiększania strony na tyle dużej, aby wymagała pasków przewijania.

 735
css
Author: Abdelilah El Aissaoui, 2009-01-28

13 answers

Nauczyłem się robić tego typu rzeczy czytając "wzorce projektowe PRO HTML i CSS". {[2] } jest domyślną wartością wyświetlaną dla div, ale lubię to wyrażać jawnie. Kontener musi być właściwym typem; position atrybutem jest fixed, relative, lub absolute.

.stretchedToMargin {
  display: block;
  position:absolute;
  height:auto;
  bottom:0;
  top:0;
  left:0;
  right:0;
  margin-top:20px;
  margin-bottom:20px;
  margin-right:80px;
  margin-left:80px;
  background-color: green;
}
<div class="stretchedToMargin">
  Hello, world
</div>

Fiddle by Nooshu ' s comment

 706
Author: Frank Schwieterman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:56

Istnieje nowa właściwość w CSS3, której możesz użyć do zmiany sposobu, w jaki model pudełkowy oblicza szerokość/wysokość.

Ustawiając tę właściwość wartością "border-box" powoduje, że dowolny element, który zastosujesz, nie będzie rozciągał się po dodaniu wypełnienia lub obramowania. Jeśli zdefiniujesz coś o szerokości 100px i wypełnieniu 10px, nadal będzie to szerokość 100px.

box-sizing: border-box;

Zobacz tutaj wsparcie dla przeglądarki . Nie działa dla IE7 i niższych, jednak I uwierz, że Dean Edward ma IE7.js dodaje wsparcie dla niego. Enjoy :)

 334
Author: Marco Jardim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-07 21:24:54

Rozwiązaniem jest nie używać wysokości i szerokości w ogóle! Przymocuj wewnętrzne pudełko za pomocą górnego, lewego, prawego, dolnego, a następnie dodaj margines.

.box {margin:8px; position:absolute; top:0; left:0; right:0; bottom:0}
<div class="box" style="background:black">
  <div class="box" style="background:green">
    <div class="box" style="background:lightblue">
      This will show three nested boxes. Try resizing browser to see they remain nested properly.
    </div>
  </div>
</div>
 63
Author: amolk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-04 09:13:25

Lepszym sposobem jest właściwość calc (). Więc twoja sprawa wyglądałaby tak:

#myDiv {
    width: calc(100% - 5px);
    height: calc(100% - 5px);
    padding: 5px;
}
Proste, czyste, bez obejścia. Upewnij się tylko, że nie zapominasz o odstępie między wartościami a operatorem (np. (100%-5px), który złamie składnię. Smacznego!
 36
Author: Brian Aderer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-31 15:40:10

Zgodnie ze specyfikacją W3C wysokość odnosi się do wysokości widocznego obszaru, np. na monitorze o rozdzielczości 1280x1024 pikseli 100% wysokości = 1024 pikseli.

Min-height odnosi się do całkowitej wysokości strony wraz z zawartością, więc na stronie, gdzie zawartość jest większa niż 1024px min-height: 100% rozciągnie się, aby uwzględnić całą zawartość.

Innym problemem jest to, że padding i obramowanie są dodawane do wysokości i szerokości w większości nowoczesnych przeglądarek z wyjątkiem ie6(ie6 jest właściwie całkiem logiczne, ale nie jest zgodne ze specyfikacją). Nazywa się to modelem pudełkowym. Więc jeśli podasz

min-height: 100%;
padding: 5px; 

Da ci 100% + 5px + 5px za wysokość. Aby to obejść, potrzebujesz pojemnika na owijki.

<style>
    .FullHeight { 
       height: auto !important; /* ie 6 will ignore this */
       height: 100%;            /* ie 6 will use this instead of min-height */
       min-height: 100%;        /* ie 6 will ignore this */
    }

    .Padded {
       padding: 5px;
    }
</style>

<div class="FullHeight">
   <div class="Padded">
      Hello i am padded.
   </div
</div>
 21
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-19 06:31:53

To jest jeden z idiotów CSS - jeszcze nie rozumiem rozumowania (jeśli ktoś wie, pls. wyjaśnij).

100% oznacza 100% wysokości kontenera - do której dodawane są dowolne marginesy, obramowania i wypełnienia. Tak więc nie jest możliwe uzyskanie kontenera, który wypełnia jego rodzica i który ma margines, obramowanie lub wypełnienie.

Zauważ również, że ustawienie wysokości jest notorycznie niespójne między przeglądarkami.


Kolejna rzecz, której się nauczyłem od zamieszczenia oznacza to, że procent jest względny względem długości kontenera , to znaczy jego szerokości, co sprawia, że procent jest jeszcze bardziej bezwartościowy dla wysokości.

W dzisiejszych czasach jednostki VH i VW viewport są bardziej przydatne, ale nadal nie są szczególnie przydatne dla niczego innego niż kontenery najwyższego poziomu.

 7
Author: Lawrence Dol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-19 01:20:02

1. Pełna wysokość z padding

body {
  margin: 0;
}
.container {
  min-height: 100vh;
  padding: 50px;
  box-sizing: border-box;
  background: silver;
}
<div class="container">Hello world.</div>

2. Pełna wysokość z margin

body {
  margin: 0;
}
.container {
  min-height: calc(100vh - 100px);
  margin: 50px;
  background: silver;
}
<div class="container">Hello world.</div>

3. Pełna wysokość z border

body {
  margin: 0;
}
.container {
  min-height: 100vh;
  border: 50px solid pink;
  box-sizing: border-box;
  background: silver;
}
<div class="container">Hello world.</div>
 6
Author: Stickers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 23:06:41

Innym rozwiązaniem jest użycie display: table, który ma inne zachowanie modelu pudełkowego.

Możesz ustawić wysokość i szerokość rodzica i dodać padding bez rozszerzania go. Dziecko ma 100% wzrostu i szerokości minus podkładki.

JSBIN

Inną opcją byłoby użycie propperty o rozmiarze pudełkowym. Jedynym problemem z obu byłoby to, że nie działają w IE7.

 5
Author: user1721135,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-31 09:07:03

Inne rozwiązanie: możesz użyć jednostek procentowych dla marginesów, jak również rozmiarów. Na przykład:

.fullWidthPlusMargin {
    width: 98%;
    margin: 1%;
}

Głównym problemem jest to, że marginesy będą nieznacznie wzrastać/zmniejszać się wraz z rozmiarem elementu nadrzędnego. Prawdopodobnie preferowaną funkcjonalnością jest to, aby marginesy pozostały stałe, a element potomny rosł/zmniejszał się, aby wypełnić zmiany w odstępach. W zależności od tego, jak ciasny musi być wyświetlacz, może to być problematyczne. (Ja też wybrałbym mniejszy margines, jak 0.3%).

 4
Author: ktbiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-29 19:12:38

Przykład Franka trochę mnie zdezorientował - nie zadziałał w moim przypadku, ponieważ nie rozumiałem jeszcze wystarczająco dobrze pozycjonowania. Ważne jest, aby pamiętać, że nadrzędny element kontenera musi mieć pozycję niestatyczną (wspomniał o tym, ale przeoczyłem to i nie było tego w jego przykładzie).

Oto przykład, w którym dziecko-biorąc pod uwagę wypełnienie i obramowanie-używa bezwzględnego pozycjonowania, aby wypełnić rodzica w 100%. Rodzic wykorzystuje pozycjonowanie względne w celu zapewnienia punktu odniesienia dla pozycja dziecka pozostając w normalnym przepływie - kolejny element "more-content"nie jest naruszony:

#box {
    position: relative;
    height: 300px;
    width: 600px;
}

#box p {
    position: absolute;
    border-style: dashed;
    padding: 1em;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
}
<div id="box">
  <p>100% height and width!</p>
</div>
<div id="more-content">
</div>

Przydatny link do szybkiej nauki pozycjonowania CSS

 2
Author: Peter Tseng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-30 11:15:31

Jest teraz 2018, Nowe Gorące gówno powinno być wspomniane tutaj, ponieważ pytanie ciągle pojawia się w Google.

Rozwiązanie z flexbox (działa na IE11): (lub widok na jsfiddle )

<html>
  <style>
    html, body {
      height: 100%; /* fix for IE11, not needed for chrome/ff */
      margin: 0; /* CSS-reset for chrome */
    }
  </style>
  <body style="display: flex;">
    <div style="background-color: black; flex: 1; margin: 25px;"></div>
  </body>
</html>

(CSS-reset niekoniecznie jest ważny dla rzeczywistego problemu.)

Ważną częścią jest flex: 1 (w połączeniu z display: flex w rodzicu). Najzabawniejsze wyjaśnienie, jakie znam, jak działa właściwość Flex, pochodzi z React-native dokumentacja, więc i tak się do niej odwołuję .

 1
Author: Putzi San,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-28 12:36:56

Obramowanie wokół div, zamiast marginesu treści strony

Inne rozwiązanie-chciałem tylko prostą ramkę wokół krawędzi mojej strony i chciałem 100% wysokości, gdy zawartość była mniejsza.

Border-box nie działał, a stałe pozycjonowanie wydawało się złe dla tak prostej potrzeby.

Skończyło się na dodaniu obramowania do mojego kontenera, zamiast polegać na marginesie treści strony-wygląda to tak:

body, html {
    height: 100%;
    margin: 0;
}

.container {
    width: 100%;
    min-height: 100%;
    border: 8px solid #564333;
}
 0
Author: Kris Randall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-18 03:19:13
  <style type="text/css">
.stretchedToMargin {
    position:absolute;
    width:100%;
    height:100%;

}
</style>
 -2
Author: Mujassir Nasir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-20 13:10:13