JavaScript entre navegadores (não jQuery…) role para o topo da animação

222

Estou procurando por uma animação simples de "rolagem para cima", que possa ser aplicada em um navegador. Eu não quero exigir uma biblioteca JS como jQuery / Moo, etc.

// jQuery Equivilant to convert to pure JS...
$('html, body').animate({scrollTop:0}, 400);

Sou um caso perfeito para alguém que deveria ter aprendido JS 100% antes de entrar em uma biblioteca. :(

Heather Hins
fonte
78
+1 por não querer usar o jQuery, com um motivo válido :) Para obter inspiração, você pode dar uma olhada no código fonte dessas bibliotecas, por exemplo, jquery-1.7.1.js .
Rob W
10
@seand JavaScript não é jQuery, mas jQuery é JavaScript. Se alguém (como o OP) deseja aprender JavaScript, ele não deve tocar em nenhuma biblioteca inchada, a menos que tenha a idéia de como escrever o mesmo código em JavaScript.
Rob W
3
O @RobW usando uma biblioteca como o jQuery ajuda a abstrair as diferenças entre navegadores, então eu consideraria isso crucial para o desenvolvimento da web; você não precisa saber essas diferenças se existe um perfeitamente boa implementação e está disponível gratuitamente
seand
6
@seand e é assim que produzimos codificadores de baixa qualidade. Eles não entendem o idioma, mas podem gerar quantidades ilimitadas de código jQuery, porque sabem disso. Isso leva a hacks, como armazenar tudo no DOM (porque às vezes eles nem sabem o que é variável, exceto var something = $(...)), recriando um zilhão de objetos em todas as funções (eles conhecem variáveis, mas não sabem disso var veryBigObject = {...}com poucas centenas de propriedades em o topo da função vai assassinar o desempenho). E muitas vezes eles nem sabem que o nome do idioma é Javascript, não jQuery.
Killah

Respostas:

139
function scrollTo(element, to, duration) {
    if (duration <= 0) return;
    var difference = to - element.scrollTop;
    var perTick = difference / duration * 10;

    setTimeout(function() {
        element.scrollTop = element.scrollTop + perTick;
        if (element.scrollTop === to) return;
        scrollTo(element, to, duration - 10);
    }, 10);
}

Demo:

function runScroll() {
  scrollTo(document.body, 0, 600);
}
var scrollme;
scrollme = document.querySelector("#scrollme");
scrollme.addEventListener("click",runScroll,false)

function scrollTo(element, to, duration) {
  if (duration <= 0) return;
  var difference = to - element.scrollTop;
  var perTick = difference / duration * 10;

  setTimeout(function() {
    element.scrollTop = element.scrollTop + perTick;
    if (element.scrollTop == to) return;
    scrollTo(element, to, duration - 10);
  }, 10);
}
<p>Very long page.Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.  Very long page.Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.  Very long page.Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.  Very long page.Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.  Very long page.Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
</p>
<button id=scrollme type="button">To the top</button>

TimWolla
fonte
11
document.documentElementem vez de document.body(a menos que você defina CSS:) body{height:100%;}. Demonstração de trabalho usando este conceito: jsfiddle.net/S5ALP/1
Rob W
7
@RobW Sua adição não funciona aqui no Google Chrome @ Ubuntu Linux
TimWolla
2
isso acontece no Firefox 9.0, Ubuntu também :). Seu código falhou no Firefox, mas funcionou no Chrome, meu código falhou no Chrome, mas funcionou no FF.
Rob W
2
Isso deve serif (duration <= 0) return;
Jon Koops
4
Modificá-lo para usar em top.window.scroll(0, value)vez de element.scrollTop = valuefazê-lo funcionar no Chrome e Firefox (Ubuntu). :)
Shomz
113

Parece que já existem muitas soluções. de qualquer maneira, aqui está outra, usa equações de flexibilização ..

// first add raf shim
// http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
window.requestAnimFrame = (function(){
  return  window.requestAnimationFrame       ||
          window.webkitRequestAnimationFrame ||
          window.mozRequestAnimationFrame    ||
          function( callback ){
            window.setTimeout(callback, 1000 / 60);
          };
})();

// main function
function scrollToY(scrollTargetY, speed, easing) {
    // scrollTargetY: the target scrollY property of the window
    // speed: time in pixels per second
    // easing: easing equation to use

    var scrollY = window.scrollY || document.documentElement.scrollTop,
        scrollTargetY = scrollTargetY || 0,
        speed = speed || 2000,
        easing = easing || 'easeOutSine',
        currentTime = 0;

    // min time .1, max time .8 seconds
    var time = Math.max(.1, Math.min(Math.abs(scrollY - scrollTargetY) / speed, .8));

    // easing equations from https://github.com/danro/easing-js/blob/master/easing.js
    var easingEquations = {
            easeOutSine: function (pos) {
                return Math.sin(pos * (Math.PI / 2));
            },
            easeInOutSine: function (pos) {
                return (-0.5 * (Math.cos(Math.PI * pos) - 1));
            },
            easeInOutQuint: function (pos) {
                if ((pos /= 0.5) < 1) {
                    return 0.5 * Math.pow(pos, 5);
                }
                return 0.5 * (Math.pow((pos - 2), 5) + 2);
            }
        };

    // add animation loop
    function tick() {
        currentTime += 1 / 60;

        var p = currentTime / time;
        var t = easingEquations[easing](p);

        if (p < 1) {
            requestAnimFrame(tick);

            window.scrollTo(0, scrollY + ((scrollTargetY - scrollY) * t));
        } else {
            console.log('scroll done');
            window.scrollTo(0, scrollTargetY);
        }
    }

    // call it once to get started
    tick();
}

// scroll it!
scrollToY(0, 1500, 'easeInOutQuint');
shunryu111
fonte
10
Ainda bem que alguém está usandorequestAnimationFrame
Lucas
4
Deve ser votado e selecionado como resposta. Este é o único que funciona em vários navegadores
wlingke
requestAnimationFramenão é compatível com todos os navegadores, especialmente alguns celulares, por isso não é uma solução dinâmica, consulte: developer.mozilla.org/en-US/docs/Web/API/window/…
SUB-HDR
1
@ SUB-HDR no topo do trecho há um calço de requestAnimationFrameque devem cuidar de qualquer incompatibilidade navegador
shunryu111
As animações tornam-se muito laggy quando uma página tem uma seção com um monte de imagens no Firefox stackoverflow.com/questions/56396100/...
user3476614
79
window.scroll({top: 0, left: 0, behavior: 'smooth' });

