Старый вопрос, но flexbox дал нам супер простой способ реализации этого паттерна, знакомый вариант в макете «Святой Грааль»:
body {
/*set container to vertical (column) flex mode, ensure body is full height*/
display: flex;
min-height: 100vh;
flex-direction: column;
}
header, footer {
/*more or less equivalent to min-height:50px*/
flex-basis:50px
}
header {
background-color: #7AEE2D;
}
main {
background-color: #EBAE30;
/*tell main section to expand to fill available space, this is same as flex 1; or flex:1 1 auto;*/
flex-grow:1;
}
footer {
background-color: #34A4E7;
}
<header>header</header>
<main>main</main>
<footer>footer</footer>
Примечание о синтаксисе: для простоты я использовал здесь «атомарные» свойства CSS flexbox, но в простейшем случае вы, скорее всего, столкнетесь с сокращенным синтаксисом, используя само ключевое слово flex
. Значения по умолчанию для 3 свойств, которые можно установить для элементов flex (дочерних элементов контейнера display:flex
):
Начальное значение в качестве каждого из свойств сокращения: flex-grow: 0
flex-shrink: 1 flex-base: auto
Используя flex
, существует несколько способов составить эти свойства, указав одно, два или три значения, и эти значения могут быть получены с помощью ключевых слов, длины единиц (2px
) или безразмерных коэффициентов роста / сжатия 2
, В зависимости от ваших аргументов доступно много разных «перегрузок».
Например, flex-basis:50px
могло бы быть flex:50px
, flex:0 1 50px
, а flex-grow:1
могло бы быть flex 1;
или flex:1 1 auto;
. Это все еще не так плохо, как некоторые другие сокращения CSS, о которых я могу думать (position
, я смотрю на вас). Страница MDN сокращенного синтаксиса содержит более подробную информацию.