То, что сказали другие, используя фиксированные позиции, будет работать.Другая альтернатива, если вы не хотите что-то выводить из потока, - это использовать flex.Просто оберните все, что не находится в нижней части контейнера.Затем присвойте классу тела что-то вроде
body{
width: 100%;
min-height: 100vh;
display: flex;
flex-direction: column;
}
.container{
flex-grow: 1;
}
footer{
flex-grow: 0;
}
Так что тело будет как минимум высотой области просмотра.Нижний колонтитул, однако, должен быть высоким, и контейнер, независимо от того, сколько в нем материала, по крайней мере заполнит оставшееся пространство, заставляя нижний колонтитул.Вот пример Codepen , если это поможет.