Rolar automaticamente para a parte inferior da página


415

Considere que eu tenho uma lista de perguntas. Quando clico na primeira pergunta, ela deve me levar automaticamente para o final da página.

Por uma questão de fato, eu sei que isso pode ser feito usando o jQuery.

Então, você poderia me fornecer alguma documentação ou alguns links onde posso encontrar resposta para esta pergunta?

EDIT: Precisa rolar para um elemento HTML específico na parte inferior da página


Respostas:


808

jQuery não é necessário. A maioria dos principais resultados que obtive de uma pesquisa no Google me deu esta resposta:

window.scrollTo(0,document.body.scrollHeight);

Onde você possui elementos aninhados, o documento pode não rolar. Nesse caso, você precisa direcionar o elemento que rola e usar sua altura de rolagem.

window.scrollTo(0,document.querySelector(".scrollingContainer").scrollHeight);

Você pode vincular isso ao onclickevento da sua pergunta (ou seja <div onclick="ScrollToBottom()" ...).

Algumas fontes adicionais você pode dar uma olhada:


29
Não funcionou para mim. Eu fiz isso: element.scrollTop = element.scrollHeight.
— Esamo 17/08/2015

7
4 de maio de 2016: observe que a função "scrollTo" é experimental e não funciona em todos os navegadores.
— Corgrath 4/16

1
scrollto não funcionou no meu navegador, me deparei com este link abaixo stackoverflow.com/questions/8917921/…, que é muito útil porque as soluções funcionam nos navegadores que eu tentei.
— user3655574

para um elemento separado, esta é a solução que funciona: document.querySelector (". scrollingContainer"). scrollTo (0, document.querySelector (". scrollingContainer"). scrollHeight);
— MPrinC

Pode ter que definir html, altura do corpo para 100% para rolar para baixo
— Trever Thompson

106

Se você quiser rolar a página inteira até o final:

var scrollingElement = (document.scrollingElement || document.body);
scrollingElement.scrollTop = scrollingElement.scrollHeight;

Veja a amostra no JSFiddle

Se você deseja rolar um elemento até o final:

function gotoBottom(id){
   var element = document.getElementById(id);
   element.scrollTop = element.scrollHeight - element.clientHeight;
}

E é assim que funciona:

insira a descrição da imagem aqui

Ref: scrollTop , scrollHeight , clientHeight

ATUALIZAÇÃO: As versões mais recentes do Chrome (61+) e Firefox não oferecem suporte à rolagem do corpo, consulte: https://dev.opera.com/articles/fixing-the-scrolltop-bug/


A solução funciona com Chrome, Firefox, Safari e IE8 +. Confira este link para obter mais detalhes quirksmode.org/dom/w3c_cssom.html
— Tho

1
@luochenhuan, eu só fixa o código de exemplo usando "document.scrollingElement" em vez de "document.body", veja acima
— David Avsajanishvili

58

Implementação de Vanilla JS:

element.scrollIntoView(false);

https://developer.mozilla.org/en-US/docs/Web/API/element.scrollIntoView


3
com jQuery $ ('# id') [0] .scrollIntoView (false);
— precisa saber é o seguinte

4
no momento em que é Firefox única embora
— tim-se

Agora funciona em versões mais recentes do Chrome, mas algumas das opções extras (como rolagem suave) ainda não parecem estar implementadas.
— 21816 Matt Zukowski

Adicionei uma div vazia no final da página e usei o ID dessa div. Funcionou perfeitamente.
— Nisba

5
Ainda melhor:element.scrollIntoView({behavior: "smooth"});
— blalond

26

Você pode usar isso para descer a página em um formato de animação.

$('html,body').animate({scrollTop: document.body.scrollHeight},"fast");

23

Abaixo deve estar a solução entre navegadores. Foi testado no Chrome, Firefox, Safari e IE11

window.scrollTo(0, document.body.scrollHeight || document.documentElement.scrollHeight);

window.scrollTo (0, document.body.scrollHeight); não funciona no Firefox, pelo menos para o Firefox 37.0.2


1
Ele faz o trabalho no Firefox 62.0.3, mas eu não tenho nenhuma pista quando eles consertaram isso.
— Zb226 18/1018

12

Às vezes, a página se estende na rolagem até o botão (por exemplo, nas redes sociais), para rolar até o final (botão final da página). Eu uso este script:

var scrollInterval = setInterval(function() { 
    document.documentElement.scrollTop = document.documentElement.scrollHeight;
}, 50);

E se você estiver no console javascript do navegador, pode ser útil interromper a rolagem; adicione:

var stopScroll = function() { clearInterval(scrollInterval); };

E então use stopScroll();.

Se você precisar rolar para um elemento específico, use:

var element = document.querySelector(".element-selector");
element.scrollIntoView();

Ou script universal para rolagem automática para um elemento específico (ou para o intervalo de rolagem da página):

