Stopka na dole strony lub treści, w zależności od tego, która z tych wartości jest niższa

94

Mam następującą strukturę:

<body>
    <div id="main-wrapper">
        <header>
        </header>
        <nav>
        </nav>
        <article>
        </article>
        <footer>
        </footer>
    </div>
</body>

Treść ładuję dynamicznie za <article>pomocą javascript. Z tego powodu wysokość <article>bloku może się zmieniać.

Chcę, aby <footer>blok znajdował się u dołu strony, gdy jest dużo treści, lub u dołu okna przeglądarki, gdy istnieje tylko kilka wierszy treści.

W tej chwili mogę zrobić jedno lub drugie ... ale nie oba.

Więc czy ktoś wie, jak mogę to zrobić - spraw, <footer>aby przykleił się do dołu strony / treści lub do dołu ekranu, w zależności od tego, który jest niższy.

Będzie
źródło
Czy ludzie chcieliby skomentować, dlaczego głosowali w dół na pytanie sprzed 2 lat?
Będzie
Daj spokój, minęło już prawie 6 lat ...
Will

Odpowiedzi:

101

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: flexco najmniej jednym elementem podrzędnym o flexwartoś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;
}


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%;
}

Po zakotwiczeniu stopki do #main-wrapperstrony musisz #main-wrappermieć co najmniej wysokość strony, chyba że jej elementy podrzędne są dłuższe. Odbywa się to poprzez #main-wrappermieć min-heightz 100%. Musisz także pamiętać, że jego rodzice htmli również bodymuszą 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%;
}

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-wrappertak aby min-heightof 100%zawierał 100pxwypeł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%;
}

I masz to, lepką stopkę z oryginalną strukturą HTML. Po prostu upewnij się, że wartość footer's heightjest równa #main-wrapper' s padding-bottomi powinieneś być ustawiony.


* Powodem, dla którego uważam, że struktura Fait jest błędna, jest to, że ustawia ona elementy .footeri .headerna różnych poziomach hierarchii, jednocześnie dodając niepotrzebny .pushelement.

zzzzBov
źródło
Musiałem dodać #main-wrapper *:first-child { margin-top: 0; }, w przeciwnym razie strona byłaby zbyt długa przy górnym marginesie pierwszego dziecka (powodując niepotrzebny pasek przewijania na krótkich stronach).
Florian Brucker
Dziękuję @zzzzBov za to dokładne wyjaśnienie, a zwłaszcza za wspomnienie o flex-direction (szkoda, że ​​nie znalazłem tego wcześniej - zaoszczędziłoby mi to kilka godzin! :)
ea0723
Wersja Flexbox nie działa dla mnie w IE11, ale inne podejście jest dla mnie dobre! Dzięki i +1!
Matt
@Matt, musisz użyć prefiksów przeglądarki, aby flexbox działał w IE11. użyj narzędzia takiego jak autoprefixer i nigdy nie będziesz musiał martwić się o ich ręczne dodawanie.
zzzzBov
2
Wydaje się, że łącze przyklejonej stopki jest uszkodzone, ponieważ jego witryna została przekształcona w powiadomienie In Memoriam dla niego. Ponadto nie ma wersji z pamięci podręcznej ze względu na ustawienia
pliku
13

Lepka stopka Ryana Faita to proste rozwiązanie, z którego korzystałem kilka razy w przeszłości.

Podstawowy HTML :

<div class="wrapper">
    <div class="header">
        <h1>CSS Sticky Footer</h1>
    </div>
    <div class="content"></div>
    <div class="push"></div>
</div>
<div class="footer"></div>

CSS :

* {
    margin: 0;
}
html, body {
    height: 100%;
}
.wrapper {
    min-height: 100%;
    height: auto !important;
    height: 100%;
    margin: 0 auto -142px; /* the bottom margin is the negative value of the footer's height */
}
.footer, .push {
    height: 142px; /* .push must be the same height as .footer */
}

/*

Sticky Footer by Ryan Fait
http://ryanfait.com/

*/

Tłumaczenie tego, by było podobne do tego, co już masz, skutkuje następującymi słowami:

HTML :

<body>
    <div class="wrapper">
        <header>
        </header>
        <nav>
        </nav>
        <article>
        </article>
        <div class="push"></div>
    </div>
    <footer>
    </footer>
</body>

CSS:

* {
    margin: 0;
}
html, body {
    height: 100%;
}
.wrapper {
    min-height: 100%;
    height: auto !important;
    height: 100%;
    margin: 0 auto -142px; /* the bottom margin is the negative value of the footer's height */
}
footer, .push {
    height: 142px; /* .push must be the same height as .footer */
}

Po prostu nie zapomnij zaktualizować wartości ujemnej na marginesie opakowania, aby pasowała do wysokości stopki, i naciśnij element div. Powodzenia!

Josh Mein
źródło
4
Uwielbiam sposób, w jaki umieścił komentarz na dole, odpowiedni dla rozwiązania w stopce: D
Madara's Ghost
Nie ma potrzeby zmieniania znaczników dla tego konkretnego stylu.
zzzzBov
@zzzzBov Nie mam teraz zbyt wiele czasu, aby dokładniej się temu przyjrzeć, ale co dokładnie masz na myśli?
Josh Mein
Jestem w swoim mobilnym bankomacie, więc nie mogę napisać pełnej odpowiedzi, w przeciwnym razie już bym to zrobił. Komentarz był bardziej, więc pamiętam, aby dodać odpowiedź później.
zzzzBov
@JoshMein, dodałem odpowiedź, która wyjaśnia, jak sprawić, by stopka była przyczepiona bez naruszania dostarczonej struktury.
zzzzBov
0

Chciałem rozwiązać ten problem bez dodawania żadnych dodatkowych znaczników, więc ostatecznie skorzystałem z następującego rozwiązania:

article {
  min-height: calc(100vh - 150px); /* deduct the height or margins of any other elements within wrapping container*/
}

footer {
  height: 50px;
}

header {
   height: 50px;
}

nav {
  height: 50px;
}
<body>
  <div id="main-wrapper">
    <header>
    </header>
    <nav>
    </nav>
    <article>
    </article>
    <footer>
    </footer>
  </div>
</body>

Musisz znać wysokość nagłówka, nawigacji i stopki, aby móc ustawić minimalną wysokość artykułu. Dzięki temu, jeśli artykuł ma tylko kilka wierszy treści, stopka będzie przyklejona do dołu okna przeglądarki, w przeciwnym razie znajdzie się pod całą treścią.

Możesz znaleźć to i inne rozwiązania zamieszczone powyżej tutaj: https://css-tricks.com/couple-takes-sticky-footer/

Galina E.
źródło