Nauczymy się robić kotwice do elementów na stronie WWW przy pomocy tagu <a> oraz odpowiedniego ID, następnie zajmiemy się bardziej płynnym scrollowaniem z poziomu JavaScript, wykorzystując funkcje scrollTo oraz scrollIntoView.
Nasza templata – dużo lorem ipsum
Zakładam, że wiemy, co to lorem ipsum i jaki jest jego cel. Oto nasza templatka pliku html:
<!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</a></li>
<li><a href="">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>
<button id="upBtn">Go to up!</button>
</body>
</html>
Mamy <h1>, potem spis treści (<ul> zawierający <li> oraz <a>), następnie 2 tagi <h2> z własnym id oraz dużo „lorem ipsum” pomiędzy nimi. Mamy też na samym dole <button>, który ma nam przewijać na samą górę.
Templatkę kopiujemy do jakiegoś pliku html. Następnie doklejamy jeszcze skrypty przed zamknięciem tagu body:
<script>
window.addEventListener("DOMContentLoaded", function(){
console.log("DOM fully loaded");
});
</script>
</body>
</html>
Jesteśmy gotowi.
Kotwice HTML – stare podejście
Zabierzmy się za nasze kotwice. Zauważmy, że nasze nagłówki <h2> posiadają swoje id:
<h2 id="heading-two">Heading two</h2>
(...)
<h2 id="heading-three">Heading three</h2>
Nasz spis treści natomiast posiada pusty atrybut href:
<ul>
<li><a href="">Heading Two</a></li>
<li><a href="">Heading Three</a></li>
</ul>
Pusty atrybut href można osiągnąć też tak:
<ul>
<li><a href="#">Heading Two</a></li>
<li><a href="#">Heading Three</a></li>
</ul>
Takie linki nigdzie nas nie przenoszą. Natomiast mogą przenieść nas na jakieś miejsce na stronie. Wystarczy po haszu podać prawidłowe ID:
<ul>
<li><a href="#heading-two">Heading Two</a></li>
<li><a href="#heading-three">Heading Three</a></li>
</ul>
Teraz będziemy mieli nagły „przeskok” do konkretnego miejsca. Jeżeli wygląda on dobrze, to znaczy, że mamy za mało lorem ipsum. Dajmy więcej a zobaczymy, jak bardzo źle takie przeskoki wyglądają (ale działa).
Zajmiemy się tym w następnej sekcji.
Funkcja scrollIntoView, smooth scrolling – nowe podejście
Nadajmy ID jednemu z naszych linków:
<li><a href="#heading-three" id="a-heading-three">Heading Three</a></li>
Teraz złapmy go w JavaScript:
<script>
window.addEventListener("DOMContentLoaded", function(){
let anchorHeadingThree = document.querySelector("#a-heading-three");
});
</script>
Dodajemy na 'click’ event listenera, który przyjmuje event i zapobiega domyślnemu działaniu (jakim jest natychmiastowe przejście do tamtego elementu):
let anchorHeadingThree = document.querySelector("#a-heading-three");
anchorHeadingThree.addEventListener('click', function(e){
e.preventDefault();
});
Teraz po wciśnięciu (drugiego) linku nic się nie stanie. Możemy teraz wylogować wartość atrybutu href:
let anchorHeadingThree = document.querySelector("#a-heading-three");
anchorHeadingThree.addEventListener('click', function(e){
e.preventDefault();
console.log(this.getAttribute('href'));
});
Dostajemy:
#heading-three
Mamy zatem selektor elementu, do którego chcemy scrollować. Teraz wystarczy użyć funkcji scrollIntoView
let anchorHeadingThree = document.querySelector("#a-heading-three");
anchorHeadingThree.addEventListener('click', function(e){
e.preventDefault();
let selector = this.getAttribute('href');
document.querySelector(selector).scrollIntoView({ behavior: "smooth"});
});
Mamy teraz płynne przejście.
Płynne przejście na wszystkich linkach kotwicowych – skrypt
Jeżeli chcemy automatycznie nadać takie zachowanie wszystkim elementom <a> będącym linkiem do kotwicy na naszej stronie, przyda nam się taki skrypt:
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'
});
});
});
});
Tutaj bierzemy wszystkie elementy <a>, których href zaczyna się od znaku „#” (linki kotwicowe). Przechodzimy po nich pętlą forEach. Każdemu nadajemy event-listener, który usuwa domyślne zachowanie po kliknięciu, zamiast tego wyszukuje element z ich atrybutu href i płynnie scrolluje do tego elementu.
Scroll do góry strony – funkcja scrollTo
Mamy jeszcze nasz guzik:
<button id="upBtn">Go to up!</button>
Łapiemy go w naszym skrypcie:
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'
});
});
});
let upBtn = document.querySelector("#upBtn");
});
Dodajemy eventListener:
upBtn.addEventListener('click', function(){
scrollTo({
top: 0,
left: 0,
behavior: "smooth",
});
});
I to wszystko. Po wciśnięciu płynnie scrolluje do samej góry strony.