675 Stimmen

CSS, damit die Fußzeile der HTML-Seite mit einer Mindesthöhe am unteren Rand der Seite bleibt, aber die Seite nicht überlappt

Ich habe die folgende Seite (deadlink: http://www.workingstorage.com/Sample.htm ), die eine Fußzeile hat, die ich nicht am unteren Rand der Seite platzieren kann.

Ich möchte, dass die Fußzeile

  • am unteren Rand des Fensters bleiben, wenn die Seite kurz ist und der Bildschirm nicht ausgefüllt wird, und
  • am Ende des Dokuments verbleiben und sich wie gewohnt nach unten bewegen, wenn mehr als eine Bildschirmmaske Inhalt vorhanden ist (anstatt den Inhalt zu überlappen).

Das CSS ist vererbt und verwirrt mich. Ich kann es anscheinend nicht richtig ändern, um eine Mindesthöhe für den Inhalt festzulegen oder die Fußzeile nach unten zu verschieben.

54 Stimmen

Es ist erstaunlich, dass dies ein so häufiges Problem ist. Vielleicht werden wir in CSS4 Implementierungen von "make a nav bar" und "make a footer" sehen, da diese so häufig versucht werden.

1 Stimmen

Es wird nie CSS4 geben (CSS3 wird nur wachsen). Ich denke, dies wird mit der Implementierung von flexbox .

6 Stimmen

Ein ausgezeichneter Artikel zu diesem Thema: css-tricks.com/couple-takes-sticky-footer

582voto

vsync Punkte 101339

Nachfolgend sind 4 verschiedene Methoden von mir aufgeführt:

In jedem Beispiel sind die Texte frei editierbar, um zu veranschaulichen, wie der Inhalt in verschiedenen Szenarien wiedergegeben würde.


1) Flexbox

body{ height:100vh; margin:0; }

header{ min-height:50px; background:lightcyan; }
footer{ min-height:50px; background:PapayaWhip; }

/* Trick */
body{ 
  display:flex; 
  flex-direction:column; 
}

footer{
  margin-top:auto; 
}

<body>
  <header contentEditable>Header</header>
  <article contentEditable>Content</article>
  <footer contentEditable>Footer</footer>
</body>

2) Raster

body{ 
  min-height: 100vh; 
  margin: 0; 

  display: grid;
  grid-template-rows: auto 1fr auto;
}

header{ 
  min-height:50px;
  background:lightcyan; 
}

footer{ 
  min-height:50px; 
  background:PapayaWhip; 
}

<body>
  <header contentEditable>Header</header>
  <article contentEditable>Content</article>
  <footer contentEditable>Footer</footer>
</body>

Bei der folgenden Methode wird ein "Trick" angewendet, indem ein ::after Pseudo-Element auf der body und legen Sie fest, dass er die genau Höhe der Fußzeile, so dass sie genau den gleichen Platz wie die Fußzeile einnimmt, wenn die Fußzeile also absolute darüber positioniert ist, würde es so aussehen, als würde die Fußzeile wirklich Platz einnehmen und die negativen Auswirkungen ihrer absoluten Positionierung beseitigen (z. B. über den Inhalt des Körpers gehen)

3) position:absolute (nein dynamisch Höhe der Fußzeile)

body{ min-height:100vh; margin:0; position:relative; }
header{ min-height:50px; background:lightcyan; }
footer{ background:PapayaWhip; }

/* Trick: */
body {
  position: relative;
}

body::after {
  content: '';
  display: block;
  height: 50px; /* Set same as footer's height */
}

footer {
  position: absolute;
  bottom: 0;
  width: 100%;
  height: 50px;
}

<body>
  <header contentEditable>Header</header>
  <article contentEditable>Content</article>
  <footer contentEditable>Footer</footer>
</body>

4) Tabellen-Layout

html{ height:100%; }
body { min-height:100%;  margin:0; }

header {
  height: 50px;
  background: lightcyan;
}

article { 
  height: 1%;
}

footer {
  height: 50px;
  background: PapayaWhip;
}

/**** Trick: ****/

body {
  display: table;
  width: 100%; 
}

body > footer {
   display: table-row;
}

