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>