JavaScriptDOM i zdarzenia

Element.scrollIntoView()

Przewija stronę i przewijane kontenery tak, żeby element pojawił się na ekranie, skokiem albo płynnie.

Zwraca
undefined
Na tej stronie

Przykład

#
JavaScript
const messages = document.querySelector('#messages')

function addMessage(text) {
  const item = document.createElement('li')
  item.textContent = text
  messages.append(item)
  item.scrollIntoView({ behavior: 'smooth', block: 'end' })
  console.log('Nowa wiadomość:', text)
}

addMessage('Kuba: Skończyłem moduł 3!')
Wynik
Nowa wiadomość: Kuba: Skończyłem moduł 3!

Lista wiadomości przewija się płynnie, a nowy wpis pojawia się przy dolnej krawędzi. Ten przykład nie uruchamia się w podglądzie, bo scrollIntoView() przewinęłoby nie tylko ramkę z przykładem, ale też całą stronę dokumentacji.

Definicja i zastosowanie

#

Metoda scrollIntoView() przewija wszystkie przewijane obszary, w których leży element, tak żeby stał się widoczny. Przydaje się przy spisie treści, przejściu do pierwszego błędu w formularzu, pokazaniu nowej wiadomości w czacie albo zaznaczonej pozycji na długiej liście.

Bez argumentów element trafia do górnej krawędzi widocznego obszaru. Obiekt opcji pozwala to zmienić: block ustala położenie w pionie ("start", "center", "end" albo "nearest"), inline w poziomie, a behavior: "smooth" włącza płynne przewijanie zamiast skoku. Wartość "nearest" przewija tylko wtedy, gdy element jest poza ekranem, i tylko o tyle, ile trzeba.

Przewijane są wszystkie kontenery po drodze, łącznie z całym oknem, a w niektórych przeglądarkach nawet strona, która osadza dokument w ramce iframe. Jeśli element leży w liście z overflow: auto, przesunie się najpierw lista, a potem strona. Stały nagłówek (position: fixed lub sticky) może po przewinięciu zasłonić element. Rozwiązaniem jest właściwość CSS scroll-margin-top ustawiona na elemencie docelowym.

Składnia

#
Składnia
element.scrollIntoView()
element.scrollIntoView(alignToTop)
element.scrollIntoView(options)

Parametry

#
  • alignToTop

    opcjonalny, boolean

    true (domyślnie) wyrównuje element do górnej krawędzi, a false do dolnej. To starszy zapis, dziś częściej używa się obiektu opcji.
  • options

    opcjonalny obiekt

    behavior ("auto" lub "smooth") oraz block i inline ("start", "center", "end", "nearest"). Domyślnie block: "start" i inline: "nearest".

Więcej przykładów

#
Przewijanie listy po kliknięciu
JavaScript
const lessons = document.querySelector('#lessons')

for (let i = 1; i <= 12; i++) {
  const item = document.createElement('li')
  item.textContent = `Lekcja ${i}`
  if (i === 8) item.classList.add('current')
  lessons.append(item)
}

function show(item) {
  item.scrollIntoView({ behavior: 'smooth', block: 'nearest' })
  console.log('Przewinięto do:', item.textContent)
}

document.querySelector('#go-current').addEventListener('click', () => show(lessons.querySelector('.current')))
document.querySelector('#go-last').addEventListener('click', () => show(lessons.lastElementChild))

console.log('Lekcji na liście:', lessons.children.length)
Konsola
Lekcji na liście: 12

Kliknij przyciski w podglądzie. Lista przewinie się płynnie do wybranej lekcji, a w konsoli pojawi się jej nazwa. Dzięki block: "nearest" przesuwa się tylko lista, o tyle, ile trzeba, żeby lekcja była widoczna.

Spis treści ze stałym nagłówkiem
JavaScript
document.querySelector('#toc').addEventListener('click', (event) => {
  const link = event.target.closest('a[href^="#"]')
  if (!link) return

  event.preventDefault()
  document.querySelector(link.hash).scrollIntoView({ behavior: 'smooth' })
  history.replaceState(null, '', link.hash)
})

Jeśli strona ma stały nagłówek o wysokości 64 px, dodaj w CSS regułę h2 { scroll-margin-top: 80px }. Przewinięta sekcja zatrzyma się wtedy pod nagłówkiem, zamiast chować się za nim.

Obsługa przeglądarek

#

Szeroko dostępne

Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.

  • Chrome
  • Edge
  • Firefox
  • Safari

Dobre praktyki

#
  • Przy przewijaniu list wybieraj block: "nearest". Element, który już jest widoczny, zostanie na miejscu, a strona nie będzie skakać bez potrzeby.
  • Jeśli stały nagłówek zasłania element po przewinięciu, ustaw na elemencie docelowym scroll-margin-top o wysokości nagłówka.
  • Szanuj ustawienia dostępności: gdy użytkownik włączył ograniczenie animacji (prefers-reduced-motion), używaj behavior: "auto" zamiast "smooth".

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.