Есть основной блок с контентом различной высоты, а под ним размещён футер. Если контент не достигает всей высоты экрана, нужно чтобы блок .container занимал всё свободное место окна браузера. При этом футер должен быть внизу страницы и оставаться видимым. Футер может менять высоту, но при этом он должен оставаться прижатым к нижнему краю окна браузера.
.container { background: #fff margin: auto height: auto width: 900px } header content footer
Ответ Для прижатия футера к низу экрана, есть несколько решений. Ниже представлены варианты от самого актуального до устаревшего: 1. Решение через Grid Layout для АДАПТИВНОЙ высоты футера
html { height: 100% } body { margin: 0 color: #fff /* Растягиваем body по высоте html */ min-height: 100% display: grid grid-template-rows: auto 1fr auto } header { background: blue } main { background: red } footer { background: black } header content footer
2. Решение через Flexbox для АДАПТИВНОЙ высоты футера
body { margin: 0 color: #fff display: flex flex-direction: column min-height: 100vh } header { background: blue } main { /* Чтобы занимал оставшееся пространство */ flex-grow: 1 background: red } footer { /* Чтобы footer не уменьшался */ flex-shrink: 0 background: black } header content footer
3. Решение через таблицы для АДАПТИВНОЙ высоты футера
body { margin: 0 color: #fff display: table min-height: 100vh width: 100% } header { background: blue } main { display: table-row /* Чтобы ряд занимал всё оставшееся пространство, так как табличная разметка не позволит ему вытолкнуть header и footer */ height: 100% background: red } footer { background: black } header content footer
4. Решение на нативном JavaScript для АДАПТИВНОЙ высоты футера
// Высчитываем высоту footer и делаем соответствующий отступ от main: function footer() { const main = document.getElementsByTagName('main')[0], footer = document.getElementsByTagName('footer')[0] main.style.paddingBottom = footer.clientHeight + 'px' } window.addEventListener('load', footer) window.addEventListener('resize', footer) html { /* Растягиваем документ на всю высоту окна */ height: 100% } body { position: relative margin: 0 color: #fff /* Растягиваем body по высоте html */ min-height: 100% } header { background: blue } main { /* Выставляем отступ с высотой footer по умолчанию */ padding-bottom: 30px background: red } footer { /* Позиционируем footer внизу main */ position: absolute bottom: 0 width: 100% /* Высота footer по умолчанию */ height: 30px background: black } header content footer
5. Решение через calc() для ФИКСИРОВАННОЙ высоты футера
html { /* Растягиваем документ на всю высоту окна */ height: 100% } body { position: relative margin: 0 color: #fff /* Растягиваем body по высоте html */ min-height: 100% } header { background: blue } main { /* Выставляем отступ с высотой footer и header */ min-height: calc(100vh - 30px - 18px) background: red } footer { /* Высота footer */ height: 30px background: black } header content footer
6. Решение через абсолютное позиционирование для ФИКСИРОВАННОЙ высоты футера
html { /* Растягиваем документ на всю высоту окна */ height: 100% } body { position: relative margin: 0 color: #fff /* Растягиваем body по высоте html */ min-height: 100% } header { background: blue } main { /* Выставляем отступ с высотой footer */ padding-bottom: 30px background: red } footer { /* Позиционируем footer внизу main */ position: absolute bottom: 0 width: 100% /* Высота footer */ height: 30px background: black } header content footer