<body>
  <header contentEditable>Header</header>
  <article contentEditable>Content</article>
  <footer contentEditable>Footer</footer>
</body>

0 Stimmen

Es ist einfach und elegant und - was noch wichtiger ist - es funktioniert. Andere Lösungen versagen, wenn man anfängt, Divs mit display: table display: table-row display:table-cell . Ich habe jedoch festgestellt, dass ich Folgendes hinzufügen muss body {margin-top: 0; padding-top: 0; margin-bottom: 0; padding-bottom: 0;} um eine Bildlaufleiste zu vermeiden. Sie könnten dafür sorgen, indem Sie die body:after height aber ich gebe meine Werte in rem und nicht in px an, so dass es problematisch wird.

24 Stimmen

@SteveWaring - Vielen Dank. Ich habe diese Antwort aktualisiert, da sie ziemlich alt war. Jetzt bin ich für die Verwendung von flexbox

1 Stimmen

Das CSS unter "basic common markup" hatte einen kleinen Fehler, der dazu führte, dass es nicht funktionierte (der Fehler war in der verlinkten "DEMO" nicht vorhanden, was in Ordnung ist). Ich habe mir die Freiheit genommen, ihn zu beheben.

379voto

Jon Winstanley Punkte 22342

Eine einfache Methode besteht darin, den Körper zu 100% Ihrer Seite, mit einer min-height de 100% auch. Dies funktioniert gut, wenn sich die Höhe der Fußzeile nicht ändert.

Geben Sie der Fußzeile einen negativen Rand nach oben:

footer {
    clear: both;
    position: relative;
    height: 200px;
    margin-top: -200px;
}

69 Stimmen

Dies funktioniert nur, wenn Sie die Höhe Ihrer Fußzeile im Voraus kennen. Manchmal haben Fußzeilen dynamischen Inhalt, oder Sie bauen ein Framework. Irgendwelche Ideen für Fußzeilen mit variabler Höhe?

0 Stimmen

@Costa überprüfen Sie meine Antwort aquí für eine Lösung, die mit höhenverstellbaren Fußzeilen funktioniert.

0 Stimmen

Für dynamische Inhalte lassen Sie einfach die "Höhe" weg und die Fußzeile passt sich dem Inhalt an. Nicht in allen Browsern getestet

95voto

m.spyratos Punkte 3322

Eine sehr einfache Flex-Lösung, die nicht von festen Höhen oder wechselnden Positionen der Elemente ausgeht.

HTML

<div class="container">
  <header></header>
  <main></main>
  <footer></footer>
</div>

CSS

.container {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}

main {
  flex: 1;
}

Browser-Unterstützung

Alle gängigen Browser, außer IE11 und darunter.

Achten Sie darauf, dass Sie Autoprefixer für geeignete Präfixe.

.container {
  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: 100vh;
}

main {
  -webkit-box-flex: 1;
  -ms-flex: 1;
  flex: 1;
}

/////////////////////////////////////////////

body,
html {
    margin: 0;
    padding: 0;
}

header,
main,
footer {
  margin: 0;
  display: block;
}

header,
footer {
  min-height: 80px; 
}

header {
  background-color: #ccc;
}

main {
  background-color: #f4f4f4;
}

footer {
  background-color: orange;
}

<div class="container">
  <header></header>
  <main></main>
  <footer></footer>
</div>

7 Stimmen

Funktionierte wie ein Charme! auch für res mehr als 4k Fußzeile klebt am Boden

2 Stimmen

Wichtigste Browser IE11

1 Stimmen

Es hat geklappt! Können Sie bitte erklären, wie es funktioniert?

76voto

Tamás Pap Punkte 16940

Ein sehr einfacher Ansatz, der browserübergreifend gut funktioniert, ist der folgende:

http://matthewjamestaylor.com/blog/keeping-footers-at-the-bottom-of-the-page

html,
body {
   margin:0;
   padding:0;
   height:100%;
}
#container {
   min-height:100%;
   position:relative;
}
#header {
   background:#ff0;
   padding:10px;
}
#body {
   padding:10px;
   padding-bottom:60px;   /* Height of the footer */
}
#footer {
   position:absolute;
   bottom:0;
   width:100%;
   height:60px;   /* Height of the footer */
   background:#6cf;
}

