Mam stronę, na której pasek przewijania zawierający wiersze tabeli z elementami div w nich jest dynamicznie generowany z bazy danych. Każdy wiersz tabeli działa jak link, tak jak na liście odtwarzania YouTube obok odtwarzacza wideo.
Gdy użytkownik odwiedza stronę, opcja, na której jest włączony, powinna przejść na górę przewijanego elementu div. Ta funkcja działa. Problem w tym, że posuwa się on odrobinę za daleko. Na przykład opcja, w której są włączone, jest o około 10 pikseli za wysoka. Tak więc strona jest odwiedzana, adres URL jest używany do zidentyfikowania, która opcja została wybrana, a następnie przewija tę opcję na górę przewijanego elementu DIV. Uwaga: to nie jest pasek przewijania okna, jest to element div z paskiem przewijania.
Używam tego kodu, aby przenieść wybraną opcję na górę div:
var pathArray = window.location.pathname.split( '/' );
var el = document.getElementById(pathArray[5]);
el.scrollIntoView(true);
Przenosi go na górę elementu div, ale o około 10 pikseli za wysoko. Czy ktoś wie, jak to naprawić?
źródło
scrollIntoView
jest niepokojący.Odpowiedzi:
Jeśli jest to około 10 pikseli, to myślę, że możesz po prostu ręcznie dostosować
div
przesunięcie przewijania zawierającego w następujący sposób :źródło
scrollIntoView
?scrollIntoView
funkcja DOM nie powoduje animacji. Czy mówisz o wtyczce scrollIntoView jQuery?el.scrollIntoView({ behavior: 'smooth' });
. Wsparcie nie jest jednak świetne!Płynnie przewiń do odpowiedniej pozycji
Uzyskaj poprawne
y
współrzędne i użyjwindow.scrollTo({top: y, behavior: 'smooth'})
źródło
jQuery('#el').offset().top
a następnie użyćwindow.scrollTo
scroll={el => { const yCoordinate = el.getBoundingClientRect().top + window.pageYOffset; const yOffset = -80; window.scrollTo({ top: yCoordinate + yOffset, behavior: 'smooth' }); }}
- gdzie przesunięcie jest o 10-15 pikseli większe niż rozmiar nagłówka, tylko dla lepszego odstępuMożesz to zrobić w dwóch krokach:
źródło
scrollIntoView()
przewijanie nie zakończyło się przedscrollBy()
uruchomieniem, drugie przewijanie anuluje poprzednie. Przynajmniej na Chrome 71.scrollIntoView({adjustment:y})
myślę, że powinno być możliwe z niestandardowego kodu na końcuPozycja kotwicy metodą bezwzględną
Innym sposobem, aby to zrobić, jest umieszczenie kotwic dokładnie tam, gdzie chcesz, zamiast polegać na przewijaniu według przesunięcia. Uważam, że pozwala to na lepszą kontrolę dla każdego elementu (np. Jeśli chcesz mieć inne przesunięcie dla niektórych elementów), a także może być bardziej odporne na zmiany / różnice API przeglądarki.
Teraz przesunięcie jest określone jako -100px względem elementu. Utwórz funkcję, aby utworzyć tę kotwicę do ponownego wykorzystania kodu lub jeśli używasz nowoczesnego frameworka JS, takiego jak React, zrób to, tworząc komponent, który renderuje twoją kotwicę i przekaż nazwę kotwicy i wyrównanie dla każdego elementu, co może lub może nie być tym samym.
Następnie po prostu użyj:
Do płynnego przewijania z przesunięciem 100px.
źródło
Rozwiązałem ten problem używając,
To sprawia, że element pojawia się
center
po przewinięciu, więc nie muszę obliczaćyOffset
.Mam nadzieję, że to pomoże...
źródło
scrollTo
nie dalej,element
ale dalejwindow
To działa dla mnie w Chrome (z płynnym przewijaniem i bez hacków czasowych)
Po prostu przesuwa element, inicjuje przewijanie, a następnie przesuwa go z powrotem.
Nie ma widocznego „wyskakiwania”, jeśli element jest już na ekranie.
źródło
Opierając się na wcześniejszej odpowiedzi, robię to w projekcie Angular5.
Zaczął od:
Ale to powodowało pewne problemy i wymagało ustawienia Timeout dla scrollBy () w następujący sposób:
I działa doskonale w MSIE11 i Chrome 68+. Nie testowałem w FF. 500 ms to najkrótsze opóźnienie, na jakie chciałbym się zdecydować. Zejście niżej czasami kończyło się niepowodzeniem, ponieważ płynne przewijanie nie zostało jeszcze zakończone. Dostosuj zgodnie z wymaganiami dla własnego projektu.
+1 do Fred727 za to proste, ale skuteczne rozwiązanie.
źródło
Zakładając, że chcesz przewinąć do elementów div, które są na tym samym poziomie w DOM i mają nazwę klasy „scroll-with-offset”, ten CSS rozwiąże problem:
Przesunięcie od góry strony wynosi 100 pikseli. Będzie działać zgodnie z przeznaczeniem tylko z blokiem: 'start':
Dzieje się tak, że górny punkt elementów div znajduje się w normalnym miejscu, ale ich wewnętrzna zawartość zaczyna się 100 pikseli poniżej normalnej lokalizacji. Do tego służy padding-top: 100px. margin-bottom: -100px służy do wyrównania dodatkowego marginesu poniższego elementu div. Aby rozwiązanie było kompletne, dodaj również ten kod CSS, aby przesunąć marginesy / wypełnienia dla najwyższych i najniższych elementów div:
źródło
To rozwiązanie należy do @ Arseniy-II , właśnie uprościłem je do funkcji.
Użycie (możesz otworzyć konsolę tutaj w StackOverflow i przetestować ją):
źródło
Możesz także skorzystać z
element.scrollIntoView()
opcjiktóry większość przeglądarek wsparcie
źródło
Mam to i u mnie działa znakomicie:
Mam nadzieję, że to pomoże.
źródło
Innym rozwiązaniem jest użycie „offsetTop”, na przykład:
źródło
Być może jest to trochę niezgrabne, ale jak dotąd tak dobre. Pracuję w kątowym 9.
plik
.ts
plik
.html
Ustawiam przesunięcie za pomocą marginesu i wyściółki u góry.
Saludos!
źródło
Znalazłem rozwiązanie tymczasowe. Załóżmy, że chcesz przewinąć do elementu div, na przykład elementu tutaj, i chcesz mieć nad nim odstęp 20 pikseli. Ustaw odniesienie do utworzonego div powyżej:
<div ref={yourRef} style={{position: 'relative', bottom: 20}}/> <Element />
Spowoduje to utworzenie żądanych odstępów.
Jeśli masz nagłówek, utwórz pusty element div również za nagłówkiem, przypisz mu wysokość równą wysokości nagłówka i odnieś się do niego.
źródło
Moim głównym pomysłem jest utworzenie tempDiv nad widokiem, do którego chcemy przewinąć. Działa dobrze bez opóźnień w moim projekcie.
Przykład użycia
Mam nadzieję, że to pomoże
źródło
Opierając się na odpowiedzi Arseniy-II: miałem przypadek użycia, w którym przewijana jednostka nie była samym oknem, ale wewnętrznym szablonem (w tym przypadku div). W tym scenariuszu musimy ustawić identyfikator kontenera przewijanego i przekazać go
getElementById
do korzystania z funkcji przewijania:Zostawiając go tutaj na wypadek, gdyby ktoś znalazł się w podobnej sytuacji!
źródło
Oto moje 2 centy.
Miałem również problem z przewijaniem scrollIntoView nieco poza element, więc utworzyłem skrypt (natywny javascript), który dołącza element do miejsca docelowego, umieścił go nieco na górze za pomocą css i przewinął do tego. Po przewinięciu ponownie usuwam utworzone elementy.
HTML:
Plik Javascript:
CSS:
Mam nadzieję, że to pomoże każdemu!
źródło
Dodaję te wskazówki css dla tych, którzy nie rozwiązali tego problemu powyższymi rozwiązaniami:
źródło
UPD: Utworzyłem pakiet npm, który działa lepiej niż poniższe rozwiązanie i jest łatwiejszy w użyciu.
Moja funkcja smoothScroll
Wziąłem cudowne rozwiązanie Steve'a Bantona i napisałem funkcję, która sprawia, że jest wygodniejszy w użyciu. Byłoby łatwiejsze w użyciu,
window.scroll()
a nawetwindow.scrollBy()
, jak próbowałem wcześniej, ale te dwa mają pewne problemy:Oto kod
Po prostu skopiuj i zepsuć, jak chcesz.
Aby utworzyć element odsyłacza, wystarczy dodać następujący atrybut danych:
Możesz także ustawić inny atrybut jako dodatek
Reprezentuje
block
opcjęscrollIntoView()
funkcji. Domyślnie jest tostart
. Przeczytaj więcej na MDN .Wreszcie
Dostosuj funkcję smoothScroll do swoich potrzeb.
Na przykład, jeśli masz jakiś stały nagłówek (lub nazywam to słowem
masthead
), możesz zrobić coś takiego:Jeśli nie masz takiego przypadku, po prostu go usuń, dlaczego nie :-D.
źródło
Proste rozwiązanie do przewijania określonego elementu w dół
źródło
W przypadku elementu w wierszu tabeli użyj JQuery, aby uzyskać wiersz powyżej tego, który chcesz , i po prostu przewiń do tego wiersza.
Załóżmy, że mam wiele wierszy w tabeli, z których część powinna zostać sprawdzona przez administratora. Każdy wiersz wymagający recenzji ma zarówno strzałkę w górę, jak i w dół, która prowadzi do poprzedniego lub następnego elementu do przeglądu.
Oto kompletny przykład, który powinien zostać uruchomiony, jeśli utworzysz nowy dokument HTML w notatniku i zapiszesz go. Dostępny jest dodatkowy kod do wykrywania górnej i dolnej części naszych produktów do przeglądu, aby nie zgłaszać żadnych błędów.
źródło