Nauczymy się odtworzyć efekt ScrollIntoView używając bardziej obiektowego podejścia w JS pisząc klasy i zapewniając większą modularność naszego kodu, możliwość aktywowania efektu jedną linijką.
Oto nasz HTML, który zawiera dużo lorem ipsum (aby efekt był zauważalny), ma podpięty pusty plik JavaScript oraz korzysta z kotwic HTML, aby można było (w toporny sposób) przejść do elementów na stronie (automatycznie przescrollować):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Heading one</h1>
<h3>Table of contents:</h3>
<ul>
<li><a href="#heading-two">Heading Two</a></li>
<li><a href="#heading-three">Heading Three</a></li>
</ul>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<h2 id="heading-two">Heading two</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<h2 id="heading-three">Heading three</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere dolores facilis rerum adipisci beatae dolorum eveniet? Excepturi temporibus sit minima consectetur, dolore quod, beatae eum a earum fugiat quasi.</p>
<script src="./test4.js"></script>
</body>
</html>
Teraz dodajemy nasz efekt, robiliśmy to już kilka tutoriali temu, więc powinniśmy mniej-więcej rozumieć:
window.addEventListener('DOMContentLoaded', function(){
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
});
});
});
Możemy zmniejszyć sobie wysokość ekranu, aby jeszcze lepiej zauważyć ten efekt (albo wiecej lorem ipsum dodać). Ten kod jak widać łapie wszystkie elementy <a>, które są linkiem nie do zewnętrznej strony, ale kotwicy HTML na stronie.
Następnie dodawany jest listener, który blokuje domyślne działanie, pobiera kotwicę z atrybutu href i wykonuje na niej efekt scrollIntoView. Postaramy się teraz napisać to bardziej obiektowo, używając klas JavaScript.
Szkielet naszej klasy będzie wyglądał następująco:
class ScrollEffect {
constructor() {
}
addListenerToLink = (link) => {
}
addScrollEffect = (e) => {
}
}
const scrollEffect = new ScrollEffect();
W konstruktorze łapiemy nasze elementy i w pętli wrzucamy do funkcji addListenerToLink, która nadaje listener na evencie klik, którym jest trzecia funkcja. Poniżej klasy mamy kod, który efekt aktywuje – tę jedną linijkę musi napisać odbiorca naszego efektu, aby efekt aktywować, nie będąc zmuszonym do rozumienia, jak to wszystko działa.
Przerobienie konstruktora nie będzie trudne, o ile nie przeraża nas słówko kluczowe this czy pętla for…of (a nie powinno – w JS możemy nie rozumieć OOP, bo to tylko cukier składniowy, ale ogólne OOP rozumieć powinniśmy, bez tego dzisiaj się programować nie da):
constructor() {
const links = document.querySelectorAll('a[href^="#"]');
for (const link of links) {
this.addListenerToLink(link);
}
}
Konstruktor łapie wszystkie elementy, za pomocą pętli for…of przechodzi po nich w pętli i przy pomocy słówka kluczowego this odwołuje się do własnej metody addListenerToLink klasy ScrollEffect, która przejmuje pałeczkę (przekazujemy jej link):
addListenerToLink = (link) => {
link.addEventListener("click", this.addScrollEffect);
}
Teraz pora napisać funkcję obsługującą zdarzenie kliknięcia, która przyjmuje event. Zapobiegamy domyślnemu działaniu i robimy scrollIntoView. Wydaje się proste, ale w naszym nieobiektowym przykładzie pobieraliśmy href używając słówka kluczowego this, które teraz będzie wskazywać na klasę. Musimy zatem znaleźć inny sposób, aby pobrać adres kotwicy:
addScrollEffect = (e) => {
e.preventDefault();
console.log(e.target.getAttribute('href'));
}
Dzięki e.target mamy dostęp do elementu, który został kliknięty, choć this w tym wypadku wskazuje na klasę ScrollEffect. Teraz pora zrobić efekt, mając adres kotwicy:
addScrollEffect = (e) => {
e.preventDefault();
const anchor = e.target.getAttribute('href');
document.querySelector(anchor).scrollIntoView({
behavior: 'smooth'
});
}
Nasz użytkownik jedyne co musi zrobić, to napisać linijkę:
class ScrollEffect {
(...)
}
const scrollEffect = new ScrollEffect();
I już, automatycznie, wszystkie linki do kotwic mają ten efekt. Możemy pobawić się w importy/eksporty i stworzyć własną mini-biblioteczkę z łatwą do użycia fasadą, bez męczenia użytkownika technikaliami.