<div id="container">
   <div id="header">header</div>
   <div id="body">body</div>
   <div id="footer">footer</div>
</div>

2 Stimmen

Dieser Ansatz funktioniert nicht mit Firefox auf Android, wenn Sie die Größe des Fensters mit zwei Fingern ändern

0 Stimmen

Ja, mir gefällt dieser Ansatz nicht. Er ist nicht sehr reaktionsschnell, denn wenn Sie ein Gerät mit einer geringeren Höhe haben (z. B. ein mobiles Gerät) und der Inhalt natürlich über die Höhe des Betrachters hinausgeht, wird die Fußzeile aufgrund ihrer absoluten Positionierung Ihren Inhalt überlagern. Ich denke, der Flexbox-Ansatz ist besser.

64voto

Natalia Larrieux Punkte 657

Ich habe dies verwendet, um meine Fußzeile am unteren Rand anzubringen, und es hat funktioniert:

HTML

<body>
    <div class="allButFooter">
        <!-- Your page's content goes here, including header, nav, aside, everything -->
    </div>
    <footer>
        <!-- Footer content -->
    </footer>
</body>

Das ist die einzige Änderung, die Sie im HTML-Code vornehmen müssen. div mit dem "allButFooter" Klasse. Ich habe das mit allen Seiten gemacht, mit denen, die so kurz waren, dass ich wusste, dass die Fußzeile nicht unten bleiben würde, und auch mit Seiten, die so lang waren, dass ich bereits wusste, dass ich scrollen musste. Ich habe dies getan, um zu sehen, dass es auch dann funktioniert, wenn der Inhalt einer Seite dynamisch ist.

CSS

.allButFooter {
    min-height: calc(100vh - 40px);
}

Le site "allButFooter" Klasse hat eine min-height Wert, der von der Höhe des Ansichtsfensters abhängt ( 100vh bedeutet 100% der Höhe des Ansichtsfensters) und die Höhe der Fußzeile, von der ich bereits wusste, dass sie 40px .

Das ist alles, was ich getan habe, und es hat bei mir perfekt funktioniert. Ich habe es nicht in allen Browsern ausprobiert, nur in Firefox, Chrome und Edge, und die Ergebnisse waren so, wie ich wollte. Die Fußzeile klebt am unteren Rand, und Sie müssen nicht mit z-index, Position oder anderen Eigenschaften durcheinander bringen. Die Position jedes Elements in meinem Dokument war die Standardposition, ich habe sie nicht auf absolut oder fixiert oder so geändert.

Arbeiten mit responsivem Design

Hier ist etwas, das ich gerne ausräumen würde. Diese Lösung, mit der gleichen Fußzeile, die 40px hoch war, funktionierte nicht wie erwartet, wenn ich in einem responsiven Design mit Twitter-Bootstrap . Ich musste den Wert, den ich in der Funktion subtrahierte, ändern:

.allButFooter {
    min-height: calc(100vh - 95px); 
}

Dies ist wahrscheinlich darauf zurückzuführen, dass Twitter-Bootstrap verfügt über eigene Ränder und Abstände, deshalb musste ich diesen Wert anpassen.

0 Stimmen

Ich habe mit allen möglichen Lösungen für dieses Problem Probleme bekommen. Diese Lösung funktioniert mit meiner Seite, die variiert, was im Körper angezeigt wird mit display: none Danke. Es ist auch schön und einfach.

0 Stimmen

Nach vielen Stunden des Ausprobierens von Lösungen funktionierten nur zwei. nl. position: fixed; bottom: 0 und diese. Diese Lösung ist die beste, weil die Fußzeile nicht am unteren Rand klebt, sondern am Ende der scrollbaren Seite bleibt.

0 Stimmen

Um auf Ihrer Antwort aufzubauen, können Sie das Problem auf andere Weise angehen, indem Sie die .footer {max-height: calc(100vh+40px); position: absolute} . Wie es auch funktioniert, sollten Sie einfach Ihre Körpergröße kennen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X