Como obter e definir a posição de rolagem da página da web atual?


121

Como posso obter e definir a posição atual de rolagem da página da web?

Tenho um formulário longo que precisa ser atualizado com base nas ações / entradas do usuário. Quando isso acontece, a página é redefinida para o topo, o que é irritante para os usuários, porque eles precisam rolar para baixo até o ponto em que estavam.

Se eu pudesse capturar a posição de rolagem atual (em uma entrada oculta) antes de recarregar a página, poderia configurá-la novamente depois de recarregar.


Um formulário orientado a AJAX não é a melhor maneira de evitar esses efeitos (e, claro, fornecer um fallback caso o XHR não esteja disponível)? Recarregar páginas fará com que a página pule para o topo e volte novamente, uma peculiaridade que pode ser irritante.
Marcel Korpel

Respostas:


118

Você está procurando a document.documentElement.scrollToppropriedade.


obrigado, encontrei este: articles.sitepoint.com/article/javascript-from-scratch/6 e modifiquei o getScrollingPosition()para armazenar os valores em variáveis ​​ocultas. Então, no html da página atualizada que uso <body onLoad="window.scrollTo(x,y), onde x e y são os valores dos valores ocultos!
xyz

46
Estou descobrindo, pelo menos no Chrome no Ubuntu, que document.documentElement.scrollTopsempre retorna 0. document.body.scrollTop, no entanto, parece funcionar. Um Firefox no Ubuntu, por outro lado, o inverso é verdadeiro - você obtém 0 com bodye a quantidade correta com documentElement. Alguma ideia do que dá?
tobek

12
Esta resposta não é precisa, pois a scrollToppropriedade não funciona em todos os navegadores. Verifique window.pageXOffsete window.pageYOffsetpara melhores resultados.
gyo

135

A resposta aceita atualmente está incorreta - document.documentElement.scrollTopsempre retorna 0 no Chrome. Isso ocorre porque o WebKit usa bodypara controlar a rolagem, enquanto o Firefox e o IE usam html.

Para obter a posição atual, você deseja:

document.documentElement.scrollTop || document.body.scrollTop

Você pode definir a posição atual para 1000 px na página, desta forma:

document.documentElement.scrollTop = document.body.scrollTop = 1000;

Ou, usando jQuery (anime enquanto você está nisso!):

$("html, body").animate({ scrollTop: "1000px" });

5
resposta do gyo, sugerindo que window.pageYOffseté mais limpo se você estiver usando métodos window.scrollBy()ou window.scrollTo().
igorsantos07

32

Existem algumas inconsistências em como os navegadores expõem as coordenadas de rolagem da janela atual. O Google Chrome no Mac e iOS parece sempre retornar 0ao usar document.documentElement.scrollTopou jQuery $(window).scrollTop().

No entanto, funciona de forma consistente com:

// horizontal scrolling amount
window.pageXOffset

// vertical scrolling amount
window.pageYOffset

Eu também percebi, é um bug no Mac e iOS?
Alexander Kim

@AlexanderKim Acho que pode estar relacionado a como certas regras CSS (como overflow) são interpretadas, e foi relatado que funciona ao verificar scrollTop nos elementos body e html. No entanto, para evitar testes e depuração, sempre confio no pageXOffset / pageYOffset seguro e consistente.
gyo

muito obrigado pela resposta correta
Michael Paccione

5

Eu optei pela solução de armazenamento local HTML5 ... Todos os meus links chamam uma função que define isso antes de alterar window.location:

localStorage.topper = document.body.scrollTop;

e cada página tem isso no onLoad do corpo:

  if(localStorage.topper > 0){ 
    window.scrollTo(0,localStorage.topper);
  }

3
Seria mais elegante usar setItem () e getItem () de localStorage e, em vez disso, fazer backup da posição de rolagem a cada clique no link, armazene-a uma vez ao sair da página: window.addEventListener ("beforeunload", function () {localStorage. setItem ("scrolly", document.documentElement.scrollTop || document.body.scrollTop);});
StanE
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.