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: flex
dan setidaknya satu saudara kandung dengan flex
nilai 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-wrapper
setidaknya setinggi halaman, kecuali anak-anaknya lebih panjang. Hal ini dilakukan dengan membuat #main-wrapper
memiliki min-height
dari 100%
. Anda juga harus ingat bahwa orang tuanya, html
dan body
harus 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-wrapper
sehingga min-height
dari 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 height
sama dengan #main-wrapper
' padding-bottom
, dan Anda harus disetel.
* Alasan saya menemukan kesalahan dengan struktur Fait adalah karena ia menetapkan elemen .footer
dan .header
pada tingkat hierarki yang berbeda sambil menambahkan .push
elemen yang tidak perlu .