Role para a parte inferior de Div no carregamento da página (jQuery)

238

Eu tenho uma div na minha página:

<div id='div1' style='overflow:scroll;overflow-x:hidden;max-height:200px;'></div>

Como posso fazer a div rolar para a parte inferior da div? Não é a página, apenas o DIV.

DobotJr
fonte

Respostas:

610

As outras soluções aqui na verdade não funcionam para divs com muito conteúdo - ele "atinge o máximo" rolando para baixo até a altura da div (em vez da altura do conteúdo da div). Portanto, eles funcionarão, a menos que você tenha mais do que o dobro da altura da div no conteúdo.

Aqui está a versão correta:

$('#div1').scrollTop($('#div1')[0].scrollHeight);

ou versão do jQuery 1.6+:

var d = $('#div1');
d.scrollTop(d.prop("scrollHeight"));

Ou animado:

$("#div1").animate({ scrollTop: $('#div1').prop("scrollHeight")}, 1000);
Mike Todd
fonte
5
Isso também funciona: $ ('# div1'). ScrollTop ($ ('# div1'). Attr ("scrollHeight"));
18712 Mike Todd
2
Como fazer isso funcionar sem definir uma altura absoluta (em px) para div1?
znat
Bem feito! Eu estava procurando um trecho de rolagem e tudo o que encontrei foi rolagem de página (html, corpo). Essa é uma ótima solução e o uso do scrollHeight é uma ótima maneira de garantir que ela sempre chegue ao fundo.
21419 Kevin Marmet
incrível, o segundo funciona assim:d = $('#div1'); $(d).scrollTop( $(d).prop("scrollHeight") );
loretoparisi
56

Todas as respostas que posso ver aqui, incluindo a atualmente "aceita", estão realmente erradas no que definem:

scrollTop = scrollHeight

Considerando que a abordagem correta é definir:

scrollTop = scrollHeight - clientHeight

Em outras palavras:

$('#div1').scrollTop($('#div1')[0].scrollHeight - $('#div1')[0].clientHeight);

Ou animado:

$("#div1").animate({
  scrollTop: $('#div1')[0].scrollHeight - $('#div1')[0].clientHeight
}, 1000);
patspam
fonte
Eu tenho uma div com uma altura definida e estouro definido como automático. As respostas animadas funcionaram, mas esta é a única solução não animada que realmente rolaria para a parte inferior do "conteúdo", não para a altura definida da div. Bravo!
precisa saber é o seguinte
23

ATUALIZAÇÃO: consulte a solução de Mike Todd para obter uma resposta completa.


$("#div1").animate({ scrollTop: $('#div1').height()}, 1000);

se você deseja que seja animado (mais de 1000 milissegundos).

$('#div1').scrollTop($('#div1').height())

se você quiser instantâneo.

Alexis Pigeon
fonte
8
Errado! .height () é limitado à área exibida, .prop ("scrollHeight") é a altura real de div.
Ponteiro Nulo
5
Absolutamente! É por isso que a resposta de Mike Todd é a resposta aceita, não a minha.
Alexis Pigeon
15
$(window).load(function() {
  $("html, body").animate({ scrollTop: $(document).height() }, 1000);
});

Isso agarra a altura da página e a rola para baixo quando a janela é carregada. Altere 1000para o que for necessário, mais rápido / mais lento quando a página estiver pronta.

Acordes
fonte
Isso rola a página inteira, certo? Eu só quero que a div role para a parte inferior da div.
DobotJr
2
touche. mesma lógica, seletor diferente.
Acordes
7

tente isto:

$('#div1').scrollTop( $('#div1').height() )
Indefinido
fonte
5

Role a janela para a parte inferior da div de destino.

function scrollToBottom(id){
  div_height = $("#"+id).height();
  div_offset = $("#"+id).offset().top;
  window_height = $(window).height();
  $('html,body').animate({
    scrollTop: div_offset-window_height+div_height
  },'slow');
}

scrollToBottom('call_div_id');
sacudindo
fonte
5

O seguinte irá funcionar. Observe [0]escrollHeight

$("#myDiv").animate({ scrollTop: $("#myDiv")[0].scrollHeight }, 1000);
Lal Kokkat
fonte
5

para animar em jquery (versão> 2.0)

var d = $('#div1');
d.animate({ scrollTop: d.prop('scrollHeight') }, 1000);
dpineda
fonte
4

Nada disso funcionou para mim, eu tenho um sistema de mensagens dentro de um aplicativo da web que é semelhante ao messenger do Facebook e queria que as mensagens aparecessem na parte inferior de uma div.

Isso funcionou muito bem, Javascript básico.

window.onload=function () {
     var objDiv = document.getElementById("MyDivElement");
     objDiv.scrollTop = objDiv.scrollHeight;
}
James Blachford
fonte
1
Você provavelmente não tem o jQuery instalado. Você está trabalhando com dom nativo, eles estão usando jQuery. jquery.com
csga5000
Solução muito arrumada e elegante.
Divyanshu Das 15/04
2

Estou trabalhando em uma base de código herdada tentando migrar para o Vue.

Na minha situação específica (div rolável envolvida em um modal de inicialização), um v-if mostrava novo conteúdo, para o qual eu queria que a página rolasse para baixo. Para que esse comportamento funcionasse, tive que esperar o vue concluir a nova renderização e usar o jQuery para rolar até a parte inferior do modal.

Assim...

this.$nextTick(function() {
    $('#thing')[0].scrollTop = $('#thing')[0].scrollHeight;
})
Mavrick Laakso
fonte
0

Você pode usar o código abaixo para rolar para a parte inferior da div no carregamento da página.

$(document).ready(function(){
  $('div').scrollTop($('div').scrollHeight);
});
Manish Nagdewani
fonte
0

Você pode verificar scrollHeight e clientHeight com scrollTop para rolar para a parte inferior da div como no código abaixo.

$('#div').scroll(function (event) {
  if ((parseInt($('#div')[0].scrollHeight) - parseInt(this.clientHeight)) == parseInt($('#div').scrollTop())) 
  {
    console.log("this is scroll bottom of div");
  }
  
});

Nghi
fonte
sempre teste seu código antes de fornecer as soluções.
Lakshmi
-2

Quando a página é carregada, a rolagem é o valor máximo.

Esta é uma caixa de mensagem quando o usuário envia uma mensagem e sempre mostra o bate-papo mais recente para baixo, para que o valor de rolagem seja sempre o máximo.

$('#message').scrollTop($('#message')[0].scrollHeight);

ver imagem

chandan singh
fonte