Comprei em um artigo sobre Rolagem suave .

Se necessário, existem alguns polyfills disponíveis.

Mihai Răducanu
fonte
4
Quase com o voto negativo porque achei que essa era uma solução jQuery. Esse artigo é categorizado de maneira confusa! Além disso, gostaria de salientar que scrollIntoView({behavior: 'smooth'})existe também e pode fazer o que as pessoas precisam para esse tipo de problema.
Brendan
1
Isso gera um erro no Chrome mais recenteUncaught TypeError: Failed to execute 'scroll' on 'Window': No function was found that matched the signature provided.
rorymorris89
1
O @Sgnl pode confirmar que agora está corrigido. Boas atualizações antigas do Chrome quebrando coisas :)
rorymorris89
4
Eu não sei por que isso não tem mais votos, um simples scroll até o topo sem 100000 linhas de código! Obrigado!
Smokey Dawson
4
Esta resposta deve ser marcada como a aceita. Uma abordagem integrada sem o uso de funções de transição personalizadas, por que não !? Obrigado!
Sagar
70

Modifiquei a resposta do TimWolla para usar a flexão quadrática de entrada e saída (um pouco mais suave :). Aqui está um exemplo em ação: no jsFiddle . As funções de atenuação estão disponíveis aqui: Funções de atenuação de Robert Penner

document.getElementsByTagName('button')[0].onclick = function () {
    scrollTo(document.body, 0, 1250);   
}

function scrollTo(element, to, duration) {
    var start = element.scrollTop,
        change = to - start,
        increment = 20;

    var animateScroll = function(elapsedTime) {        
        elapsedTime += increment;
        var position = easeInOut(elapsedTime, start, change, duration);                        
        element.scrollTop = position; 
        if (elapsedTime < duration) {
            setTimeout(function() {
                animateScroll(elapsedTime);
            }, increment);
        }
    };

    animateScroll(0);
}

function easeInOut(currentTime, start, change, duration) {
    currentTime /= duration / 2;
    if (currentTime < 1) {
        return change / 2 * currentTime * currentTime + start;
    }
    currentTime -= 1;
    return -change / 2 * (currentTime * (currentTime - 2) - 1) + start;
}
akai
fonte
5
Seu código não funciona no firefox. Existe solução para isso?
Milos
2
@Milos Basta usar "scrollTo (document.documentElement, 0, 1250);" em vez de "scrollTo (document.body, 0, 1250);" e deve funcionar tanto no Firefox quanto no Chrome.
Daniel
Por que você está usando matemática? Sem matemática que está trabalhando demonstração
bCliks
2
@Daniel document. documentElementnão funciona no Chrome.
swade 14/07/16
@bCliks, é um método de aliviar
Clayton Graul
27

Sem o código JQuery, espero que isso ajude você.

function TopscrollTo() {
if(window.scrollY!=0)
{
    setTimeout(function() {
       window.scrollTo(0,window.scrollY-30);
        TopscrollTo();
    }, 100);
   }
}

chame essa função TopscrollTo () no evento de clique no botão ou em qualquer outro elemento / evento que você desejar.

Vishal Patel
fonte
19

Modifiquei o código do @TimWolla para adicionar mais opções e algumas funções de movimento. Além disso, foi adicionado suporte ao navegador cruzado com document.body.scrollTop e document.documentElement.scrollTop

// scroll to top
scrollTo(0, 1000);

// Element to move, time in ms to animate
function scrollTo(element, duration) {
    var e = document.documentElement;
    if(e.scrollTop===0){
        var t = e.scrollTop;
        ++e.scrollTop;
        e = t+1===e.scrollTop--?e:document.body;
    }
    scrollToC(e, e.scrollTop, element, duration);
}

// Element to move, element or px from, element or px to, time in ms to animate
function scrollToC(element, from, to, duration) {
    if (duration <= 0) return;
    if(typeof from === "object")from=from.offsetTop;
    if(typeof to === "object")to=to.offsetTop;

    scrollToX(element, from, to, 0, 1/duration, 20, easeOutCuaic);
}

function scrollToX(element, xFrom, xTo, t01, speed, step, motion) {
    if (t01 < 0 || t01 > 1 || speed<= 0) {
        element.scrollTop = xTo;
        return;
    }
    element.scrollTop = xFrom - (xFrom - xTo) * motion(t01);
    t01 += speed * step;

    setTimeout(function() {
        scrollToX(element, xFrom, xTo, t01, speed, step, motion);
    }, step);
}
function easeOutCuaic(t){
    t--;
    return t*t*t+1;
}

http://jsfiddle.net/forestrf/tPQSv/

Versão reduzida: http://jsfiddle.net/forestrf/tPQSv/139/

// c = element to scroll to or top position in pixels
// e = duration of the scroll in ms, time scrolling
// d = (optative) ease function. Default easeOutCuaic
function scrollTo(c,e,d){d||(d=easeOutCuaic);var a=document.documentElement;if(0===a.scrollTop){var b=a.scrollTop;++a.scrollTop;a=b+1===a.scrollTop--?a:document.body}b=a.scrollTop;0>=e||("object"===typeof b&&(b=b.offsetTop),"object"===typeof c&&(c=c.offsetTop),function(a,b,c,f,d,e,h){function g(){0>f||1<f||0>=d?a.scrollTop=c:(a.scrollTop=b-(b-c)*h(f),f+=d*e,setTimeout(g,e))}g()}(a,b,c,0,1/e,20,d))};
function easeOutCuaic(t){
    t--;
    return t*t*t+1;
}
Forestrf
fonte
E qual é o sentido de fazer 1 / durationquando você chama o scrollToX pela primeira vez?
Jessica
t01 é um tempo incrementado de 0 a 1. Se atingir 1, a agulha termina. Eu fiz isso há 2 anos, não me lembro de tudo, desculpe.
Forestrf 7/09/16
11

Na verdade, existe uma maneira pura de javascript para fazer isso sem usar setTimeoutou requestAnimationFrameou o jQuery.

Em resumo, encontre o elemento no scrollView para o qual você deseja rolar e use scrollIntoView

