Lepka stopka Ryana Faita jest bardzo ładna, jednak brakuje jej podstawowej struktury *.
Wersja Flexbox
Jeśli masz szczęście, że możesz używać flexboksa bez konieczności obsługi starszych przeglądarek, lepkie stopki stają się trywialnie łatwe i obsługują stopki o dynamicznych rozmiarach.
Sztuczka polegająca na przyklejeniu stopek do dna za pomocą flexbox polega na tym, że inne elementy w tym samym pojemniku wyginają się w pionie. Wystarczy otoczyć element o pełnej wysokości z display: flex
co najmniej jednym elementem podrzędnym o flex
wartości większej niż 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>
Jeśli nie możesz użyć flexboksa, moja podstawowa struktura to:
<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>
Co wcale nie jest dalekie od:
<div id="main-wrapper">
<header>
</header>
<nav>
</nav>
<article>
</article>
<footer>
</footer>
</div>
Sztuczka polegająca na przyklejeniu stopki polega na zakotwiczeniu stopki w dolnej wyściółce elementu zawierającego ją. To wymaga , aby wysokość stopce jest statyczna, ale odkryłem, że stopki są zazwyczaj od wysokości statycznej.
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>
Po zakotwiczeniu stopki do #main-wrapper
strony musisz #main-wrapper
mieć co najmniej wysokość strony, chyba że jej elementy podrzędne są dłuższe. Odbywa się to poprzez #main-wrapper
mieć min-height
z 100%
. Musisz także pamiętać, że jego rodzice html
i również body
muszą być tak wysokie jak strona.
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>
Oczywiście powinieneś kwestionować mój osąd, ponieważ ten kod wymusza wypadnięcie stopki z dołu strony, nawet jeśli nie ma treści. Ostatnią sztuczką jest zmiana modelu pudełka używanego przez the, #main-wrapper
tak aby min-height
of 100%
zawierał 100px
wypełnienie.
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>
I masz to, lepką stopkę z oryginalną strukturą HTML. Po prostu upewnij się, że wartość footer
's height
jest równa #main-wrapper
' s padding-bottom
i powinieneś być ustawiony.
* Powodem, dla którego uważam, że struktura Fait jest błędna, jest to, że ustawia ona elementy .footer
i .header
na różnych poziomach hierarchii, jednocześnie dodając niepotrzebny .push
element.