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.