el.scrollIntoView({behavior:"smooth"});

Aqui está um plunkr .

Jon
fonte
Melhor resposta: uma linha de código, o mais curto e eficaz;)
Jacopo Pace
1
Observe que a aprovação scrollIntoViewOptionnão tem suporte entre navegadores. developer.mozilla.org/pt-BR/docs/Web/API/Element/scrollIntoView
WebWanderer
9

Adaptado desta resposta :

function scroll(y, duration) {

    var initialY = document.documentElement.scrollTop || document.body.scrollTop;
    var baseY = (initialY + y) * 0.5;
    var difference = initialY - baseY;
    var startTime = performance.now();

    function step() {
        var normalizedTime = (performance.now() - startTime) / duration;
        if (normalizedTime > 1) normalizedTime = 1;

        window.scrollTo(0, baseY + difference * Math.cos(normalizedTime * Math.PI));
        if (normalizedTime < 1) window.requestAnimationFrame(step);
    }
    window.requestAnimationFrame(step);
}

Isso deve permitir que você role suavemente (função cosseno) de qualquer lugar até o "y" especificado.

Raslanove
fonte
9

Ninguém mencionou a propriedade CSS scroll-behavior

CSS

html {
  scroll-behavior: smooth;
}

JS

window.scrollTo(0,0)
fangxing
fonte
Isso funciona incrível! Não é suportado em todos os navegadores, mas tudo bem, pois ele se recupera bem.
Swimburger 19/08/19
Jesus, onde está essa vida toda?
Mitya 26/02
8

CLASSE DE ROLO DE JAVASCRIPT PURO

