Mam div, który ma tylko 300 pikseli, i chcę, aby przy ładowaniu strony przewijał się na dół zawartości. Ten div ma zawartość dodawaną dynamicznie i musi być przewijany do końca. Teraz, jeśli użytkownik zdecyduje się przewinąć w górę, nie chcę, aby przeskakiwał z powrotem na dół, dopóki użytkownik nie przewinie do końca
Czy jest możliwe, aby div, który pozostanie przewinięty do dołu, chyba że użytkownik przewinie w górę, a kiedy użytkownik przewinie z powrotem do dołu, musi pozostać na dole, nawet po dodaniu nowej zawartości dynamicznej. Jak bym to stworzył.
{position : relative; bottom:0;}
. Usuń właściwość css po przewinięciu przez użytkownika.Odpowiedzi:
To może ci pomóc:
[EDYCJA], aby dopasować komentarz ...
za każdym razem, gdy dodawana jest treść, wywołaj funkcję updateScroll () lub ustaw licznik czasu:
jeśli chcesz zaktualizować TYLKO, jeśli użytkownik się nie przeprowadził:
źródło
setInterval
do tego łagodnego problemu.Byłem w stanie uzyskać to działa tylko z CSS.
Sztuką jest użycie
display: flex;
iflex-direction: column-reverse;
Przeglądarka traktuje dno jak górę. Zakładając, że przeglądarki, na które jesteś celem wsparcia
flex-box
, jedynym zastrzeżeniem jest to, że znaczniki muszą być w odwrotnej kolejności.Oto działający przykład. https://codepen.io/jimbol/pen/YVJzBg
źródło
overflow:auto; display:flex; flex-direction:column-reverse;
na zewnętrzne opakowanie zamiast wewnętrznego opakowania.Właśnie to zaimplementowałem i być może możesz użyć mojego podejścia.
Powiedzmy, że mamy następujący kod HTML:
Następnie możemy sprawdzić, czy przewinął do dołu za pomocą:
scrollHeight daje wysokość elementu, w tym każdy niewidoczny obszar z powodu przepełnienia. clientHeight podaje wysokość CSS lub, mówiąc inaczej, rzeczywistą wysokość elementu. Obie metody zwracają wysokość bez
margin
, więc nie musisz się o to martwić. scrollTop podaje pozycję przewijania w pionie. 0 to góra, a max to scrollHeight elementu minus jego wysokość. Podczas korzystania z paska przewijania może być trudno (dla mnie było to w Chrome), aby pasek przewijania znalazł się na samym dole. więc rzuciłem niedokładność 1px. TakisScrolledToBottom
będzie, nawet jeśli pasek przewijania znajduje się 1 piksel od dołu. Możesz ustawić to, co ci się podoba.Następnie wystarczy po prostu ustawić scrollTop elementu na dole.
Zrobiłem dla ciebie skrzypce, aby pokazać koncepcję: http://jsfiddle.net/dotnetCarpenter/KpM5j/
EDYCJA: Dodano fragment kodu, aby wyjaśnić, kiedy
isScrolledToBottom
jesttrue
.Przyklej pasek przewijania do dołu
źródło
if(!isScrolledToBottom)
: test wygląda dla mnie źle (i nie działał w moim kodzie, dopóki go nie naprawiłem).out.scrollHeight - out.clientHeight <= out.scrollTop + 1
. Czy używasz wypełniania w swoim CSS?document.getScrollingElement
zgodnie z sugestią tutaj: stackoverflow.com/questions/36227559/scrolltop-always-returns-0/…Demo na żywo: http://jsfiddle.net/KGfG2/
źródło
źródło
W 2020 r. Możesz użyć przyciągania css , ale przed Chrome 81 zmiana układu nie spowoduje ponownego przyciągania , interfejs użytkownika czatu w czystym css działa w Chrome 81, możesz także sprawdzić Czy mogę użyć przyciągania CSS .
To demo przyciągnie ostatni element, jeśli jest widoczny, przewiń w dół, aby zobaczyć efekt.
źródło
Run code snippet
zobaczyć efekt. (PS: JeśliRun code snippet
nie działa, spróbuj tego: https://jsfiddle.net/Yeshen/xm2yLksu/3/ )Jak to działa:
Domyślnym przepełnieniem jest przewijanie od góry do dołu.
transform: rotate(180deg)
może powodować przewijanie lub ładowanie bloku dynamicznego od dołu do góry.https://blog.csdn.net/yeshennet/article/details/88880252
źródło
Run code snippet
bezpośrednio zobaczyć efekt.Spowoduje to obliczenie pozycji ScrollTop z wysokości
#yourDivID
korzystania z$(document).height()
właściwości, dzięki czemu nawet jeśli zawartość dynamiczna zostanie dodana do div, scroller będzie zawsze w dolnej pozycji. Mam nadzieję że to pomoże. Ale ma też mały błąd, nawet jeśli przewiniemy w górę i opuszczymy wskaźnik myszy z rolki, automatycznie dojdzie do dolnej pozycji. Jeśli ktoś może to naprawić, to też będzie miło.źródło
Oto moja wersja oparta na odpowiedzi dotnetCarpenter. Moje podejście jest czystym jQuery i zmieniłem nazwy zmiennych, aby wszystko było trochę jaśniejsze. Dzieje się tak, gdy wysokość zawartości jest większa niż kontener przewijamy o dodatkową odległość w dół, aby osiągnąć pożądany rezultat.
Działa w IE i chrome ..
źródło
Odpowiedź Jima Halla jest lepsza, ponieważ chociaż nie przewija się ona do dołu, gdy jesteś przewijany w górę, jest to również czysty CSS.
Niestety, nie jest to stabilne rozwiązanie: w chrome (prawdopodobnie z powodu problemu 1-px opisanego przez dotnetCarpenter powyżej)
scrollTop
zachowuje się niedokładnie o 1 piksel, nawet bez interakcji użytkownika (po dodaniu elementu). Możesz ustawićscrollTop = scrollHeight - clientHeight
, ale to utrzyma div na miejscu, gdy zostanie dodany inny element, inaczej funkcja „trzymaj się dołu” już nie działa.Krótko mówiąc, dodanie niewielkiej ilości Javascript (westchnień) naprawi to i spełni wszystkie wymagania:
Coś w stylu https://codepen.io/anon/pen/pdrLEZ this (przykład autorstwa Coo), a po dodaniu elementu do listy, również:
gdzie 29 to wysokość jednej linii.
Tak więc, gdy użytkownik przewinie w górę o pół linii (jeśli to w ogóle możliwe?), JavaScript zignoruje go i przewinie w dół. Ale wydaje mi się, że jest to nieistotne. I naprawia Chrome 1 px rzeczy.
źródło
Oto rozwiązanie oparte na poście na blogu autorstwa Ryana Hunta . Zależy to od
overflow-anchor
właściwości CSS, która przypina pozycję przewijania do elementu na dole przewijanej treści.Pamiętaj, że
overflow-anchor
obecnie nie działa w Safari ani Edge, więc to rozwiązanie nie działa obecnie we wszystkich przeglądarkach.źródło
Możesz użyć czegoś takiego,
źródło
Oto jak do tego podszedłem. Mój div ma wysokość 650px. Zdecydowałem, że jeśli wysokość przewijania mieści się w granicach 150 pikseli od dołu, to przewiń automatycznie. W przeciwnym razie pozostaw to użytkownikowi.
źródło