Flexbox тело и главная минимальная высота
https://jsfiddle.net/vz7cLmxy/
Я пытаюсь заставить тело расширяться, но минимальная высота не работает. Я читал другие связанные темы, но не могу обдумать это.
CSS и HTML
body,
html {
padding: 0;
margin: 0;
min-height: 100%;
}
body {
display: flex;
background: #eee;
flex-direction: column;
}
.menu {
background: red;
color: #fff;
padding: 10px;
}
.wrap {
display: flex;
}
.sidebar {
background: #ddd;
width: 300px;
}
.main {
background: #ccc;
flex: 1;
}
.footer {
background: #000;
color: #fff;
padding: 10px;
}
<div class="menu">Menu</div>
<div class="wrap">
<div class="sidebar">Sidebar</div>
<div class="main">Main</div>
</div>
<div class="footer">Footer</div>
Ответы
Ответ 1
Используйте flex: 1
для центрированного элемента:
.Site {
display: flex;
min-height: 100vh;
flex-direction: column;
}
.Site-content {
flex: 1;
background-color:#bbb;
}
<body class="Site">
<header>This is the header text ☺</header>
<main class="Site-content">…</main>
<footer>This is the footer text ☻</footer>
</body>
Ответ 2
Чтобы получить min-height
с относительными единицами, работающими даже в IE11, нужен лишь небольшой трюк.
Природа min-height
заключается в перезаписи height
, когда height
меньше, чем min-height
. Очень ясно! Но ловушка возникает, когда min-height
имеет действительную единицу (%
или vh
), а height
не установлен. Поскольку оно относительно, оно не имеет оснований для ретрансляции.
Для всех основных браузеров, кроме Internet Explorer, одна возможность состоит в изменении единицы измерения с %
на vh
:
body {
min-height: 100vh;
}
Для Internet Explorer требуется height
(будет перезаписан из min-height
):
body {
height: 1px;
min-height: 100vh;
}
или для сохранения %
правила должны быть применены и к html
:
html, body {
height: 1px;
min-height: 100%;
}
Кросс-браузерное решение для OP требует height: 1px
на body
и, конечно, flex-grow: 1
для .wrap
, чтобы позволить ему расти быстрее, чем menu
и footer
:
body,
html {
padding: 0;
margin: 0;
height: 1px; /* added */
min-height: 100%;
}
body {
display: flex;
background: #eee;
flex-direction: column;
}
.menu {
background: red;
color: #fff;
padding: 10px;
}
.wrap {
display: flex;
flex-grow: 1; /* added */
}
.sidebar {
background: #ddd;
width: 300px;
}
.main {
background: #ccc;
flex: 1;
}
.footer {
background: #000;
color: #fff;
padding: 10px;
}
<div class="menu">Menu</div>
<div class="wrap">
<div class="sidebar">Sidebar</div>
<div class="main">Main</div>
</div>
<div class="footer">Footer</div>