Блочные элементы (к которым по умолчанию относятся <div>
, <body>
, <html>
и др.) имеют свойство растягиваться по ширине на 100%, а по высоте подстраиваться под содержимое.
Пройдём в вашем коде от самого вложенного элемента к корневому, т.е. снизу вверх:
html {
/*
А этому блоку совсем ничего не задано, т.е.
цепочка наследования размеров обрывается
= подстраиваем высоту под контент
= всего одна строчка текста
*/
}
body {
/*
В этом блоке только блок .wrapper
+ высота указана, но 100% от чего?
= подстраиваем высоту под размер блока .wrapper
*/
height: 100%;
}
.wrapper {
/*
В этом блоке только блок .inner
+ не указана высота
= подстраиваем высоту под размер блока .inner
*/
min-height: 100%;
}
.inner {
/*
В этом блоке всего одна строчка текста
+ не указана высота
= подстраиваем высоту под размер текста
*/
min-height: 100%;
}
<div class="wrapper">
<div class="inner">Контент</div>
</div>
Если бы была указана высота для <html>
в 100%, то она соответствовала бы видимой части документа (читай, высоте окна), которая имеет вполне себе фиксированные размеры.
Также следует учитывать, что min- и max- - это, так скажем, "ограничители" и нежелательно заменять ими явное указание размеров (независимо от того, относительные они или абсолютные).
Итак, только тег <html>
со значением 100% хоть что-то знает об истинном размере, отталкиваясь от высоты окна.
Теперь снова пройдёмся по иерархии и на каждом элементе зададим себе вопрос: "100% от чего? От какого значения?"
html {
height: 100%; /* 100% от высоты окна */
box-shadow: inset 0 0 10px #f00;
}
body {
height: 100%; /* 100% от высоты html */
box-shadow: inset 0 0 10px #fa0;
}
.wrapper {
min-height: 100%;
height: 100%; /* 100% от высоты body */
box-shadow: inset 0 0 10px #090;
}
.inner {
min-height: 100%; /* 100% от высоты .wrapper */
box-shadow: inset 0 0 10px #00f;
}
<div class="wrapper">
<div class="inner">Контент</div>
</div>