var notChangedStepsCount = 0;
var scrollInterval = setInterval(function() {
    var element = document.querySelector(".element-selector");
    if (element) { 
        // element found
        clearInterval(scrollInterval);
        element.scrollIntoView();
    } else if((document.documentElement.scrollTop + window.innerHeight) != document.documentElement.scrollHeight) { 
        // no element -> scrolling
        notChangedStepsCount = 0;
        document.documentElement.scrollTop = document.documentElement.scrollHeight;
    } else if (notChangedStepsCount > 20) { 
        // no more space to scroll
        clearInterval(scrollInterval);
    } else {
        // waiting for possible extension (autoload) of the page
        notChangedStepsCount++;
    }
}, 50);

deixe tamanho = ($ ("div [class * = 'cartão inserido']")). length; ($ ("div [class * = 'inserido no cartão']")) [tamanho -1] .scrollIntoView ();
— 26618 Nobjta_9x_tq #

11

Você pode usar esta função sempre que precisar chamá-la:

function scroll_to(div){
   if (div.scrollTop < div.scrollHeight - div.clientHeight)
        div.scrollTop += 10; // move down

}

jquery.com: ScrollTo


Para mim, document.getElementById('copyright').scrollTop += 10não funciona (na mais recente Chrome) ... permanece zero ...
— Kyle Baker

10

você pode fazer isso também com animação, é muito simples

$('html, body').animate({
   scrollTop: $('footer').offset().top
   //scrollTop: $('#your-id').offset().top
   //scrollTop: $('.your-class').offset().top
}, 'slow');

esperança ajuda obrigado


7

um revestimento para rolar suavemente até o fundo

window.scrollTo({ left: 0, top: document.body.scrollHeight, behavior: "smooth" });

Para rolar para cima, basta definir topcomo0


4

Você pode anexar qualquer idatributo hrefde referência ao elemento do link:

<a href="#myLink" id="myLink">
    Click me
</a>

No exemplo acima, quando o usuário clica Click mena parte inferior da página, a navegação navega para Click mesi mesma.


Isso não aconteceu comigo, pois altera o URL e, em seguida, meu aplicativo angular é redirecionado para outra coisa!
— heman123

3

Você pode tentar o Gentle Anchors um bom plugin de javascript.

Exemplo:

function SomeFunction() {
  // your code
  // Pass an id attribute to scroll to. The # is required
  Gentle_Anchors.Setup('#destination');
  // maybe some more code
}

Compatibilidade testada em:

  • Mac Firefox, Safari, Opera
  • Windows Firefox, Opera, Safari, Internet Explorer 5.55 ou superior
  • Linux não testado, mas deve estar bem com o Firefox pelo menos

3

Tarde para a festa, mas eis alguns códigos simples apenas para javascript para rolar qualquer elemento até o final:

function scrollToBottom(e) {
  e.scrollTop = e.scrollHeight - e.getBoundingClientRect().height;
}

3

Para Scroll down in Selenium, use o código abaixo:

Até a parte inferior suspensa, role até a altura da página. Use o código javascript abaixo que funcionaria bem em JavaScript e React.

JavascriptExecutor jse = (JavascriptExecutor) driver; // (driver is your browser webdriver object) 
jse.executeScript("window.scrollBy(0,document.body.scrollHeight || document.documentElement.scrollHeight)", "");

3

Tantas respostas tentando calcular a altura do documento. Mas não estava calculando corretamente para mim. No entanto, ambos funcionaram:

jquery

    $('html,body').animate({scrollTop: 9999});

ou apenas js

    window.scrollTo(0,9999);

LOL "funcionou". E se o documento for maior que 9999?
— Dan Dascalescu

1
@DanDascalescu 99999
— Andrew

2

