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. :(
javascript
Heather Hins
fonte
fonte
var something = $(...)
), recriando um zilhão de objetos em todas as funções (eles conhecem variáveis, mas não sabem dissovar 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.Respostas:
Demo:
fonte
document.documentElement
em vez dedocument.body
(a menos que você defina CSS:)body{height:100%;}
. Demonstração de trabalho usando este conceito: jsfiddle.net/S5ALP/1if (duration <= 0) return;
top.window.scroll(0, value)
vez deelement.scrollTop = value
fazê-lo funcionar no Chrome e Firefox (Ubuntu). :)Parece que já existem muitas soluções. de qualquer maneira, aqui está outra, usa equações de flexibilização ..
fonte
requestAnimationFrame
requestAnimationFrame
nã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/…requestAnimationFrame
que devem cuidar de qualquer incompatibilidade navegadorComprei em um artigo sobre Rolagem suave .
Se necessário, existem alguns polyfills disponíveis.
fonte
scrollIntoView({behavior: 'smooth'})
existe também e pode fazer o que as pessoas precisam para esse tipo de problema.Uncaught TypeError: Failed to execute 'scroll' on 'Window': No function was found that matched the signature provided.
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
fonte
document. documentElement
não funciona no Chrome.Sem o código JQuery, espero que isso ajude você.
chame essa função TopscrollTo () no evento de clique no botão ou em qualquer outro elemento / evento que você desejar.
fonte
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
http://jsfiddle.net/forestrf/tPQSv/
Versão reduzida: http://jsfiddle.net/forestrf/tPQSv/139/
fonte
1 / duration
quando você chama o scrollToX pela primeira vez?Na verdade, existe uma maneira pura de javascript para fazer isso sem usar
setTimeout
ourequestAnimationFrame
ou 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 .
fonte
scrollIntoViewOption
não tem suporte entre navegadores. developer.mozilla.org/pt-BR/docs/Web/API/Element/scrollIntoViewAdaptado desta resposta :
Isso deve permitir que você role suavemente (função cosseno) de qualquer lugar até o "y" especificado.
fonte
Ninguém mencionou a propriedade CSS scroll-behavior
CSS
JS
fonte
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.
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
SCRIPT DE CLASSE COMPLETA + EXEMPLO DE USO:
fonte
Fácil.
fonte
window.scrollTo(x, y);
..scrollTop
e.scrollLeft
.*scroll
calcular a posição da rolagem. No entanto, não vejo nenhuma falta;
...Acabei de fazer esta solução apenas em javascript abaixo.
Uso simples:
Objeto do mecanismo (você pode mexer no filtro, nos valores de fps):
fonte
console.warn
parâmetro stringsetTimeout
não é adequado no código de produção (o segundo é praticamente inadequado em qualquer lugar, já que éeval
basicamente).Com base em algumas das respostas aqui, mas usando algumas contas simples para uma transição suave usando uma curva senoidal:
Uso:
PS. tome nota do estilo ES6
fonte
Esta é uma abordagem entre navegadores, com base nas respostas acima
fonte
difference
eperTick
?Outra abordagem é usar window.scrollBy
JSFiddle
fonte
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.
fonte
Outra abordagem entre navegadores com base na solução acima
O truque é controlar a mudança de rolagem real e, se for zero, altere o elemento de rolagem.
fonte
Animação de rolagem linear para baixo. JS puro, sem JQuery. Talvez minha solução seja útil para alguém.
Você pode alterar as variáveis
action_count
,speed_ms
para configurar a rolagem de animação do seu gosto.fonte
Use esta solução
obrigado
fonte
animate()
função no escopo da janela ... acho que você entendeu errado. AElement.animate()
função não é reconhecida por muitos navegadores. Veja developer.mozilla.org/pt-BR/docs/Web/API/Element/animateVejo 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:
fonte