Im Allgemeinen ist die CSS Sticky Footer der beste Weg, da sie perfekt und ohne JavaScript funktioniert. Wenn die erforderliche Markup-Struktur einfach nicht möglich ist, kann dieses jQuery-JavaScript eine Option sein.
HTML
Stellen Sie einfach sicher, dass #footer das letzte sichtbare Element auf Ihrer Seite ist.
<div id="footer">
Sticky Footer
</div>
CSS
Eine feste Höhe zu geben ist am narrensichersten.
#footer { height: 100px; }
jQuery
Beim Laden des Fensters sowie beim Scrollen oder Ändern der Größe wird getestet, ob der Inhalt der Seiten kürzer ist als die Höhe des Fensters. Wenn ja, bedeutet dies, dass sich unter dem Inhalt bis zum Ende des Fensters ein Leerraum befindet, sodass der Footer am unteren Fensterrand positioniert werden sollte. Wenn nicht, kann der Footer seine normale statische Position beibehalten.
// Window load event used just in case window height is dependant upon images
$(window).bind("load", function() {
var footerHeight = 0,
footerTop = 0,
$footer = $("#footer");
positionFooter();
function positionFooter() {
footerHeight = $footer.height();
footerTop = ($(window).scrollTop()+$(window).height()-footerHeight)+"px";
if ( ($(document.body).height()+footerHeight) < $(window).height()) {
$footer.css({
position: "absolute"
}).animate({
top: footerTop
})
} else {
$footer.css({
position: "static"
})
}
}
$(window)
.scroll(positionFooter)
.resize(positionFooter)
});
Scheint ein paar Macken zu haben... Es scheint Animationen in die Warteschlange zu stellen, wenn man die Fenstergröße immer wieder vergrößert und verkleinert?
Sie könnten entweder einfach ein .stop(); vor der Animation hinzufügen. Oder Sie verwenden .animate() gar nicht, sondern setzen den Top-Wert einfach mit der .css Funktion. Das ist auf diese Weise etwas ruckelig.
Ich benutze Ihre Demodateien, die bereits stop() enthalten, und die Animation findet trotzdem statt.
Wie kann ich sie überhaupt stoppen und den Footer einfach am unteren Rand der Seite bleiben lassen?
$footer.css({
position: “absolute”
}).stop().animate({
top: footerTop
})
} else {
$footer.css({
position: “static”
})
}
Entschuldigung, aber es ist nicht sehr glatt... was ist mit
{ position: fixed; bottom: 0; width: 100%; }
Das widerspricht komplett dem Sinn der Sache. Dies STÖPPT vor dem unteren Rand des Inhalts, damit er keinen Inhalt überlappt. Wenn man ihn am unteren Rand fixiert, liegt er problemlos über dem Inhalt.
Das widerspricht komplett dem Sinn der Sache. Dies STÖPPT vor dem unteren Rand des Inhalts, damit er keinen Inhalt überlappt. Wenn man ihn am unteren Rand fixiert, liegt er problemlos über dem Inhalt.
Rettet mir einen Tag, danke, Bro.
Mac 10.5.8, Safari 4.0.3... das ist unglaublich fehlerhaft. Das Ändern der Fenstergröße verschiebt den Footer (gut), aber er sitzt nicht bündig mit dem unteren Fensterrand, sondern lässt einen großen weißen Rand durchscheinen. Igitt.
Scheint bei mir mit denselben genauen Spezifikationen problemlos zu laufen. Ich habe nur .stop() vor animate hinzugefügt, was vielleicht hilft. Ich denke, Safari hat einfach eine Menge Resize-Events ausgelöst und Ihr Computer hatte wahrscheinlich Schwierigkeiten, Schritt zu halten.
Scheint bei mir problemlos zu funktionieren.
OS X 10.6.2 mit Chrome 4.0.2, Safari 4.0.4 und FF 3.5.5; macht weiter so.
Es wurde ein wenig ruckelig, aber es scheint mehr mein Computer als der Code selbst zu sein.
Warum so unhöflich? "Igitt" ist ein so hässliches Wort. Warum nicht stattdessen "Danke" sagen? Ich meine, Sie könnten nicht einmal selbst einen JavaScript-Code erstellen.
P.S. an Herrn Chris
Entschuldigung für die Beschwerde. Bin nur wirklich sauer.
Funktioniert bei mir auf Safari, FF und Chrome unter Snow Leopard großartig und sieht gut aus.
Chris, du machst gute Arbeit. Mach weiter so!
Sie könnten das gleiche Ergebnis komplett mit CSS erzielen, indem Sie 100% Höhen richtig zusammen mit absoluter Positionierung verwenden... Die daraus resultierende CSS wäre beim Ändern der Fenstergröße tatsächlich "flüssiger" und hätte somit nicht den fehlerhaften Effekt, dass der Footer nach dem Ändern der Fenstergröße herumspringt. Wichtig ist, darauf zu achten, dass der Footer Ihren Inhalt NICHT überlappt, sondern einen Scroll erzwingt, wenn er das untere Ende dieses Containers erreicht (was diese Demo erfolgreich tut).... Beispiel für eine reine CSS-Version: http://oribe.com/
Hallo, das ist cool... wie hast du das gemacht? Gib mir bitte den Code dafür... danke
Ich bleibe normalerweise bei CSS, wenn ich eine "Sticky Footer" erstelle, aber das ist ein cooles Beispiel, danke!
Cooles Beispiel. Ich verwende gerne diese reine CSS-Sticky Footer. Ziemlich ähnlich zu Ihrem Beispiel, aber mit einem leeren Push-Div.
Buenisimo Chris!
Era justo lo que estaba buscando.
Mil gracias desde Argentina.
Mauricio
Großartig, Chris!
Es ist genau das, was ich gesucht habe.
Vielen Dank aus Argentinien.
Mauricio
Diese Methode hat einige Fehler bei der Verwendung von Zoom, aber sie ist gut, wenn man zu faul ist, einen CSS-Trick anzuwenden.
Und der Vorteil dieser Methode ist, dass sie auf Footer ohne definierte Höhe funktioniert (einige Websites haben lange Listen im Footer und man kann keine Höhe dafür verwenden).
Beachten Sie, dass Sie width:100% für den Footer verwenden müssen, da position:absolute die Breite auf den Inhalt reduziert. Und Sie müssen möglicherweise auch einen Footer-Wrapper verwenden, wenn Sie ihn zentrieren möchten.
Ich liebe es, Footer haben mir schon immer Probleme bereitet
Es ist nett, danke.
Fantastisch, danke, es ist sehr schön
Das ist exzellent, vielen Dank. Gibt es eine Möglichkeit, dass es beim Laden des Skripts vom unteren Rand aus startet und nicht von oben heruntergleitet?
Danke, ich mag den Trick, er funktioniert wirklich
Danke für das Teilen.
Das wird mir bei meinem Projekt helfen.
Wenn Sie keine weichgespülte Animation wünschen, fügen Sie ", -1" hinzu, so:
VORHER
.animate({
top: footerTop
})
NACHHER
.animate({
top: footerTop
},-1)
Und presto.
Danke, dieses -1 funktioniert wirklich gut.
ME GUSTA!!!! DANKE!!
Du hast mir das Leben gerettet! :D danke!
Brillant! Was für ein Lebensretter!
Luco hatte die beste Lösung für die Animation... Chapeau!!
(ersetzen Sie das aktuelle '1000' durch '-1' das ist). Andere Lösungen hier haben bei mir gar nicht funktioniert (blieben oben kleben... oder blieben unten kleben und überlappten alles, was bereits da war).
Diese Demo funktioniert gut auf Mac OS X Lion mit Safari, Firefox und Chrome.
Aber ich habe folgende Frage:
Ich möchte ein Bild im Footer anzeigen und dieses Bild muss in der Mitte dieses Footers zentriert sein.
Ich sehe das Bild immer noch links auf der Seite...
Kann mir jemand sagen, wie das gemacht werden kann?
Oh, was für eine schöne Lösung!
Danke für den Tipp!
+1
Das Hinzufügen einer -10px margin-top zum Footer hat die meisten meiner Probleme behoben. Auch die Festlegung einer absoluten Breite für den Footer. Es braucht etwas Tüfteln, funktioniert aber großartig. Danke nochmals, Chris!
Wow, ich liebe das neue Theme auf Ihrer Website. Wünschte, ich könnte es kopieren, lol, aber natürlich würde ich das nicht tun, das wäre sehr unprofessionell. Ich warte immer noch darauf, dass mein Geistesblitz eintritt. Leider bin ich mit Grafikdesign einfach nicht so talentiert :(
Hallo... Vielleicht habe ich den Artikel nicht verstanden, aber ich frage mich, ob Sie mir helfen könnten, meine Seite in Safari zum Laufen zu bringen. Ich habe {clear:both;} zu meinem CSS hinzugefügt, um sicherzustellen, dass der Footer in Firefox nicht überlappt, aber Safari ist ein komplettes Durcheinander und ich weiß nicht, wie ich das korrigieren soll. Ein Beispiel für den Inhalt, der den Footer überlappt, finden Sie hier: (verwenden Sie Safari)
http://www.lifeafterhealth.net/recovery/healthy-things-to-do-each-day/
Ich versuche wohl, den Footer zu "entheften"... Irgendwelche Ideen? :(
Danke für den Beitrag. Sehr nützlicher Artikel! Ich werde etwas an meiner Seite ändern.
queue: false könnte auch den Trick tun :)
Funktioniert nicht in Firefox 3.6.17 unter Windows XP (selbst die Demoseite auf Ihrer Website nicht). Auch in IE7 rutscht das Fenster langsam nach unten, springt dann zurück und rutscht wieder nach unten.
Nur eine Information für alle, die sich über die Unterstützung alter Browser für diesen Code wundern. Keine Beschwerde, tatsächlich halte ich es für ein großartiges Stück Code und werde es wahrscheinlich trotzdem verwenden, da diese jetzt ziemlich alt sind.
Ok, hier ist eine kleine Modifikation am obigen Code. Dies verhindert, dass er in die statische Position schnappt, falls das etwas ist, wonach Sie gesucht haben.
Hallo, Können Sie bitte dynamisch feste Positionierung verwenden? Sie haben eine gute Anhängerschaft, aber Sie tun sich selbst einen Nachteil, indem Sie diese alte Animationstechnik verwenden. Sie lenkt von der Website ab, wenn sie sich beim Ändern der Größe animiert. Versuchen Sie, mit fester Positionierung ein wenig zu experimentieren und das in Ihrem JS zu tun, anstatt absolute Positionierung zu verwenden. Sie ruckelt nicht. Keine Animationen nötig. Probieren Sie es einfach aus, bevor Sie es verreißen.
Sie können einige Beispiele hier sehen -> PolaraGolf.com auf der Checkout-Seite oder Klim.com auf allen seitlichen schwebenden Angeboten, die ich gemacht habe.
Bitte lassen Sie mich wissen, wenn Sie fertig sind, und ich werde Ihr Plugin verwenden. Danke.
Übersehe ich etwas? Dieser Code scheint komplizierter zu sein, als er sein muss. Ich habe eine Sticky Footer mit sehr wenigen Codezeilen erstellt. Scheint perfekt zu funktionieren.
// Wenn das Dokument bereit ist...
$(document).ready(function() {
// Kurze Variablen einführen
$box = $('#footer');
// Methode beim Laden der Seite aufrufen
sticky($box);
// Funktion jedes Mal aufrufen, wenn das Fenster neu dimensioniert wird
$(window).resize(function() {
sticky($box);
});
/*
* Diese Methode ist dafür zuständig, ein DIV
* jederzeit am unteren Rand des Fensters zu "haften".
*/
function sticky($b) {
// Kurze Variablen einführen
$bHeight = $b.height();
$wHeight = $(window).height();
// Stil des DIVs manipulieren
$b.css('position', 'fixed');
$b.css('top', $wHeight - $bHeight);
}
});
Chris, als einfachen Vorschlag denke ich, Sie könnten sowohl DOMReady als auch Load-Ereignisse verbinden, damit die Sticky Footer sofort am unteren Rand des Viewports angebracht wird und wenn sie nach dem Laden von Bildern zu ihrer ursprünglichen statischen Position zurückkehren muss, dann tut sie das.
Das passt am besten für mich
Ich konnte das lösen, indem ich ein zusätzliches Div am Ende des Footer-Divs hinzugefügt habe. Nehmen wir an, wir nennen dieses Div
div id="stickyfooter">
und in CSS verwenden Sie Folgendes:
#stickyfooter{
background-color: black;
background-repeat: repeat;
bottom: 0;
height: 100%;
pointer-events: none;
position: absolute;
width: 100%;
z-index: -1;
}
Die Hintergrundfarbe war in meinem Fall schwarz. Sie sollte sich möglicherweise für Ihren Fall ändern und kann wahrscheinlich in den meisten Fällen funktionieren.
Hallo, danke Chris und allen hier.
Vielleicht übersehe ich etwas, aber wollen wir den Footer nicht nur am unteren Rand fixieren, wenn die Körperhöhe kleiner als die Fensterhöhe ist? Dann ist der footerHeight überflüssig..
Hallo! Habe vor diesem Beitrag noch einen anderen Weg gefunden =)
CSS
.stickyfooter {
position:absolute;
bottom:0px;
}
/sonst ist es nur ein normaler WordPress-Footer
Die 311 ist die Höhe des Footers...
Obwohl, ich glaube, Waynoss' Weg ist etwas sauberer...
Guter Beitrag, Mann. Ich arbeite an einem Projekt, das sehr nützlich war. Danke!
Vielen Dank, Chris Coyier und Øyvind Hauge, beide Kombinationen sind gut zu verwenden, mit oder ohne Animationen, und vielen Dank auch an alle anderen für das Teilen von Gedanken.
Funktioniert großartig, Mann, danke.
Sehr hilfreich. Prost!
Das ist ziemlich frustrierend, das funktioniert überhaupt nicht. Es werden nicht einmal Fehler in Chrome oder Firefox angezeigt. Alles, was man braucht, sind die Standard-jQuery-Bibliotheken, oder?
Meine machen absolut nichts und ich kann nicht herausfinden, warum...
Aus irgendeinem Grund funktioniert das nicht mit einer unsortierten Liste...
Leichte Verfeinerung, um den Footer von seiner *aktuellen* Position nach unten zum unteren Rand zu verschieben. Wie ursprünglich geschrieben, setzt position: absolute (unsichtbar) top auf 0, was dazu führt, dass der Footer vom oberen Fensterrand animiert wird. Die Lösung ist, die aktuelle Top-Position gleichzeitig mit position:absolute zu setzen.
Was ist mit reinem HTML+CSS? Schauen Sie sich http://ryanfait.com/sticky-footer/ an (IE5+, und andere).
Ich denke, es ist einfach so zu machen
Ich habe ein Problem damit, dass der Sticky Footer einen "top: —px" Wert hinzufügt. Kann jemand hier einen Blick darauf werfen
http://ancellcreative.com/fmm-multiculture.org/about/board-members
und vielleicht Einblicke geben? Vielen Dank!
Ignorieren Sie meinen vorherigen Kommentar, ich habe herausgefunden, was mein Problem war.
Nochmals vielen Dank!
Hallo Chris, ich wollte nur danke sagen, es funktioniert großartig, genau das, was ich gesucht habe.
Ich habe mehrere reine CSS-Lösungen ausprobiert, aber die meisten, wenn nicht alle, erforderten spezielle Tag-Layouts und Namen/IDs. Mit dieser jQuery-Lösung konnte es einfach direkt integriert werden und funktionierte. Es scheint in allen bisher getesteten Browsern zuverlässig zu sein, Prost.
Reine CSS Sticky Footer funktioniert... bis Sie einen jQuery-Link deklarieren. Diese Skripte lösen das. Danke an den Autor.
Ich bin asiatisch, also entschuldigen Sie mein Grammatik.
Aber... es funktioniert nicht auf Samsung Tab
Danke, ich mag den Trick, er funktioniert wirklich.
Hallo.
Vielen Dank für den Code. Kann mir jemand bitte bei folgendem Problem helfen?
Hier ist der Code, den ich derzeit benutze
$(window).bind("load", function() {
});
Ich benutze ein jQuery-Skript für Suche und Ergebnisse, also hier ist das Ergebnis, das ich haben möchte:
Der Footer soll unten auf dem Bildschirm sein, wenn es weniger Ergebnisse gibt.
Aber wenn die Ergebnisse mehr sind, als der Computerbildschirm verarbeiten kann, möchte ich, dass der Footer unter das letzte Ergebnis der Suche geschoben wird.
Die Ergebnisse werden in einem Div angezeigt.
Vielen Dank für die Hilfe.
Wow, das funktioniert, Mann... muss es aber noch in Safari testen.
Danke.
Es scheint ein Problem zu geben, da die Höhe des Footers doppelt gezählt wird, wenn er eine statische Position hat (aber nicht, wenn er absolut positioniert ist, da absolute so funktioniert). Ich habe es umgangen, indem ich footerHeight auf 0 gesetzt habe (nachdem es auf die tatsächliche Höhe des Footers gesetzt wurde), wenn seine Position nicht absolut ist.
if($footer.css("position") != "absolute"){
footerHeight = 0;
}
Natürlich könnten Sie auch sagen, wenn absolut, setzen Sie es auf die Höhe des Footers und sonst auf 0.
Dadurch wird eine footerHeight von 0 zur body-Höhe hinzugefügt, wenn der Footer bereits im Body enthalten ist (nicht absolut).
Das Einzige, was jetzt ein wenig unschön ist, ist die Tatsache, dass es 32px falsch berechnet, wenn Sie in WordPress eingeloggt sind, da es diese nervige Admin-Leiste gibt, die den Viewport relativ zum Body um 44 Pixel höher macht. Sie könnten das als gegeben hinnehmen (sie ist nur für Administratoren sichtbar) oder etwas wie
if($("#wpadminbar").length){
footerHeight += 32;
}
Das macht den Wert, der mit der Viewport-Höhe verglichen wird, 32 Pixel höher, aber nur, wenn die Admin-Leiste vorhanden ist.
Herr Daniel Flores, vielen Dank für das Teilen. Der Code im Kommentar ist wirklich cool und funktioniert für mich.
Ich habe Schwierigkeiten, dies in einem Fall zu implementieren, in dem sowohl die Tags "html" als auch "body" in CSS eine "height: 100%" definiert haben.
Es scheint, dass entweder "body" oder "html" auf 100% Höhe gesetzt werden kann, aber nicht beide.
Haben Sie eine Ahnung, warum das so ist?
(und ich muss wirklich beide auf 100% definiert haben, wegen eines anderen Skripts, das ich ausführe)
Ich hatte Probleme, bei denen auf bestimmten Seiten der Footer etwa einen Zoll vom unteren Rand des vorherigen Blocks entfernt sein sollte und daher am unteren Bildschirmrand haften sollte, aber das tat er nicht. Meine schnelle Lösung dafür war, dass unter footerTop = ($(window).scrollTop() + $(window).height() - footerHeight) + "px"; ich footerHeight=0; setzen würde (im Grunde wieder auf 0... aber erst NACH der footerTop-Zeile, NICHT ersetzen die vorherige footerHeight). Das hat dieses Problem für mich behoben. (Das Ersetzen der ursprünglichen footerHeight führte dazu, dass der Footer viel zu weit unten landete...) Nur eine Information für alle, die auf das gleiche Problem gestoßen sind...