Ich möchte, dass die Navigationsleiste nach dem Scrollen oben bleibt, aber sie funktioniert nicht und ich habe keine Ahnung warum. Wenn Sie bitte helfen können, ist hier mein HTML- und CSS-Code:
.nav-selections {
text-transform: uppercase;
letter-spacing: 5px;
font: 18px "lato",sans-serif;
display: inline-block;
text-decoration: none;
color: white;
padding: 18px;
float: right;
margin-left: 50px;
transition: 1.5s;
}
.nav-selections:hover{
transition: 1.5s;
color: black;
}
ul {
background-color: #B79b58;
overflow: auto;
}
li {
list-style-type: none;
}
<nav style="position: sticky; position: -webkit-sticky;">
<ul align="left">
<li><a href="#/contact" class="nav-selections" style="margin-right:35px;">Contact</a></li>
<li><a href="#/about" class="nav-selections">About</a></li>
<li><a href="#/products" class="nav-selections">Products</a></li>
<li><a href="#" class="nav-selections">Home</a></li>
</ul>
</nav>
html
css
css-position
Harleyoc1
quelle
quelle
position: sticky
kann aufhören zu arbeiten, wenn es sich in einer Flexbox befindet, es sei denn, Sie sind vorsichtig und wird auch fehlschlagen, wenn es einoverflow: hidden
oderoverflow: auto
zwischen ihr und dem gibt, was darinoverflow: hidden
und erzählt hastoverflow: auto
! Ich habe mich seit Tagen am Kopf gekratzt und versucht, diesen Mist zumAntworten:
In Ihrem Beispiel müssen Sie also die Position definieren, an der es am Ende bleiben soll, indem Sie die
top
Eigenschaft verwenden.quelle
Überprüfen Sie, ob für ein Vorgängerelement ein Überlauf festgelegt wurde (z. B.
overflow:hidden
). versuche es umzuschalten. Möglicherweise müssen Sie den DOM-Baum höher als erwartet nach oben gehen =).Dies kann sich
position:sticky
auf ein untergeordnetes Element auswirken .quelle
$(stickyElement).parents().css("overflow", "visible")
Webkonsole helfen würde, und es tat. Dann fand ich das ferne Elternteil mitoverflow:hidden
. Stil, der das Problem verursacht ich wünschte , ich diese Antwort mehr lesen sorgfältig.overflow:hidden
nach suchenIch habe das gleiche Problem und habe hier die Antwort gefunden .
Wenn Ihr Element nicht wie erwartet haftet, müssen zunächst die auf den Container angewendeten Regeln überprüft werden.
Suchen Sie insbesondere nach Überlaufeigenschaften, die für das übergeordnete Element festgelegt wurden. Sie können nicht verwenden :
overflow: hidden
,overflow: scroll
oderoverflow: auto
auf dem Elternteil einesposition: sticky
Elements.quelle
Einige weitere Dinge, auf die ich gestoßen bin:
Wenn Ihr klebriges Element eine Komponente ist (eckig usw.)
Wenn das 'sticky'-Element selbst eine Komponente mit einem benutzerdefinierten Element-Selektor ist, z. B. eine Winkelkomponente mit dem Namen, müssen
<app-menu-bar>
Sie dem CSS der Komponente Folgendes hinzufügen:oder
Insbesondere Safari unter iOS scheint
display:block
sogar das Stammelementapp-root
einer eckigen Anwendung zu erfordern , da es sonst nicht haften bleibt.Wenn Sie eine Komponente und die Definition der CSS in der Komponente erstellen (Schatten DOM / verkapselt Stile) sicher, dass die
position: sticky
an die ‚äußere‘ Selektor angelegt wird (z. B.app-menu-bar
in devtools sollte die klebrige Position zeigen) und nicht eine Top - Leveldiv
innerhalb die Komponente. Mit Angular kann dies mit dem:host
Selektor im CSS für Ihre Komponente erreicht werden.Andere
Wenn das Element, das Ihrem klebrigen Element folgt, einen festen Hintergrund hat, müssen Sie Folgendes hinzufügen, damit es nicht darunter rutscht:
Ihr klebriges Element muss zuerst (vor Ihrem Inhalt) sein, wenn Sie es verwenden,
top
und danach, wenn Sie es verwendenbottom
.Es gibt Komplikationen bei der Verwendung
overflow: hidden
Ihres Wrapper-Elements - im Allgemeinen wird das klebrige Element im Inneren abgetötet. Besser erklärt in dieser FrageMobile Browser können klebrige / fest positionierte Elemente deaktivieren, wenn die Bildschirmtastatur sichtbar ist. Ich bin mir der genauen Regeln nicht sicher (weiß irgendjemand jemals), aber wenn die Tastatur sichtbar ist, sehen Sie eine Art 'Fenster' in das Fenster und Sie werden nicht leicht in der Lage sein, Dinge dazu zu bringen, sich an die zu halten tatsächlich sichtbarer oberer Bildschirmrand.
Stell sicher dass du hast:
position: sticky;
und nicht
display: sticky;
Verschiedene Bedenken hinsichtlich der Benutzerfreundlichkeit
quelle
display: block
undposition: relative
das richtige Verhalten in Safari auslöst - schien es, dass nurdisplay: block
benötigt wurde? Natürlich tut es wahrscheinlich nicht weh, beide angegeben zu habendisplay: block
war genugDies ist eine Fortsetzung der Antworten von MarsAndBack und Miftah Mizwar.
Ihre Antworten sind richtig. Es ist jedoch schwierig, die problematischen Vorfahren zu identifizieren.
Um dies sehr einfach zu machen, führen Sie einfach dieses jQuery-Skript in Ihrer Browserkonsole aus und es zeigt Ihnen den Wert der Überlaufeigenschaft für jeden Vorfahren an.
Wo ein Vorfahr
overflow: visible
sein CSS nicht geändert hat, so dass es tut!Stellen Sie außerdem, wie an anderer Stelle angegeben, sicher, dass Ihr Sticky-Element dies im CSS enthält:
quelle
overflow: invisible
.(async function() { let response = await fetch('https://code.jquery.com/jquery-3.3.1.min.js'); let script = await response.text(); eval(script); })();
var p = $0.parentElement; while(p != null) { var ov = getComputedStyle(p).overflow; if(ov !== 'visible') console.warn(ov, p); else console.log(ov, p); p = p.parentElement; }
Wo$0
ist das letzte in Entwicklertools ausgewählte Element ?Ich musste das folgende CSS verwenden, um es zum Laufen zu bringen:
Wenn oben nicht funktioniert, dann ...
Gehen Sie alle Vorfahren durch und stellen Sie sicher, dass keines dieser Elemente vorhanden ist
overflow: hidden
. Sie müssen dies ändern inoverflow: visible
quelle
Ein lustiger Moment, der für mich nicht offensichtlich war: Zumindest in Chrome 70
position: sticky
wird er nicht angewendet, wenn Sie ihn mit DevTools eingestellt haben.quelle
Es scheint, dass sich die zu klebende Navigationsleiste nicht in einem Div oder Abschnitt mit anderem Inhalt befinden sollte. Keine der Lösungen funktionierte für mich, bis ich die Navigationsleiste aus dem Div herausnahm, das die Navigationsleiste mit einer anderen oberen Leiste teilte. Ich hatte zuvor die obere Leiste und die Navigationsleiste mit einem gemeinsamen Div umwickelt.
quelle
display: unset
, wird diese Einschränkung aufgehoben! siehe stackoverflow.com/a/60560997/2902367 scheint sich auch auf die Arbeit mitcontents
,initial
und (?)inline
Wenn Sie darauf gestoßen sind und Ihr Sticky nicht funktioniert, setzen Sie das übergeordnete Element auf:
Hat für mich gearbeitet
quelle
display: unset
kann, was möglicherweise nicht immer sofort lebensfähig istcontents
,initial
und (?)inline
aus meinem Kommentar:
Es gibt Polyfill für andere Browser als FF und Chrome. Dies ist eine experimentelle Regel, die jederzeit über Browser implementiert werden kann oder nicht. Chrome hat es vor ein paar Jahren hinzugefügt und dann fallen gelassen, es scheint zurück zu sein ... aber wie lange?
Die nächstgelegene wäre position: relative + Koordinaten, die beim Scrollen aktualisiert wurden, sobald der Sticky Point erreicht ist, wenn Sie dies in ein Javascript-Skript umwandeln möchten
quelle
Ich weiß, dass dies bereits beantwortet zu sein scheint, aber ich bin auf einen bestimmten Fall gestoßen, und ich habe das Gefühl, dass die meisten Antworten den Punkt verfehlen.
Die
overflow:hidden
Antworten decken 90% der Fälle ab. Das ist mehr oder weniger das "Sticky Nav" -Szenario.Das klebrige Verhalten wird jedoch am besten in der Höhe eines Behälters verwendet. Stellen Sie sich ein Newsletter-Formular in der rechten Spalte Ihrer Website vor, das mit der Seite nach unten rollt. Wenn Ihr klebriges Element das einzige untergeordnete Element des Containers ist, hat der Container genau die gleiche Größe und es ist kein Platz zum Scrollen vorhanden.
Ihr Container muss die Höhe haben, in der Ihr Element scrollen soll. Was in meinem Szenario "rechte Spalte" die Höhe der linken Spalte ist. Der beste Weg, dies zu erreichen, ist die Verwendung
display:table-cell
für die Spalten. Wenn Sie nicht können und dabei bleibenfloat:right
und so wie ich, müssen Sie entweder die Höhe der linken Spalte erraten, um sie mit Javascript zu berechnen.quelle
sticky-limit: parent
,sticky-limit: body
odersticky-limit: nth-parent(3)
... Wie dem auch sei: Wenn Sie können, Sie diese Einschränkung aufheben kann , indem der Begrenzungs Elterndisplay: unset
, wie in angemerkt stackoverflow.com/a/60560997/2902367 . Auch scheint mit zu arbeitencontents
,initial
und (?)inline
Ich weiß, dass dies ein alter Beitrag ist. Aber wenn es jemanden wie mich gibt, der erst kürzlich angefangen hat, mit der Position herumzuspielen: klebrig, das kann nützlich sein.
In meinem Fall habe ich position: sticky als Gitterelement verwendet. Es funktionierte nicht und das Problem war ein Überlauf-x: versteckt auf dem
html
Element. Sobald ich diese Eigenschaft entfernt habe, hat es gut funktioniert. Überlauf-x: auf dembody
Element versteckt zu haben , schien zu funktionieren, keine Ahnung warum noch.quelle
zwei antworten hier:
overflow
Eigenschaft aus dembody
Tag entfernenStellen Sie
height: 100%
das einbody
, um das Problem mit zu behebenoverflow-y: auto
quelle
Ich glaube, dieser Artikel sagt viel darüber aus, wie es
sticky
funktioniertquelle
Das wirkliche Verhalten eines klebrigen Elements ist:
Ein klebrig positioniertes Element wird als relativ positioniert behandelt, bis sein enthaltender Block einen bestimmten Schwellenwert (z. B. das Setzen von top auf einen anderen Wert als auto) innerhalb seiner Flusswurzel (oder des Containers, in dem es scrollt) überschreitet. An diesem Punkt wird es als "stecken geblieben" behandelt "bis sie die gegenüberliegende Kante ihres enthaltenden Blocks treffen.
Das Element wird gemäß dem normalen Fluss des Dokuments positioniert und dann relativ zu seinem nächsten scrollenden Vorfahren versetzt und enthält einen Block (nächsten Vorfahren auf Blockebene), einschließlich tabellenbezogener Elemente, basierend auf den Werten von oben, rechts, unten, und links. Der Versatz wirkt sich nicht auf die Position anderer Elemente aus.
Dieser Wert erstellt immer einen neuen Stapelkontext. Beachten Sie, dass ein klebriges Element an seinem nächsten Vorfahren "haftet", der über einen "Bildlaufmechanismus" verfügt (der erstellt wird, wenn der Überlauf ausgeblendet, gescrollt, automatisch oder überlagert ist), auch wenn dieser Vorfahr nicht der nächste tatsächlich scrollende Vorfahr ist.
Dieses Beispiel hilft Ihnen zu verstehen:
code
https://codepen.io/darylljann/pen/PpjwPMquelle
Wenn der Fix von danday74 nicht funktioniert, überprüfen Sie, ob das übergeordnete Element eine Höhe hat.
In meinem Fall hatte ich zwei Kinder, eines nach links und eines nach rechts. Ich wollte, dass das richtige schwimmende klebrig wird, musste aber
<div style="clear: both;"></div>
am Ende des Elternteils ein hinzufügen , um ihm Höhe zu geben.quelle
float:left
dem übergeordneten Element hinzu (ohne Float war seine Höhe 0) undposition:sticky
arbeitete.Ich habe eine JS-Lösung verwendet. Es funktioniert in Firefox und Chrome. Probleme, lass es mich wissen.
html
CSS
js
quelle
z-index
ist auch sehr wichtig. Manchmal funktioniert es, aber Sie werden es einfach nicht sehen. Versuchen Sie, es auf eine sehr hohe Zahl einzustellen, nur um sicherzugehen. Stellen Sie auch nicht immertop: 0
etwas Höheres auf, falls es irgendwo versteckt ist (unter einer Symbolleiste).quelle
Hier ist, was mich auslöste ... mein klebriges Div befand sich in einem anderen Div, so dass das übergeordnete Div nach dem klebrigen Div zusätzlichen Inhalt benötigte, um das übergeordnete Div "groß genug" zu machen, damit das klebrige Div über anderen Inhalt "gleiten" kann Sie scrollen nach unten.
In meinem Fall musste ich direkt nach dem klebrigen Div hinzufügen:
(Meine Anwendung verfügt über zwei nebeneinander angeordnete Divs mit einem "großen" Bild links und einem kurzen Dateneingabeformular rechts. Ich wollte, dass das Dateneingabeformular beim Scrollen nach unten neben dem Bild angezeigt wird. Das Formular ist also immer auf dem Bildschirm. Es würde nicht funktionieren, bis ich den obigen "zusätzlichen Inhalt" hinzugefügt habe, damit das klebrige Div etwas zum "Übergleiten" hat.
quelle
Es ist WAHR, dass das
overflow
entfernt oder festgelegt werden mussinitial
, damitposition: sticky
das untergeordnete Element funktioniert. Ich habe Material Design in meiner Angular-App verwendet und festgestellt, dass einige Materialkomponenten denoverflow
Wert geändert haben. Das Update für mein Szenario istquelle