<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<br><br><br>
<div id="container" style="overflow-y: auto; height: 800px;">
<div id="sticky-anchor"></div>
<div id="sticky">This will stay at top of page</div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
(Der Unterschied besteht darin, dass die erste Geige ein Kind weniger mit Klasse hat child).
Jede Hilfe geschätzt!
Maximilian Laumeister
Der Grund dafür ist, dass sobald Sie geben position: fixed zu deinem #sticky Element, nimmt es es aus dem Belegfluss heraus. Das bedeutet, dass alle Ihre div.child Elemente verschieben sich nach oben, wodurch die Höhe Ihres Containerelements kleiner wird. Da die Höhe des Containerelements kleiner wird, muss das Containerelement nicht mehr scrollen, was bedeutet, dass sein Scrollbalken verschwindet und seine Scrollposition auf 0 zurückgesetzt wird. Wenn seine Scrollposition auf 0 zurückgesetzt wird, entfernt das Skript wieder die stick Klasse von dir #sticky -Element und wir sind wieder da, wo wir angefangen haben, aber mit dem Container-Element, das ganz nach oben gescrollt ist.
Zusammenfassend:
#sticky Element bekommt .stick Klasse.
#sticky Element wird aus dem Dokumentenfluss entfernt, untergeordnete Elemente werden nach oben verschoben, die Höhe des Containerelements verringert sich und die Bildlaufleiste verschwindet. Behälter scrollTop wird auf 0 zurückgesetzt.
Das Skript wird erneut ausgelöst und entfernt die .stick Klasse ab #stickyund die des Containers scrollTop bleibt auf 0 (dadurch wird das Container-Div wieder nach oben gescrollt).
Unten ist eine Lösung, die verwendet position: absolute für die #sticky Element, und wenn die #sticky Element erhält die stick Klasse, es gibt die #sticky-anchor Element eine Höhe gleich der Höhe des #sticky -Element, um zu verhindern, dass die untergeordneten Divs nach oben verschoben werden.
Arbeitende Live-Demo:
function sticky_relocate() {
var window_top = $('#container').scrollTop();
var div_top = $('#sticky-anchor').offset().top;
$('.stick').css('width', $('#sticky').next().css('width'));
if (window_top > div_top) {
$('#sticky-anchor').height($("#sticky").outerHeight());
$('#sticky').addClass('stick');
$("#sticky").css("top", (window_top) + "px");
} else {
$('#sticky').removeClass('stick');
$('#sticky-anchor').height(0);
}
}
$(function () {
$('#container').scroll(sticky_relocate);
sticky_relocate();
});
Als Nebenbemerkung, der Grund, warum es in Ihrem zweiten Beispiel gut funktioniert hat, ist, dass das zusätzliche untergeordnete Element es so gemacht hat, dass selbst wenn Ihr #sticky -Element aus dem Dokumentenfluss entfernt und die Höhe des Containerelements reduziert wurde, war die Höhe des Containerelements immer noch groß genug, um zu verhindern, dass die Bildlaufleiste springt/verschwindet und Ihre scrollTop.
@AlonShmiel Falls Sie immer noch an einer Version interessiert waren, die den Header immer oben im Inhalt hält, hier ist ein JSFiddle! jsfiddle.net/HV9HM/2882
– Maximilian Laumeister
17. August 2015 um 22:50 Uhr
Obwohl die beste Antwort auf diese spezielle Frage eindeutig die von @MaximillianLaumeister ist, finden Sie hier eine allgemeine Lösung zum Befestigen eines Elements an einem anderen Element.
Tether ist eine JavaScript-Bibliothek, mit der ein absolut positioniertes Element effizient neben einem anderen Element auf der Seite bleiben kann.
Tether bietet die Möglichkeit, das Element innerhalb des Ansichtsfensters, seines Scroll-Elternteils, eines beliebigen anderen Elements auf der Seite oder eines festen Begrenzungsrahmens einzuschränken.
Dies ist eine Art unvollständige Antwort, da Sie gerade mit einer Bibliothek verknüpft sind, die dies tut, ohne den Code dafür zu zeigen, wie es geht.
– John Zabroski
9. Dezember 2016 um 22:33 Uhr
@JohnZabroski, da bin ich anderer Meinung. Die Antwort ist vollständig. Viele Menschen sind möglicherweise nicht an dieser Ressource interessiert. Warum die Seite mit Code überladen, der für die meisten nutzlos ist und eine Wartung auf dieser Seite erfordern würde? Es ist besser, eine kurze Beschreibung bereitzustellen, und für diejenigen, die daran interessiert sind, können sie die Website besuchen, um mehr zu erfahren.
– Michael Benjamin
10. Dezember 2016 um 5:28 Uhr
Ich habe dir einen Hinweis gegeben. Bootstrap4 verwendet für diesen Effekt nicht einmal Tether, denn wenn Sie es versuchen würden, würden Sie verstehen, warum. Sie haben für diesen Zweck ein spezielles Plug-in namens Affix, das sie für ihr klebriges Inhaltsverzeichnis verwenden.
– John Zabroski
11. Dezember 2016 um 11:04 Uhr
@JohnZabroski, ich habe Bootstrap in keinem meiner Projekte verwendet. Aber danke für diese Info. Letztendlich war meine Antwort als Ergänzung oder Alternative zur akzeptierten Antwort gedacht. Nichts Besonderes.
zusammen mit position:fixed;Sie müssen der Sticky-Navigationsleiste auch einen höheren Z-Index-Wert als den anderen Elementen derselben Seite geben z-index:blah;
Das Problem tritt auf, wenn die Containerhöhe x ist und der Inhalt des Containers kleiner als x+36px ist. In diesem Beispiel ist der Container 800 Pixel groß und der Inhalt kleiner als 836 Pixel. Meine Idee für die Lösung war, die Höhe des Inhalts zu überprüfen und mit der Höhe des Containers zu vergleichen und wenn der Unterschied weniger als 36 Pixel beträgt, die Stick-Klasse einfach nicht hinzuzufügen.
Gemeinschaft
Es ist sehr einfach. Fügen Sie einfach das folgende Styling für das spezifische Sticky-Div hinzu.
klebrig{Position: fixiert;}
10833600cookie-checkKleben Sie div oben auf das übergeordnete Elementyes