Sticky Footer, Five Ways

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Der Zweck eines "Sticky Footers" ist, dass er am unteren Rand des Browserfensters "klebt". Aber nicht immer, wenn genügend Inhalt auf der Seite vorhanden ist, um den Footer nach unten zu schieben, tut er das immer noch. Aber wenn der Inhalt auf der Seite kurz ist, hängt ein Sticky Footer immer noch am unteren Rand des Browserfensters.

Beachten Sie, dass "sticky" hier genau wie oben beschrieben ist. Es darf nicht mit position: fixed; verwechselt werden, das verwendet werden kann, um ein Element an Ort und Stelle zu "kleben", auch wenn die Seite scrollt. Oder, noch verwirrender, es ist auch nicht position: sticky;, das wie eine feste Positionierung innerhalb von Containern ist.

Es gibt negative untere Ränder an Wrappern

Es gab ein umgebendes Element, das alles außer dem Footer enthielt. Es hatte einen negativen Rand, der der Höhe des Footers entsprach. Das war die Grundlage für dieses hier.

<body>
  <div class="wrapper">

      content

    <div class="push"></div>
  </div>
  <footer class="footer"></footer>
</body>
html, body {
  height: 100%;
  margin: 0;
}
.wrapper {
  min-height: 100%;

  /* Equal to height of footer */
  /* But also accounting for potential margin-bottom of last child */
  margin-bottom: -50px;
}
.footer,
.push {
  height: 50px;
}

Siehe den Pen Sticky Footer mit calc(); von Chris Coyier (@chriscoyier) auf CodePen.

Diese Methode erforderte ein zusätzliches Element im Inhaltsbereich (das ".push"), um sicherzustellen, dass der negative Rand den Footer nicht nach oben zog und Inhalt überlagerte. Der Push war auch clever, weil er wahrscheinlich keinen eigenen unteren Rand hatte. Hätte er einen, hätte dieser in die negativen Ränder einbezogen werden müssen, und wenn diese beiden Zahlen nicht übereinstimmen, sieht es nicht ganz so gut aus.

Es gibt negative obere Ränder an Footern

Diese Technik erforderte kein zusätzliches Element, sondern ein zusätzliches umgebendes Element um den Inhalt, um eine passende untere Polsterung anzuwenden. Wiederum, um zu verhindern, dass der negative Rand den Footer über den Inhalt hebt.

<body>
  <div class="content">
    <div class="content-inside">
      content
    </div>
  </div>
  <footer class="footer"></footer>
</body>
html, body {
  height: 100%;
  margin: 0;
}
.content {
  min-height: 100%;
}
.content-inside {
  padding: 20px;
  padding-bottom: 50px;
}
.footer {
  height: 50px;
  margin-top: -50px;
}

Siehe den Pen Sticky Footer mit negativen Rändern 2 von Chris Coyier (@chriscoyier) auf CodePen.

Ein Wash zwischen dieser und der vorherigen Technik, da beide zusätzliche, ansonsten unnötige HTML-Elemente erfordern.

Es gibt calc() reduzierte Höhen-Wrapper

Eine Möglichkeit, keine zusätzlichen Elemente zu benötigen, ist die Anpassung der Wrapper-Höhe mit calc(). Dann gibt es keine Überlappung, nur zwei Elemente, die übereinander gestapelt sind und insgesamt 100 % Höhe ergeben.

<body>
  <div class="content">
    content
  </div>
  <footer class="footer"></footer>
</body>
.content {
  min-height: calc(100vh - 70px);
}
.footer {
  height: 50px;
}

Siehe den Pen Sticky Footer mit calc(); von Chris Coyier (@chriscoyier) auf CodePen.

Beachten Sie die 70px in calc() im Vergleich zur festen Höhe von 50px des Footers. Das ist eine Annahme. Eine Annahme, dass das letzte Element im Inhalt einen unteren Rand von 20px hat. Es ist dieser untere Rand plus die Höhe des Footers, die zusammen addiert werden müssen, um von der Viewport-Höhe abgezogen zu werden. Und ja, wir verwenden Viewport-Einheiten hier als einen weiteren kleinen Trick, um zu vermeiden, dass wir zuerst eine 100%ige Körperhöhe festlegen müssen, bevor wir eine 100%ige Wrapper-Höhe festlegen können.

Es gibt Flexbox

Das große Problem bei den oben genannten drei Techniken ist, dass sie feste Footer-Höhen erfordern. Feste Höhen sind im Webdesign generell ein Nachteil. Inhalte können sich ändern. Dinge sind flexibel. Feste Höhen sind normalerweise ein Warnsignal. Die Verwendung von Flexbox für einen Sticky Footer erfordert nicht nur keine zusätzlichen Elemente, sondern erlaubt auch einen variablen Footer.

<body>
  <div class="content">
    content
  </div>
  <footer class="footer"></footer>
</body>
html, body {
  height: 100%;
}
body {
  display: flex;
  flex-direction: column;
}
.content {
  flex: 1 0 auto;
}
.footer {
  flex-shrink: 0;
}

Siehe den Pen Sticky Footer mit Flexbox von Chris Coyier (@chriscoyier) auf CodePen.

Sie könnten sogar einen Header darüber oder mehr darunter hinzufügen. Der Trick bei Flexbox ist entweder

  • flex: 1 auf dem Kindelement, das wachsen soll, um den Platz auszufüllen (der Inhalt in unserem Fall).
  • oder margin-top: auto, um das Kindelement so weit wie möglich vom Nachbarn wegzuschieben (oder in welche Richtung auch immer der Rand benötigt wird).

Denken Sie daran, wir haben eine vollständige Anleitung für all diese Flexbox-Sachen.

Es gibt Grid

Grid Layout ist noch neuer (und weniger verbreitet) als Flexbox. Wir haben eine vollständige Anleitung dafür. Man kann es auch ziemlich einfach für einen Sticky Footer verwenden.

<body>
  <div class="content">
    content
  </div>
  <footer class="footer"></footer>
</body>
html {
  height: 100%;
}
body {
  min-height: 100%;
  display: grid;
  grid-template-rows: 1fr auto;
}
.footer {
  grid-row-start: 2;
  grid-row-end: 3;
}

Diese Demo sollte in Chrome Canary oder Firefox Developer Edition funktionieren und kann wahrscheinlich auf ältere Versionen von Grid Layout für Edge zurückportiert werden.

Siehe den Pen Sticky Footer mit Grid von Chris Coyier (@chriscoyier) auf CodePen.