Aqui está a minha solução:

 //**** scroll to bottom if at bottom

 function scrollbottom() {
    if (typeof(scr1)!='undefined') clearTimeout(scr1)   
    var scrollTop = (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop;
    var scrollHeight = (document.documentElement && document.documentElement.scrollHeight) || document.body.scrollHeight;
    if((scrollTop + window.innerHeight) >= scrollHeight-50) window.scrollTo(0,scrollHeight+50)
    scr1=setTimeout(function(){scrollbottom()},200) 
 }
 scr1=setTimeout(function(){scrollbottom()},200)

O que ... está acontecendo lá? Importa-se de explicar sua solução? As respostas somente de código são desencorajadas.
— Dan Dascalescu

0

Isso garantirá rolagem para baixo

Head Codes

<script src="http://code.jquery.com/jquery-1.8.1.min.js"></script>
<script language="javascript" type="text/javascript">
function scrollToBottom() {
  $('#html, body').scrollTop($('#html, body')[0].scrollHeight);
}
</script>

Código do corpo

<a href="javascript:void(0);" onmouseover="scrollToBottom();" title="Scroll to Bottom">&#9660; Bottom &#9660;</a>

0

Uma imagem vale mais que mil palavras:

A chave é:

document.documentElement.scrollTo({
  left: 0,
  top: document.documentElement.scrollHeight - document.documentElement.clientHeight,
  behavior: 'smooth'
});

Está usando document.documentElement, que é o <html>elemento Ele é como usar window, mas é apenas a minha preferência pessoal para fazê-lo desta maneira, porque se ele não é toda a página, mas um recipiente, ele funciona exatamente como isso, exceto que você mudaria document.bodye document.documentElementpara document.querySelector("#container-id").

Exemplo:

let cLines = 0;

let timerID = setInterval(function() {
  let elSomeContent = document.createElement("div");

  if (++cLines > 33) {
    clearInterval(timerID);
    elSomeContent.innerText = "That's all folks!";
  } else {
    elSomeContent.innerText = new Date().toLocaleDateString("en", {
      dateStyle: "long",
      timeStyle: "medium"
    });
  }
  document.body.appendChild(elSomeContent);

  document.documentElement.scrollTo({
    left: 0,
    top: document.documentElement.scrollHeight - document.documentElement.clientHeight,
    behavior: 'smooth'
  });

}, 1000);
body {
  font: 27px Arial, sans-serif;
  background: #ffc;
  color: #333;
}

Você pode comparar a diferença se não houver scrollTo():


0

Uma maneira simples, se você quiser rolar para baixo um elemento específico

Chame esta função sempre que desejar rolar para baixo.

function scrollDown() {
 document.getElementById('scroll').scrollTop =  document.getElementById('scroll').scrollHeight
}
ul{
 height: 100px;
 width: 200px;
 overflow-y: scroll;
 border: 1px solid #000;
}
<ul id='scroll'>
<li>Top Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Bottom Here</li>
<li style="color: red">Bottom Here</li>
</ul>

<br />

<button onclick='scrollDown()'>Scroll Down</button>


Isso não é simples e requer a criação de um scrollelemento.
— Dan Dascalescu

@DanDascalescu Você está certo! mas meu código funciona eu acho que não merece voto
— Shrroy

"Trabalhos" não é suficiente. Todas as soluções nesta página "funcionam" até certo ponto. E há uma tonelada deles. Como um leitor deve decidir?
— Dan Dascalescu

0

Eu tenho um aplicativo Angular com conteúdo dinâmico e tentei várias das respostas acima sem muito sucesso. Eu adaptei a resposta do @ Konard e fiz funcionar JS simples para o meu cenário:

HTML

<div id="app">
    <button onClick="scrollToBottom()">Scroll to Bottom</button>
    <div class="row">
        <div class="col-md-4">
            <br>
            <h4>Details for Customer 1</h4>
            <hr>
            <!-- sequence Id -->
            <div class="form-group">
                <input type="text" class="form-control" placeholder="ID">
            </div>
            <!-- name -->
            <div class="form-group">
                <input type="text" class="form-control" placeholder="Name">
            </div>
            <!-- description -->
            <div class="form-group">
                <textarea type="text" style="min-height: 100px" placeholder="Description" ></textarea>
            </div>
            <!-- address -->
            <div class="form-group">
                <input type="text" class="form-control" placeholder="Address">
            </div>
            <!-- postcode -->
            <div class="form-group">
                <input type="text" class="form-control" placeholder="Postcode">
            </div>
            <!-- Image -->
            <div class="form-group">
                <img style="width: 100%; height: 300px;">
                <div class="custom-file mt-3">
                    <label class="custom-file-label">{{'Choose file...'}}</label>
                </div>
            </div>
            <!-- Delete button -->
            <div class="form-group">
                <hr>
                <div class="row">
                    <div class="col">
                        <button class="btn btn-success btn-block" data-toggle="tooltip" data-placement="bottom" title="Click to save">Save</button>
                        <button class="btn btn-success btn-block" data-toggle="tooltip" data-placement="bottom" title="Click to update">Update</button>
                    </div>
                    <div class="col">
                        <button class="btn btn-danger btn-block" data-toggle="tooltip" data-placement="bottom" title="Click to remove">Remove</button>
                    </div>
                </div>
                <hr>
            </div>
        </div>
    </div>
</div>

CSS

body {
    background: #20262E;
    padding: 20px;
    font-family: Helvetica;
}

#app {
    background: #fff;
    border-radius: 4px;
    padding: 20px;
    transition: all 0.2s;
}

JS

function scrollToBottom() {
    scrollInterval;
    stopScroll;

    var scrollInterval = setInterval(function () {
        document.documentElement.scrollTop = document.documentElement.scrollHeight;
    }, 50);

    var stopScroll = setInterval(function () {
        clearInterval(scrollInterval);
    }, 100);
}

Testado no navegador Android Chrome, FF, Edge e mais recente. Aqui está um violino:

https://jsfiddle.net/cbruen1/18cta9gd/16/


-1
getDocHeight: function() {
  var D = document;
  return Math.max(
    D.body.scrollHeight,
    D.documentElement.scrollHeight,
    D.body.offsetHeight,
    D.documentElement.offsetHeight,
    D.body.clientHeight,
    D.documentElement.clientHeight
  );
}

document.body.scrollTop = document.documentElement.scrollTop = this.getDocHeight();

-1

window.scrollTo (0,1e10);

sempre funciona.

1e10 é um grande número. portanto, é sempre o fim da página.


-1

Se alguém procurar Angular

você só precisa rolar para baixo, adicionar isso ao seu div

 #scrollMe [scrollTop]="scrollMe.scrollHeight"

   <div class="my-list" #scrollMe [scrollTop]="scrollMe.scrollHeight">
   </div>
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.