Autor | Zpráva | ||
---|---|---|---|
hypot Profil |
#1 · Zasláno: 23. 6. 2017, 16:05:07
Narazil jsem na stránku Vertical sliding slideshow using a little javascript, která má přechod mezi jednotlivými částmi (každá o výšce jedné obrazovky a s odlišným pozadím) plynulým odrolováním po stisknutí tlačítka. To plynulé odrolování je tam zajištěno tímto kódem:
selected=0; $('.scroll').click(function(event){ event.preventDefault(); distance = $('.curtain').height(); // .curtain = třída obrazových pozadí o výšce jedné obrazovky selected = $(this).attr('href').substr(2); scrolldistance = distance*selected; $('html, body').animate({scrollTop: scrolldistance}, 500); }); <div id="c0" class="curtain"><h1 class="title">Palma Street Artist</h1><a class="scrolldown scroll" href="#c1"></a><a class="scrollup scroll" href="#c6"></a></div> .)
Já bych chtěl stejné funkčnosti dosáhnout v čistém javascriptu a při hledání, jak takovou animaci udělat, jsem našel toto: Smooth scroll anchor links WITHOUT jQuery. Podle tohoto vzoru jsem pro výše uvedenou stránku vytvořil tento kód: var selected=0; var scrolls = document.querySelectorAll(".scroll"); for (var n=0; n<scrolls.length; n++) { scrolls[n].addEventListener("click", function(event) { event.preventDefault(); var distance = document.querySelector('.curtain').clientHeight; selected = this.getAttribute('href').substr(2); var scrolldistance = distance*selected; var start = new Date().getTime(); var interval = setInterval(function() { var step = (new Date().getTime() - start) / 500; if (step == 1) clearInterval(interval); document.documentElement.scrollTop = scrolldistance*step; document.body.scrollTop = scrolldistance*step; }, 25); }); } step >= 0.99 , jakž takž to funguje), ale nevím proč.
|
||
weroro Profil |
#2 · Zasláno: 24. 6. 2017, 23:22:58
hypot:
Chamurappi pred 5 rokmi napísal tento script Jak udělat pomalý scrolling k ID a do dnes ho používam. |
||
pcmanik Profil |
#3 · Zasláno: 24. 6. 2017, 23:47:09
hypot:
Dnes už by bolo fajn využívať moderné metódy JS - requestAnimationFrame. Príklad máš napríklad tu. |
||
hypot Profil |
No dobře, díky za tipy, ale stejně by mě zajímalo, kde je problém v tom skriptu, který jsem vložil výše.
(Abych to rozvedl: V tom skriptu je nastaven interval 25 milisekund, po jehož uplynutí prohlížeč má posunout stránku o určitý počet pixelů (na mém monitoru to dělá 48 pixelů v každém kroku); celkový čas animace je 500 milisekund, což znamená 20 kroků, ale hlavně 500 je beze zbytku dělitelných 25, takže po 20 krocích by proměnná step měla mít hodnotu přesně 1, takže by se animace měla zastavit - a tehdy by měla být zároveň stránka odrolovaná právě o hodnotu v proměnné distance, čili o výšku jedné obrazovky. Čili čísla vypadají v pořádku, ale praxe tomu bohužel neodpovídá.)
|
||
Keeehi Profil |
#5 · Zasláno: 26. 6. 2017, 11:14:52
No problém je třeba v tom, že časovač není přesný. Odkaz Občas se spustí za 25 milisekund, občas za 26. Co by tomu mohlo pomoct je mít podmínku
step <= 1 . Ale mnohem lepší by bylo si počet kroků prostě počítat inkrementací proměnné o jedna a ne se to snažit vypočítat z uběhlého času.
|
||
weroro Profil |
#6 · Zasláno: 26. 6. 2017, 18:51:33
hypot:
Živá ukázka |
||
Časová prodleva: 6 let
|
0