Autor Zpráva
hypot
Profil
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);
});
(Každý oddíl stránky má kód např.:
<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);
});
}
Jenže výsledek není, jak by měl být. Po stisku tlačítka (šipky) se sice spustí plynulé rolování, jenže se nezastaví po jedné výšce obrazovky, nýbrž pokračuje až do konce stránky (to pokud jde o pohyb dolů, pohyb nahoru nefunguje vůbec). Někde jsem tedy udělal chybu nebo na něco zapomněl, ale ať na to koukám, jak na to koukám, na nic nedokážu přijít. Teda, on asi bude zakopaný pes v té podmínce (když dám třeba step >= 0.99, jakž takž to funguje), ale nevím proč.
weroro
Profil
hypot:
Chamurappi pred 5 rokmi napísal tento script Jak udělat pomalý scrolling k ID a do dnes ho používam.
pcmanik
Profil
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
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
hypot:
Živá ukázka

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0