Essa é uma pergunta antiga, mas achei que poderia responder com algumas coisas sofisticadas e mais algumas opções para brincar, se você quiser ter um pouco mais de controle sobre a animação.

  • Cross-browser
  • Solução pronta para copiar / colar (você só precisa de CSS e JS)
  • 3 modos de animação: ["normal" | "linear" | false]
  • Personalize sua animação com as configurações disponíveis - torne-a ágil ou fluente
  • Clique duas vezes para pular a animação
  • Cada próximo clique adiciona velocidade inicial
  • Pare a animação de rolagem arrastando a barra de rolagem para baixo
  • Pare a animação de rolagem girando o mouse para baixo
  • Fade-in-out de botão animado na rolagem
  • Aqui está uma classe JS pura para cuidar da rolagem para você:

    VEJA A DEMO NO CODEPEN OU VÁ AO FUNDO E EXECUTE O SINPET

    // ------------------- USE EXAMPLE ---------------------
    // *Set options
    var options = {
      'showButtonAfter': 200, // show button after scroling down this amount of px
      'animate': "linear", // [false|normal|linear] - for false no aditional settings are needed
    
      'normal': { // applys only if [animate: normal] - set scroll loop distanceLeft/steps|ms
        'steps': 20, // the more steps per loop the slower animation gets
        'ms': 10 // the less ms the quicker your animation gets
      }, 
      'linear': { // applys only if [animate: linear] - set scroll px|ms
        'px': 30, // the more px the quicker your animation gets
        'ms': 10 // the less ms the quicker your animation gets
      }, 
    };
    
    
    // *Create new Scroller and run it.
    var scroll = new Scroller(options);
    scroll.init();

    SCRIPT DE CLASSE COMPLETA + EXEMPLO DE USO:

    // PURE JAVASCRIPT (OOP)
    
    function Scroller(options) {
      this.options = options;
      this.button = null;
      this.stop = false;
    }
    
    Scroller.prototype.constructor = Scroller;
    
    Scroller.prototype.createButton = function() {
    
      this.button = document.createElement('button');
      this.button.classList.add('scroll-button');
      this.button.classList.add('scroll-button--hidden');
      this.button.textContent = "^";
      document.body.appendChild(this.button);
    }
    
    Scroller.prototype.init = function() {
      this.createButton();
      this.checkPosition();
      this.click();
      this.stopListener();
    }
    
    Scroller.prototype.scroll = function() {
      if (this.options.animate == false || this.options.animate == "false") {
        this.scrollNoAnimate();
        return;
      }
      if (this.options.animate == "normal") {
        this.scrollAnimate();
        return;
      }
      if (this.options.animate == "linear") {
        this.scrollAnimateLinear();
        return;
      }
    }
    Scroller.prototype.scrollNoAnimate = function() {
      document.body.scrollTop = 0;
      document.documentElement.scrollTop = 0;
    }
    Scroller.prototype.scrollAnimate = function() {
      if (this.scrollTop() > 0 && this.stop == false) {
        setTimeout(function() {
          this.scrollAnimate();
          window.scrollBy(0, (-Math.abs(this.scrollTop()) / this.options.normal['steps']));
        }.bind(this), (this.options.normal['ms']));
      }
    }
    Scroller.prototype.scrollAnimateLinear = function() {
      if (this.scrollTop() > 0 && this.stop == false) {
        setTimeout(function() {
          this.scrollAnimateLinear();
          window.scrollBy(0, -Math.abs(this.options.linear['px']));
        }.bind(this), this.options.linear['ms']);
      }
    }
    
    Scroller.prototype.click = function() {
    
      this.button.addEventListener("click", function(e) {
        e.stopPropagation();
        this.scroll();
      }.bind(this), false);
    
      this.button.addEventListener("dblclick", function(e) {
        e.stopPropagation();
        this.scrollNoAnimate();
      }.bind(this), false);
    
    }
    
    Scroller.prototype.hide = function() {
      this.button.classList.add("scroll-button--hidden");
    }
    
    Scroller.prototype.show = function() {
      this.button.classList.remove("scroll-button--hidden");
    }
    
    Scroller.prototype.checkPosition = function() {
      window.addEventListener("scroll", function(e) {
        if (this.scrollTop() > this.options.showButtonAfter) {
          this.show();
        } else {
          this.hide();
        }
      }.bind(this), false);
    }
    
    Scroller.prototype.stopListener = function() {
    
      // stop animation on slider drag
      var position = this.scrollTop();
      window.addEventListener("scroll", function(e) {
        if (this.scrollTop() > position) {
          this.stopTimeout(200);
        } else {
          //...
        }
        position = this.scrollTop();
      }.bind(this, position), false);
    
      // stop animation on wheel scroll down
      window.addEventListener("wheel", function(e) {
        if (e.deltaY > 0) this.stopTimeout(200);
      }.bind(this), false);
    }
    
    Scroller.prototype.stopTimeout = function(ms) {
      this.stop = true;
      // console.log(this.stop); //
      setTimeout(function() {
        this.stop = false;
        console.log(this.stop); //
      }.bind(this), ms);
    }
    
    Scroller.prototype.scrollTop = function() {
      var curentScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
      return curentScrollTop;
    }
    
    
    
    // ------------------- USE EXAMPLE ---------------------
    // *Set options
    var options = {
      'showButtonAfter': 200, // show button after scroling down this amount of px
      'animate': "normal", // [false|normal|linear] - for false no aditional settings are needed
    
      'normal': { // applys only if [animate: normal] - set scroll loop distanceLeft/steps|ms
        'steps': 20, // the more steps per loop the slower animation gets
        'ms': 10 // the less ms the quicker your animation gets
      },
      'linear': { // applys only if [animate: linear] - set scroll px|ms
        'px': 30, // the more px the quicker your animation gets
        'ms': 10 // the less ms the quicker your animation gets
      },
    };
    // *Create new Scroller and run it.
    var scroll = new Scroller(options);
    scroll.init();
    /* CSS */
    
    @import url(https://fonts.googleapis.com/css?family=Open+Sans);
     body {
      font-family: 'Open Sans', sans-serif;
      font-size: 1.2rem;
      line-height: 2rem;
      height: 100%;
      position: relative;
      padding: 0 25%;
    }
    .scroll-button {
      font-size: 1.2rem;
      line-height: 2rem;
      padding: 10px;
      width: 50px;
      height: 50px;
      background: black;
      color: white;
      border-radius: 50%;
      position: fixed;
      right: 20px;
      bottom: 20px;
      visibility: visible;
      filter: alpha(opacity=50);
      filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=50);
      opacity: 0.5;
      cursor: pointer;
      transition: all 1.2s;
      -webkit-transition: all 1.2s;
      -moz-transition: all 1.2s;
      -ms-transition: all 1.2s;
      -o-transition: all 1.2s;
    }
    .scroll-button:hover {
      filter: alpha(opacity=100);
      filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=100);
      opacity: 1;
    }
    .scroll-button--hidden {
      filter: alpha(opacity=0);
      filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=0);
      opacity: 0;
      visibility: hidden;
    }
    <!-- HTML -->
    
    <h1>Scroll down by 200px for button to appear</h1>
    <ul>
      <li>Cross-browser</li>
      <li>Copy/Paste solution</li>
      <li>3 animate modes: <b>["normal"|"linear"|false]</b></li>
      <li>Customize your aniamtion with aveilable settings - make it snapy or fluent</li>
      <li>Double click to skip animation</li>
      <li>Every next single click adds initial speed</li>
      <li>Stop scroll animation by draging down the scroll bar</li>
      <li>Stop scroll animation by mouse wheel down</li>
      <li>Animated button fade-in-out on scroll</li>
    </ul>
    
    <br />
    <br />
    <pre>
    // ------------------- USE EXAMPLE ---------------------
    // *Set options
    var options = {
      'showButtonAfter': 200, // show button after scroling down this amount of px
      'animate': "normal", // [false|normal|linear] - for false no aditional settings are needed
      
      'normal': { // applys only if [animate: normal] - set scroll loop distanceLeft/steps|ms
        'steps': 20, // the more steps the slower animation gets
        'ms': 20 // the less ms the quicker your animation gets
      }, 
      'linear': { // applys only if [animate: linear] - set scroll px|ms
        'px': 55, // the more px the quicker your animation gets
        'ms': 10 // the less ms the quicker your animation gets
      }, 
    };
    
    // *Create new Scroller and run it.
    var scroll = new Scroller(options);
    scroll.init();
    </pre>
    <br />
    <br />
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae molestiae illo nobis quo autem molestias voluptatum quam, amet ipsum debitis, iure animi illum soluta eaque qui perspiciatis harum, sequi nesciunt.</span><span>Quisquam nesciunt aspernatur a possimus pariatur enim architecto. Hic aperiam sit repellat doloremque vel est soluta et assumenda dolore, sint sapiente porro, quam impedit. Sint praesentium quas excepturi, voluptatem dicta!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptate, porro nisi molestias minima corrupti tempore, dolorum fugiat ipsam dicta doloremque accusamus atque consequatur iusto natus, mollitia distinctio odit dolor tempora.</span><span>Perferendis a in laudantium accusantium, dolorum eius placeat velit porro similique, eum cumque veniam neque aspernatur architecto suscipit rem laboriosam voluptates laborum? Voluptates tempora necessitatibus animi nostrum quod, maxime odio.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nihil accusantium, itaque corporis repellat pariatur soluta officia perspiciatis in reprehenderit facere, incidunt saepe excepturi. Inventore atque ex illo, ipsam at deserunt.</span><span>Laborum inventore officia, perspiciatis cumque magni consequatur iste accusantium soluta, nesciunt blanditiis voluptatibus adipisci laudantium mollitia minus quia necessitatibus voluptates. Minima unde quos impedit necessitatibus aspernatur minus maiores ipsa eligendi!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptate nesciunt, explicabo similique, quo maxime modi, aliquid, voluptatibus repellendus dolorum placeat mollitia ea dicta quia laboriosam alias dignissimos ipsam tenetur. Nulla.</span><span>Vel maiores necessitatibus odio voluptate debitis, error in accusamus nulla, eum, nemo et ea commodi. Autem numquam at, consequatur temporibus. Mollitia placeat nobis blanditiis impedit distinctio! Ad, incidunt fugiat sed.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsam voluptatum, odio quam omnis iste laudantium, itaque architecto, eos ullam debitis delectus sapiente nemo autem reprehenderit. Dolorem quidem facere ipsam! Nisi.</span><span>Vitae quaerat modi voluptatibus ratione numquam? Sapiente aliquid officia pariatur quibusdam aliquam id expedita non recusandae, cumque deserunt asperiores. Corrupti et doloribus aspernatur ipsum asperiores, ipsa unde corporis commodi reiciendis?</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima adipisci minus iste, nesciunt itaque quisquam quidem voluptatum assumenda rerum aliquid, excepturi voluptatem tempora. Possimus ratione alias a error vel, rem.</span><span>Officia esse error accusantium veritatis ad, et sit animi? Recusandae mollitia odit tenetur ad cumque maiores eligendi blanditiis nobis hic tempora obcaecati consequatur commodi totam, debitis, veniam, ducimus molestias ut.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Obcaecati quibusdam, tempora cupiditate quaerat tempore ullam delectus voluptates optio eum placeat provident consequatur iure reprehenderit vero quae sapiente architecto earum nemo.</span><span>Quis molestias sint fuga doloribus, necessitatibus nulla. Esse ipsa, itaque asperiores. Tempora a sequi nobis cumque incidunt aspernatur, pariatur rem voluptatibus. Atque veniam magnam, ea laudantium ipsum reprehenderit sapiente repellendus.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima, pariatur at explicabo aliquid repudiandae vero eum quasi totam voluptates iusto unde ad repellendus ipsam et voluptatem hic adipisci! Vero, nobis!</span><span>Consequatur eligendi quo quas omnis architecto dolorum aperiam doloremque labore, explicabo enim incidunt vitae saepe, quod soluta illo odit provident amet beatae quasi animi. Similique nostrum molestiae animi corrupti qui?</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Molestias quis, tempora laborum incidunt qui fuga adipisci doloremque iusto commodi vitae est, nemo iure placeat ut sit optio, consequuntur voluptas impedit.</span><span>Eos officiis, hic esse unde eaque, aut tenetur voluptate quam sint vel exercitationem totam dolor odio soluta illo praesentium non corrupti! Consequuntur velit, mollitia excepturi. Minus, veniam accusantium! Aliquam, ea!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reprehenderit quis reiciendis veritatis expedita velit vitae amet magni sunt rerum in blanditiis aut tempore quia fugiat, voluptates officia quaerat quam id.</span><span>Sapiente tempore repudiandae, quae doloremque ullam odio quia ea! Impedit atque, ipsa consequatur quis obcaecati voluptas necessitatibus, cupiditate sunt amet ab modi illum inventore, a dolor enim similique architecto est!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Itaque non aliquam, sit illo quas deserunt esse nobis reprehenderit quidem fuga beatae eligendi reiciendis omnis qui repellat velit earum blanditiis possimus.</span><span>Provident aspernatur ducimus, illum beatae debitis vitae non dolorum rem officia nostrum natus accusantium perspiciatis ad soluta maiores praesentium eveniet qui hic quis at quaerat ea perferendis. Ut, aut, natus.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ratione corrupti quibusdam, sed hic veniam. Perspiciatis ex, quod architecto natus autem totam at commodi excepturi maxime pariatur corporis, veritatis vero, praesentium.</span><span>Nesciunt suscipit, nobis eos perferendis ex quaerat inventore nihil qui magnam saepe rerum velit reiciendis ipsam deleniti ducimus eligendi odio eius minima vero, nisi voluptates amet eaque, iste, labore laudantium.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo, voluptas accusantium ad omnis velit distinctio! Adipisci magnam nihil nostrum molestiae rem dolores, ut ad nemo, dolor quos itaque maiores quaerat!</span><span>Quia ad suscipit reprehenderit vitae inventore eius non culpa maiores omnis sit obcaecati vel placeat quibusdam, ipsa exercitationem nam odit, magni nobis. Quam quas, accusamus expedita molestiae asperiores eaque ex?</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rerum explicabo doloribus nihil iusto quasi vel expedita dignissimos amet mollitia, temporibus aut atque architecto assumenda dolorum nam velit deserunt totam numquam.</span><span>Ab perferendis labore, quae. Quidem architecto quo officia deserunt ea doloribus libero molestias id nisi perferendis eum porro, quibusdam! Odit aliquid placeat rem aut officia minus sit esse eos obcaecati!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eligendi nostrum repellendus placeat, unde aperiam. Fuga, voluptas, minima. Debitis nemo ducimus itaque laboriosam error quaerat reprehenderit quo animi incidunt. Nulla, quis!</span><span>Explicabo assumenda dicta ratione? Tempora commodi asperiores, explicabo doloremque eius quia impedit possimus architecto sit nemo odio eum fuga minima dolor iste mollitia sequi dolorem perspiciatis unde quisquam laborum soluta.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veniam officia corporis, reiciendis laudantium, voluptate voluptates necessitatibus assumenda, delectus quisquam velit deserunt! Reprehenderit, vel quaerat accusantium nesciunt libero animi. Sequi, eveniet?</span><span>Animi natus pariatur porro, alias, veniam aut est tempora adipisci molestias harum modi cumque assumenda enim! Expedita eveniet autem illum rerum nostrum ipsum alias neque aut, dolorum impedit pariatur non?</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quis aliquid rerum, odio veniam ipsam ad officia quos repellat ex aperiam voluptatum optio est animi possimus minus. Sapiente voluptates amet dolorem.</span><span>Illo necessitatibus similique asperiores inventore ut cumque nihil assumenda debitis explicabo rerum, dolorum molestiae culpa accusantium. Nisi doloremque optio provident blanditiis, eum ipsam asperiores, consequatur aliquam vel sit mollitia sunt.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Enim, totam harum perferendis. Minus ea perferendis laboriosam, iste, qui corrupti, quas veritatis omnis officiis animi fuga perspiciatis impedit! Error, harum, voluptas.</span><span>Omnis laborum, cum mollitia facilis ipsa unde distinctio maxime nesciunt illum perspiciatis ut officiis, eligendi numquam dolorem quod modi ipsam est rerum perferendis repellendus totam. Maxime excepturi culpa alias labore.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Impedit deleniti, odit sit consequatur dolorum omnis repellendus, alias vel ullam numquam. Nostrum obcaecati hic, possimus delectus nam atque aliquid explicabo cum.</span><span>Explicabo tenetur minima consequatur, aliquam, laudantium non consequuntur facilis sint, suscipit debitis ex atque mollitia magni quod repellat ratione dolorum excepturi molestiae cumque iusto eos unde? Voluptatum dolores, porro provident!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. At laboriosam fuga aperiam eveniet, obcaecati esse, nulla porro iure molestiae praesentium sint fugiat ea voluptate suscipit voluptates mollitia, voluptatibus. Autem, non.</span><span>Numquam velit culpa tempora ratione ipsum minus modi in? Nisi reiciendis, voluptate voluptatem maxime repellat quae odio, repellendus aliquid laborum dolorem. Labore, fuga ea minima explicabo quae voluptatum necessitatibus, similique.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quasi, rerum dolorum nemo error fugiat ut, modi, architecto libero maxime laborum repellendus doloribus neque aperiam adipisci quaerat obcaecati deserunt consequuntur amet!</span><span>Sint, assumenda nisi obcaecati doloremque iste. Perspiciatis accusantium, distinctio impedit cum esse recusandae sunt. Officiis culpa dolore eius, doloribus natus, dolorum excepturi vitae fugiat ullam provident harum! Suscipit, assumenda, harum.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Odit, nihil tenetur tempore eligendi qui nesciunt consequatur delectus accusantium consectetur ipsa, nulla doloribus dolores rerum corporis, laborum, laboriosam hic mollitia repellat.</span><span>Ab deleniti vitae blanditiis quod tenetur! Voluptatem temporibus ab eaque quis? Quis odio aliquid harum temporibus totam, ipsa eius iusto fugiat enim in, quibusdam molestiae aliquam consequatur nulla, consequuntur sint.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum odit praesentium quos, earum nesciunt laudantium illo tempora eligendi, porro doloremque mollitia neque aperiam inventore nam maxime dolor labore aspernatur molestias.</span><span>Voluptatibus provident hic cupiditate placeat, ut reprehenderit nisi eum, dolores ad sed quis. Doloribus molestiae, quae rem odit expedita soluta, facilis animi corporis velit ut in, recusandae harum laboriosam veritatis.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Incidunt repudiandae molestias magnam delectus veritatis labore, corporis dicta officia quos, ad corrupti odit! Ad hic officia maxime eveniet consectetur similique adipisci!</span><span>Quia at, nesciunt aliquid delectus ex alias voluptas maxime hic esse. Incidunt, laborum quos mollitia dolores et! Voluptas commodi asperiores, fugit quidem quis corporis, a eaque, animi, autem deserunt repellendus.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sequi quas, voluptas hic minima inventore optio, id quidem placeat necessitatibus omnis voluptatibus vitae mollitia tempora consequuntur consequatur, illo facilis accusamus illum.</span><span>Voluptates consequuntur ipsam odit. Eius quis ipsam vitae, nihil molestias perferendis corporis recusandae consequatur vero iure blanditiis quas adipisci quos voluptatem rem illo voluptate. Eveniet officiis iure sit laborum veniam.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit a quis cumque nostrum quisquam molestiae pariatur, asperiores natus necessitatibus adipisci illum cupiditate nam vero, tempora excepturi laborum, earum. Voluptates, nobis.</span><span>Pariatur suscipit, hic blanditiis libero, iusto, quam cupiditate nam error id asperiores repellat ab consequatur vitae ipsa voluptatem totam magni reiciendis expedita maxime dolor! Minus explicabo quas, laborum ab omnis!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Labore qui ad assumenda placeat optio illo molestias corporis dolorum cum. Doloribus eius autem obcaecati minima, asperiores iure dignissimos ducimus suscipit dolorem.</span><span>Blanditiis earum accusamus eaque temporibus necessitatibus voluptatum dolorem enim debitis inventore assumenda quae error perspiciatis aut, nulla delectus quam ipsa sapiente ea aliquam laboriosam repudiandae. Nesciunt praesentium, beatae eos quasi!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate dicta voluptate impedit? Ad voluptatum dicta earum perferendis asperiores. Dolore distinctio modi expedita consequatur provident perspiciatis neque totam rerum placeat quas.</span><span>Eveniet optio est possimus iste accusantium ipsum illum. Maiores saepe repudiandae facere, delectus iure dolorem vitae nihil pariatur minima, reprehenderit eligendi dolore impedit, nisi doloribus quidem similique. Optio, delectus, minus.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste ex molestiae architecto enim nihil tempore, atque consequuntur doloribus recusandae sed consequatur veniam quos, in consectetur perspiciatis magni nostrum ab voluptates.</span><span>Nisi quos mollitia quis in maiores asperiores labore deserunt! Voluptate voluptas adipisci qui hic officia molestias, laborum necessitatibus sint nam vel minus incidunt perspiciatis recusandae sunt, rerum suscipit doloremque possimus!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. At nihil perferendis quae quidem facilis aliquid pariatur possimus hic asperiores, recusandae exercitationem adipisci atque laborum, delectus, odit ab reprehenderit distinctio dolor.</span><span>Non excepturi quos aspernatur repudiandae laboriosam, unde molestias, totam, sapiente harum accusamus delectus laborum ipsam velit amet nisi! Consectetur aliquam provident voluptatibus saepe repudiandae eveniet laborum beatae, animi, voluptate dolores.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cumque magni, eum ipsa, veritatis facere voluptatem dolorum nobis neque minus debitis asperiores iste. Pariatur sequi quam, tempora. Dignissimos, esse similique tempora.</span><span>Ex delectus excepturi autem sunt, nemo repudiandae, recusandae nostrum accusantium nobis temporibus magnam eligendi similique veritatis deleniti, eaque blanditiis possimus at! Repellat alias laboriosam ipsum commodi dolorem, corporis dolore suscipit!</span></p>

    DevWL
    fonte
    1
    Bem, é muito simples se você olhar mais de perto. Talvez seja o POO que faça parecer que seria um pouco mais complicado do que realmente é. Outros trechos não incluem a funcionalidade de rolagem de quebra. Então, publiquei algo um pouco mais completo. Se você não se importa com isso, minha solução pode parecer um pouco exagerada para suas necessidades. Para fazê-lo funcionar no FF e no IE, você só precisa adicionar um prefixo para CSS, eu acho. Vou corrigi-lo caso alguém mais peça. Eu adicionei CSS porque queria criar uma solução "copiar / colar". Eu não acho que isso pode ficar mais fácil do que isso :-).
    DevWL
    Ok, este não é um problema de prefixo :), mas eu o corrigirei de qualquer maneira.
    DevWL
    Problema resolvido. Agora ele funcionará no IE, FF e Chrome ... Aqui o que aconteceu: "document.documentElement.scrollTop" Funciona no Firefox e IE, mas não no Chrome ", document.body.scrollTop" funciona no Chrome, mas não no Firefox e não no IE. Para corrigir o problema, novo método [scrollTop ()] foi implementado no protótipo de classe. O novo método retorna o valor referente ao navegador em que trabalha: // var curentScrollTop = document.documentElement.scrollTop || document.body.scrollTop; // retorna curentScrollTop;
    DevWL
    Outro bug do IE corrigido. classList.add ('class1, class2'); somente aplicará classe1, classe2 será ignorada,. Correção: classList.add ('class1'); classList.add ('class2'); O botão Agora está oculto ao carregar o IE.
    DevWL 26/03/16
    6

    Fácil.

    var scrollIt = function(time) {
        // time = scroll time in ms
        var start = new Date().getTime(),
            scroll = document.documentElement.scrollTop + document.body.scrollTop,
            timer = setInterval(function() {
                var now = Math.min(time,(new Date().getTime())-start)/time;
                document.documentElement.scrollTop
                    = document.body.scrollTop = (1-time)/start*scroll;
                if( now == 1) clearTimeout(timer);
            },25);
    }
    Niet, o Escuro Absol
    fonte
    Ou apenas window.scrollTo(x, y);.
    Rob W
    3
    Isso não a anima, no entanto.
    Niet the Dark Absol
    Eu ofereci uma opção alternativa para .scrollTope .scrollLeft.
    Rob W
    @NiettheDarkAbsol Esta é apenas a função que se preocupa com body.scrolltop e documentElement.scrolltop. mas há alguns erros como rolagem sem uso, falta ponto e vírgula etc. Você poderia revisá-lo.
    Deniz Porsuk
    @DenizPorsuk Você está certo quanto ao "rolagem não está sendo usada", era para *scrollcalcular a posição da rolagem. No entanto, não vejo nenhuma falta ;...
    Niet the Dark Absol
    2

    Acabei de fazer esta solução apenas em javascript abaixo.

    Uso simples:

    EPPZScrollTo.scrollVerticalToElementById('wrapper', 0);

    Objeto do mecanismo (você pode mexer no filtro, nos valores de fps):

    /**
     *
     * Created by Borbás Geri on 12/17/13
     * Copyright (c) 2013 eppz! development, LLC.
     *
     * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
     * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     *
     */
    
    
    var EPPZScrollTo =
    {
        /**
         * Helpers.
         */
        documentVerticalScrollPosition: function()
        {
            if (self.pageYOffset) return self.pageYOffset; // Firefox, Chrome, Opera, Safari.
            if (document.documentElement && document.documentElement.scrollTop) return document.documentElement.scrollTop; // Internet Explorer 6 (standards mode).
            if (document.body.scrollTop) return document.body.scrollTop; // Internet Explorer 6, 7 and 8.
            return 0; // None of the above.
        },
    
        viewportHeight: function()
        { return (document.compatMode === "CSS1Compat") ? document.documentElement.clientHeight : document.body.clientHeight; },
    
        documentHeight: function()
        { return (document.height !== undefined) ? document.height : document.body.offsetHeight; },
    
        documentMaximumScrollPosition: function()
        { return this.documentHeight() - this.viewportHeight(); },
    
        elementVerticalClientPositionById: function(id)
        {
            var element = document.getElementById(id);
            var rectangle = element.getBoundingClientRect();
            return rectangle.top;
        },
    
        /**
         * Animation tick.
         */
        scrollVerticalTickToPosition: function(currentPosition, targetPosition)
        {
            var filter = 0.2;
            var fps = 60;
            var difference = parseFloat(targetPosition) - parseFloat(currentPosition);
    
            // Snap, then stop if arrived.
            var arrived = (Math.abs(difference) <= 0.5);
            if (arrived)
            {
                // Apply target.
                scrollTo(0.0, targetPosition);
                return;
            }
    
            // Filtered position.
            currentPosition = (parseFloat(currentPosition) * (1.0 - filter)) + (parseFloat(targetPosition) * filter);
    
            // Apply target.
            scrollTo(0.0, Math.round(currentPosition));
    
            // Schedule next tick.
            setTimeout("EPPZScrollTo.scrollVerticalTickToPosition("+currentPosition+", "+targetPosition+")", (1000 / fps));
        },
    
        /**
         * For public use.
         *
         * @param id The id of the element to scroll to.
         * @param padding Top padding to apply above element.
         */
        scrollVerticalToElementById: function(id, padding)
        {
            var element = document.getElementById(id);
            if (element == null)
            {
                console.warn('Cannot find element with id \''+id+'\'.');
                return;
            }
    
            var targetPosition = this.documentVerticalScrollPosition() + this.elementVerticalClientPositionById(id) - padding;
            var currentPosition = this.documentVerticalScrollPosition();
    
            // Clamp.
            var maximumScrollPosition = this.documentMaximumScrollPosition();
            if (targetPosition > maximumScrollPosition) targetPosition = maximumScrollPosition;
    
            // Start animation.
            this.scrollVerticalTickToPosition(currentPosition, targetPosition);
        }
    };
    Geri Borbás
    fonte
    8
    Cara, sério? Criar esse pedaço monstruoso de código é como usar o lançador de foguetes para matar uma mosca.
    Killah
    3
    @Killah Eu realmente me preocupo com o uso simples e a legibilidade. Eu posso postar minified se você quiser. :)
    Geri Borbás
    O que eu quis dizer é que existem muitas funções auxiliares (por que você precisa de uma função auxiliar usada uma vez?), E também o console.warnparâmetro string setTimeoutnão é adequado no código de produção (o segundo é praticamente inadequado em qualquer lugar, já que é evalbasicamente).
    Killah
    1
    Supondo que uma chamada de função não seja uma coisa cara, prefiro extrair qualquer código para uma função nomeada em vez de comentar tudo. Para que você (pelo menos eu) possa ler melhor o código, também o código do cliente pode ser um liner dez mais curto.
    Geri Borbás
    2

    Com base em algumas das respostas aqui, mas usando algumas contas simples para uma transição suave usando uma curva senoidal:

    scrollTo(element, from, to, duration, currentTime) {
           if (from <= 0) { from = 0;}
           if (to <= 0) { to = 0;}
           if (currentTime>=duration) return;
           let delta = to-from;
           let progress = currentTime / duration * Math.PI / 2;
           let position = delta * (Math.sin(progress));
           setTimeout(() => {
               element.scrollTop = from + position;
               this.scrollTo(element, from, to, duration, currentTime + 10);
           }, 10);
       }

    Uso:

    // Smoothly scroll from current position to new position in 1/2 second.
    scrollTo(element, element.scrollTop, element.scrollTop + 400, 500, 0);

    PS. tome nota do estilo ES6

    Sybrand
    fonte
    1

    Esta é uma abordagem entre navegadores, com base nas respostas acima

    function scrollTo(to, duration) {
        if (duration < 0) return;
        var scrollTop = document.body.scrollTop + document.documentElement.scrollTop;
        var difference = to - scrollTop;
        var perTick = difference / duration * 10;
    
        setTimeout(function() {
          scrollTop = scrollTop + perTick;
          document.body.scrollTop = scrollTop;
          document.documentElement.scrollTop = scrollTop;
          if (scrollTop === to) return;
          scrollTo(to, duration - 10);
        }, 10);
      }
    Belchior Oliveira
    fonte
    Boa resposta! Você pode explicar o que está acontecendo differencee perTick?
    Jessica
    1

    Outra abordagem é usar window.scrollBy

    JSFiddle

    function scroll(pxPerFrame, duration) {
            if (!pxPerFrame || !duration) return;
            const end = new Date().getTime() + duration;
            step(); 
    
            function step() {
              window.scrollBy(0, pxPerFrame);
              if (new Date().getTime() < end) {
                window.setTimeout(step, 1000 / 60);
              } else {
                console.log('done scrolling'); 
              }
            }
          }
    body {
      width: 200px;
    }
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    <p>
    <button onclick="scroll(-5, 3000)">
    scroll(-5, 3000)
    </button>
    </p>

    remdevtec
    fonte
    1

    Eu escolhi a versão @akai da resposta @timwolla e adicionei a função stopAnimation em troca. Portanto, antes de iniciar uma nova animação, a antiga pode ser interrompida.

    if ( this.stopAnimation )
        this.stopAnimation()
    
        this.stopAnimation = scrollTo( el, scrollDestination, 300 )
    
    
    // definitions
    
    function scrollTo(element, to, duration) {
        var start = element.scrollTop,
            change = to - start,
            increment = 20,
            timeOut;
    
        var animateScroll = function(elapsedTime) {        
            elapsedTime += increment;
            var position = easeInOut(elapsedTime, start, change, duration);                        
            element.scrollTop = position; 
            if (elapsedTime < duration) {
                timeOut = setTimeout(function() {
                    animateScroll(elapsedTime);
                }, increment);
            }
        };
    
        animateScroll(0);
    
        return stopAnimation
    
        function stopAnimation() {
            clearTimeout( timeOut )
        }
    }
    
    function easeInOut(currentTime, start, change, duration) {
        currentTime /= duration / 2;
        if (currentTime < 1) {
            return change / 2 * currentTime * currentTime + start;
        }
        currentTime -= 1;
        return -change / 2 * (currentTime * (currentTime - 2) - 1) + start;
    }
    Luckylooke
    fonte
    0

    Outra abordagem entre navegadores com base na solução acima

    function doScrollTo(to, duration) {
        var element = document.documentElement;
    
            var start = element.scrollTop,
            change = to - start,
            increment = 20,
            i = 0;
    
        var animateScroll = function(elapsedTime) {
            elapsedTime += increment;
            var position = easeInOut(elapsedTime, start, change, duration);
            if (i === 1 && window.scrollY === start) {
                element = document.body;
                start = element.scrollTop;
            }
            element.scrollTop = position;
            if (!i) i++;
            if (elapsedTime < duration) {
                setTimeout(function() {
                    animateScroll(elapsedTime);
                }, increment);
            }
        };
    
        animateScroll(0);
    }

    O truque é controlar a mudança de rolagem real e, se for zero, altere o elemento de rolagem.

    Zdenek Hatak
    fonte
    -1

    Animação de rolagem linear para baixo. JS puro, sem JQuery. Talvez minha solução seja útil para alguém.

    let action_count = 8;
    let speed_ms = 15;
    let objDiv = document.getElementsByClassName('js_y5_area3').item(0);
    
    let scroll_height = objDiv.scrollHeight;
    let window_height = objDiv.offsetHeight;
    
    let scroll_top = objDiv.scrollTop;
    let need_scroll_top = scroll_height - window_height;
    
    if (scroll_top < need_scroll_top)
    {
        let step = Math.ceil((need_scroll_top - scroll_top) / action_count);
    
        let scrollInterval = setInterval(function()
        {
            scroll_top += step;
            objDiv.scrollTop = scroll_top;
    
            if (scroll_top >= need_scroll_top)
            {
                clearInterval(scrollInterval);
            }
    
        }, speed_ms);
    }

    Você pode alterar as variáveis action_count, speed_mspara configurar a rolagem de animação do seu gosto.

    sNICkerssss
    fonte
    -2

    Use esta solução

    animate(document.documentElement, 'scrollTop', 0, 200);

    obrigado

    Lokesh Gamot
    fonte
    Infelizmente, parece que isso não é muito experiente em vários navegadores. :(
    Lucas Morgan
    @LucasMorgan você só precisa encontrar elemento DOM correto no lugar de "document.documentElemen", como tudo o que combina com você
    Lokesh Gamot
    1
    A menos que haja uma animate()função no escopo da janela ... acho que você entendeu errado. A Element.animate()função não é reconhecida por muitos navegadores. Veja developer.mozilla.org/pt-BR/docs/Web/API/Element/animate
    Lucas Morgan
    Sim, eu não entendi. Você fala de uma função jquery. Presumi que você não apresentaria o jquery, já que a pergunta não exige jquery. Foi mal!
    Lucas Morgan
    -3

    Vejo que a maioria / todas as postagens acima pesquisam um botão com javascript. Isso funciona, desde que você tenha apenas um botão. Eu recomendaria definir um elemento "onclick" dentro do botão. Esse "onclick" chamaria a função causando a rolagem.

    Se você fizer isso dessa maneira, poderá usar mais de um botão, desde que parecido com o seguinte:

    <button onclick="scrollTo(document.body, 0, 1250)">To the top</button>
    user4251442
    fonte
    3
    Isso não anima.
    dmackerman