Chcę, aby pasek nawigacji trzymał się u góry po przewinięciu do niego, ale nie działa i nie mam pojęcia, dlaczego. Jeśli możesz mi pomóc, oto mój kod HTML i CSS:
.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
źródło
źródło
position: sticky
może przestać działać, czy to wewnątrz schematu flexbox jeśli nie jesteś ostrożny , a także zawieść Jeśli istniejeoverflow: hidden
luboverflow: auto
między nim a cokolwiek to przewija wewnątrz (root ciała lub najbliższego przodka z overflow: scroll)overflow: hidden
ioverflow: auto
! Od dniOdpowiedzi:
W swoim przykładzie musisz więc zdefiniować pozycję, w której powinien się na końcu trzymać, używając
top
właściwości.źródło
Sprawdź, czy element nadrzędny ma ustawioną przepełnienie (np.
overflow:hidden
); spróbuj to zmienić. Być może będziesz musiał przejść w górę drzewa DOM wyżej niż się spodziewasz =).Może to mieć wpływ
position:sticky
na element podrzędny.źródło
$(stickyElement).parents().css("overflow", "visible")
w konsoli internetowej pomoże i tak. Potem znalazłem daleki rodzic zeoverflow:hidden
stylem, który spowodował problem. Chciałbym dokładniej przeczytać tę odpowiedź.overflow:hidden
, możesz uruchomić ten skrypt w konsoli przeglądarki, aby sprawdzić wszystkich rodziców / przodków danego elementu: gist.github.com/brandonjp/478cf6e32d90ab9cb2cd8cbb0799c7a7Mam ten sam problem i tutaj znalazłem odpowiedź .
Jeśli Twój element nie przywiera zgodnie z oczekiwaniami, pierwszą rzeczą do sprawdzenia są reguły zastosowane do kontenera.
W szczególności poszukaj dowolnej właściwości przepełnienia ustawionej dla elementu nadrzędnego. Nie można używać :
overflow: hidden
,overflow: scroll
luboverflow: auto
na rodzicaposition: sticky
elementu.źródło
Kilka innych rzeczy, z którymi się spotkałem:
Kiedy twój lepki element jest komponentem (kanciasty itp.)
Jeśli sam element „sticky” jest komponentem z niestandardowym selektorem elementu, takim jak komponent kątowy o nazwie
<app-menu-bar>
, musisz dodać następujące elementy do css komponentu:lub
Wydaje się, że zwłaszcza Safari na iOS wymaga
display:block
nawet głównego elementuapp-root
aplikacji kątowej lub nie będzie się trzymać.Jeśli tworzysz komponent i definiujesz css wewnątrz komponentu (cień DOM / style hermetyzowane), upewnij się, że
position: sticky
jest on stosowany do selektora „zewnętrznego” (np.app-menu-bar
W devtools powinien pokazywać pozycję sticky), a nie najwyższego poziomudiv
w składnik. Dzięki Angularowi można to osiągnąć za pomocą:host
selektora w css dla twojego komponentu.Inny
Jeśli element następujący po przyklejonym elemencie ma jednolite tło, musisz dodać następujące elementy, aby nie przesuwał się pod spodem:
Twój lepki element musi być pierwszy (przed treścią), jeśli używasz,
top
i po nim, jeśli używaszbottom
.Występują komplikacje podczas używania
overflow: hidden
na elemencie wrapper - generalnie zabije to lepki element wewnątrz. Lepiej wyjaśnione w tym pytaniuPrzeglądarki mobilne mogą wyłączać przyklejone / nieruchome elementy, gdy widoczna jest klawiatura ekranowa. Nie jestem pewien dokładnych zasad (czy ktokolwiek wie), ale kiedy klawiatura jest widoczna, patrzysz na coś w rodzaju `` okna '' w oknie i nie będziesz w stanie łatwo przykleić rzeczy do rzeczywista widoczna góra ekranu.
Upewnij się że masz:
position: sticky;
i nie
display: sticky;
Różne problemy związane z użytecznością
źródło
display: block
iposition: relative
wyzwala prawidłowe zachowanie w Safari - czy wydawało się, że wystarczyłodisplay: block
? Oczywiście, prawdopodobnie nie zaszkodzi, że oba określonodisplay: block
wystarczyłoTo jest kontynuacja odpowiedzi MarsAndBack i Miftah Mizwar.
Ich odpowiedzi są prawidłowe. Jednak trudno jest zidentyfikować przodka (przodków) problemu.
Aby było to bardzo proste, po prostu uruchom ten skrypt jQuery w konsoli przeglądarki, a on poinformuje Cię o wartości właściwości przepełnienia dla każdego przodka.
Tam, gdzie przodek nie
overflow: visible
zmienił swojego CSS, więc ma!Ponadto, jak stwierdzono w innym miejscu, upewnij się, że twój sticky element ma to w CSS:
źródło
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; }
gdzie$0
jest ostatni element wybrany w narzędziach programistycznych.Musiałem użyć następującego CSS, aby to działało:
Jeśli powyższe nie działa, to ...
Przejdź przez wszystkich przodków i upewnij się, że żaden z tych elementów nie ma
overflow: hidden
. Musisz to zmienić naoverflow: visible
źródło
O ile natrafiłeś na to, a twój sticky nie działa - spróbuj ustawić rodzica na:
Pracował dla mnie
źródło
display: unset
, co nie zawsze może być natychmiast opłacalnecontents
,initial
(?) Iinline
Zabawny moment, który nie był dla mnie oczywisty: przynajmniej w Chrome 70
position: sticky
nie jest stosowany, jeśli ustawiłeś go za pomocą DevTools.źródło
Wygląda na to, że pasek nawigacyjny, który ma być przyklejony, nie powinien znajdować się wewnątrz żadnego elementu div ani sekcji z inną zawartością. Żadne z rozwiązań nie działało dla mnie, dopóki nie wyjąłem paska nawigacyjnego z div, który navbar dzielił z innym topbar. Wcześniej topbar i navbar były owinięte wspólnym div.
źródło
display: unset
, to ograniczenie zostanie zniesione! zobacz stackoverflow.com/a/60560997/2902367 Wydaje się również, że działa zcontents
,initial
(?) iinline
z mojego komentarza:
Istnieje polyfill do wykorzystania w innych przeglądarkach niż FF i Chrome. To jest eksperymentalna reguła, którą można wdrożyć lub nie w dowolnym momencie za pomocą przeglądarki. Chrome dodał go kilka lat temu, a następnie upuścił, wydaje się, że wrócił ... ale na jak długo?
Najbliższa byłaby pozycja: względne + współrzędne aktualizowane podczas przewijania po osiągnięciu lepkiego punktu, jeśli chcesz zmienić to w skrypt javascript
źródło
Wiem, że wydaje mi się, że na to już udzielono odpowiedzi, ale trafiłem na konkretny przypadek i czuję, że większość odpowiedzi mija się z celem.
W
overflow:hidden
odpowiedzi na pokrycie 90% przypadków. To mniej więcej scenariusz „lepkiej nawigacji”.Ale lepkość najlepiej jest stosować na wysokości pojemnika. Pomyśl o formularzu biuletynu w prawej kolumnie witryny, który przewija się w dół wraz ze stroną. Jeśli twój lepki element jest jedynym elementem podrzędnym kontenera, kontener ma dokładnie ten sam rozmiar i nie ma miejsca na przewijanie.
Twój kontener musi mieć wysokość, na której spodziewasz się przewijania elementu. Która w moim scenariuszu „prawej kolumny” jest wysokością lewej kolumny. Najlepszym sposobem na osiągnięcie tego jest użycie
display:table-cell
na kolumnach. Jeśli nie możesz, i utkniesz zfloat:right
i tak jak ja, będziesz musiał albo zgadnąć wysokość lewej kolumny, aby obliczyć ją za pomocą JavaScript.źródło
sticky-limit: parent
,sticky-limit: body
albosticky-limit: nth-parent(3)
... W każdym razie: Jeśli możesz, możesz znieść to ograniczenie, ustawiając ograniczającego rodzica nadisplay: unset
, jak wspomniano na stackoverflow.com/a/60560997/2902367 . Wydaje się również, że działa zcontents
,initial
(?) Iinline
Wiem, że to stary post. Ale jeśli jest ktoś taki jak ja, który niedawno zaczął bawić się pozycją: lepki, może to być przydatne.
W moim przypadku użyłem position: sticky jako elementu siatki. To nie działało, a problemem był przepełnienie-x: ukryty na
html
elemencie. Jak tylko usunąłem tę właściwość, działało dobrze. Mając overflow-x: ukryty nabody
elemencie wydawał się działać, nie mam jeszcze pojęcia dlaczego.źródło
dwie odpowiedzi tutaj:
usuń
overflow
właściwość zbody
taguustaw
height: 100%
na,body
aby rozwiązać problemoverflow-y: auto
źródło
Uważam, że ten artykuł wiele mówi o tym, jak
sticky
działaźródło
Prawdziwe zachowanie lepkiego elementu to:
Element pozycjonowany przyklejony jest traktowany jako pozycjonowany względnie, dopóki jego blok zawierający nie przekroczy określonego progu (takiego jak ustawienie z góry na wartość inną niż auto) w jego źródle przepływu (lub pojemniku, w którym przewija się), w którym to momencie jest traktowany jako „zablokowany "aż do spotkania z przeciwną krawędzią zawierającego ją bloku.
Element jest pozycjonowany zgodnie z normalnym przepływem dokumentu, a następnie przesunięty względem swojego najbliższego przewijanego przodka i zawiera blok (najbliższy przodek na poziomie bloku), w tym elementy związane z tabelą, na podstawie wartości top, right, bottom, i wyszedł. Odsunięcie nie wpływa na położenie żadnych innych elementów.
Ta wartość zawsze tworzy nowy kontekst układania. Zauważ, że lepki element „przykleja się” do swojego najbliższego przodka, który ma „mechanizm przewijania” (tworzony, gdy przepełnienie jest ukryte, przewijane, automatyczne lub nakładane), nawet jeśli ten przodek nie jest najbliższym przodkiem przewijającym się.
Ten przykład pomoże ci zrozumieć:
code
https://codepen.io/darylljann/pen/PpjwPMźródło
jeśli poprawka danday74 nie działa, sprawdź, czy element nadrzędny ma wysokość.
W moim przypadku miałem dwoje dzieci, jedno w lewo, drugie w prawo. Chciałem, aby prawy pływający stał się lepki, ale musiałem dodać
<div style="clear: both;"></div>
na końcu rodzica, aby nadać mu wysokość.źródło
float:left
do elementu nadrzędnego (bez pływaka jego wysokość wynosiła 0) iposition:sticky
działałem.Użyłem rozwiązania JS. Działa w przeglądarkach Firefox i Chrome. Jakieś problemy, daj mi znać.
html
css
js
źródło
z-index
jest również bardzo ważne. Czasami to zadziała, ale po prostu tego nie zobaczysz. Dla pewności spróbuj ustawić bardzo wysoką liczbę. Nie zawsze też umieszczaj,top: 0
ale spróbuj czegoś wyżej, na wypadek gdyby było gdzieś ukryte (pod paskiem narzędzi).źródło
Oto, co mnie zaskoczyło ... mój lepki element div znajdował się wewnątrz innego elementu div, więc nadrzędny element div potrzebował dodatkowej zawartości PO lepkim div, aby nadrzędny element div był „wystarczająco wysoki”, aby przyklejony element div „przesuwał się” po innych treściach przewijasz w dół.
Więc w moim przypadku zaraz po lepkim div musiałem dodać:
(Moja aplikacja ma dwa elementy div obok siebie, z „wysokim” obrazem po lewej i krótkim formularzem wprowadzania danych po prawej stronie. Chciałem, aby formularz wprowadzania danych unosił się obok obrazu podczas przewijania w dół, więc formularz jest zawsze na ekranie. Nie zadziała, dopóki nie dodam powyższej „dodatkowej zawartości”, więc przyklejony element div ma coś do „przesuwania”
źródło
Prawdą jest, że
overflow
należy usunąć lub ustawić,initial
abyposition: sticky
działał na elemencie potomnym. Użyłem Material Design w mojej aplikacji Angular i odkryłem, że niektóre komponenty Material zmieniłyoverflow
wartość. Poprawka dla mojego scenariusza toźródło