Sticky footer Ryan Fait sangat bagus, namun menurut saya struktur dasarnya kurang *.
Versi Flexbox
Jika Anda cukup beruntung karena dapat menggunakan flexbox tanpa perlu mendukung browser lama, sticky footer menjadi sangat mudah, dan mendukung footer yang berukuran dinamis.
Trik untuk membuat footer menempel di bagian bawah dengan flexbox adalah dengan memiliki elemen lain dalam wadah yang sama secara vertikal. Yang dibutuhkan hanyalah elemen pembungkus full-height dengan display: flexdan setidaknya satu saudara kandung dengan flexnilai lebih besar dari 0:
CSS:
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
#main-wrapper {
display: flex;
flex-direction: column;
min-height: 100%;
}
article {
flex: 1;
}
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
#main-wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
min-height: 100%;
}
article {
-webkit-box-flex: 1;
-ms-flex: 1;
flex: 1;
}
header {
background-color: #F00;
}
nav {
background-color: #FF0;
}
article {
background-color: #0F0;
}
footer {
background-color: #00F;
}
<div id="main-wrapper">
<header>
here be header
</header>
<nav>
</nav>
<article>
here be content
</article>
<footer>
here be footer
</footer>
</div>
Jika Anda tidak dapat menggunakan flexbox, struktur dasar pilihan saya adalah:
<div class="page">
<div class="page__inner">
<header class="header">
<div class="header__inner">
</div>
</header>
<nav class="nav">
<div class="nav__inner">
</div>
</nav>
<main class="wrapper">
<div class="wrapper__inner">
<div class="content">
<div class="content__inner">
</div>
</div>
<div class="sidebar">
<div class="sidebar__inner">
</div>
</div>
</div>
</main>
<footer class="footer">
<div class="footer__inner">
</div>
</footer>
</div>
</div>
Yang tidak terlalu jauh dari:
<div id="main-wrapper">
<header>
</header>
<nav>
</nav>
<article>
</article>
<footer>
</footer>
</div>
Trik untuk membuat footer menempel adalah dengan membuat footer berlabuh ke bantalan bawah elemen yang memuatnya. Ini membutuhkan tinggi footer statis, tetapi saya telah menemukan bahwa footer biasanya memiliki tinggi statis.
HTML:
<div id="main-wrapper">
...
<footer>
</footer>
</div>
CSS:
#main-wrapper {
padding: 0 0 100px;
position: relative;
}
footer {
bottom: 0;
height: 100px;
left: 0;
position: absolute;
width: 100%;
}
#main-wrapper {
padding: 0 0 100px;
position: relative;
}
footer {
bottom: 0;
height: 100px;
left: 0;
position: absolute;
width: 100%;
}
header {
background-color: #F00;
}
nav {
background-color: #FF0;
}
article {
background-color: #0F0;
}
footer {
background-color: #00F;
}
<div id="main-wrapper">
<header>
here be header
</header>
<nav>
</nav>
<article>
here be content
</article>
<footer>
here be footer
</footer>
</div>
Dengan footer ditambatkan ke #main-wrapper, Anda sekarang harus #main-wrappersetidaknya setinggi halaman, kecuali anak-anaknya lebih panjang. Hal ini dilakukan dengan membuat #main-wrappermemiliki min-heightdari 100%. Anda juga harus ingat bahwa orang tuanya, htmldan bodyharus setinggi halaman juga.
CSS:
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
#main-wrapper {
min-height: 100%;
padding: 0 0 100px;
position: relative;
}
footer {
bottom: 0;
height: 100px;
left: 0;
position: absolute;
width: 100%;
}
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
#main-wrapper {
min-height: 100%;
padding: 0 0 100px;
position: relative;
}
footer {
bottom: 0;
height: 100px;
left: 0;
position: absolute;
width: 100%;
}
header {
background-color: #F00;
}
nav {
background-color: #FF0;
}
article {
background-color: #0F0;
}
footer {
background-color: #00F;
}
<div id="main-wrapper">
<header>
here be header
</header>
<nav>
</nav>
<article>
here be content
</article>
<footer>
here be footer
</footer>
</div>
Tentu saja, Anda harus mempertanyakan penilaian saya, karena kode ini memaksa footer jatuh dari bagian bawah halaman, bahkan ketika tidak ada konten. Trik terakhir adalah dengan mengubah model kotak yang digunakan #main-wrappersehingga min-heightdari 100%menyertakan file100px paddingnya.
CSS:
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
#main-wrapper {
box-sizing: border-box;
min-height: 100%;
padding: 0 0 100px;
position: relative;
}
footer {
bottom: 0;
height: 100px;
left: 0;
position: absolute;
width: 100%;
}
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
#main-wrapper {
box-sizing: border-box;
min-height: 100%;
padding: 0 0 100px;
position: relative;
}
footer {
bottom: 0;
height: 100px;
left: 0;
position: absolute;
width: 100%;
}
header {
background-color: #F00;
}
nav {
background-color: #FF0;
}
article {
background-color: #0F0;
}
footer {
background-color: #00F;
}
<div id="main-wrapper">
<header>
here be header
</header>
<nav>
</nav>
<article>
here be content
</article>
<footer>
here be footer
</footer>
</div>
Dan begitulah, footer lengket dengan struktur HTML asli Anda. Pastikan saja bahwa footer's heightsama dengan #main-wrapper' padding-bottom, dan Anda harus disetel.
* Alasan saya menemukan kesalahan dengan struktur Fait adalah karena ia menetapkan elemen .footerdan .headerpada tingkat hierarki yang berbeda sambil menambahkan .pushelemen yang tidak perlu .