Eu tenho uma div que tem apenas 300 pixels de tamanho e quero quando a página carrega rolar para a parte inferior do conteúdo. Essa div possui conteúdo adicionado dinamicamente e precisa permanecer rolada até o fim. Agora, se o usuário decidir rolar para cima, não quero voltar ao fundo até que o usuário role novamente
É possível ter uma div que fique rolada para baixo, a menos que o usuário role para cima e quando o usuário voltar para a parte inferior, ele precisará se manter na parte inferior, mesmo quando o novo conteúdo dinâmico for adicionado. Como eu iria criar isso?
{position : relative; bottom:0;}
. Remova a propriedade css assim que o usuário tiver rolado.Respostas:
Isso pode ajudá-lo a:
[EDIT], para corresponder ao comentário ...
sempre que o conteúdo for adicionado, chame a função updateScroll () ou defina um timer:
se você deseja atualizar SOMENTE se o usuário não se moveu:
fonte
setInterval
para esse problema leve.Consegui fazer isso funcionar apenas com CSS.
O truque é usar
display: flex;
eflex-direction: column-reverse;
O navegador trata o fundo como se fosse o topo. Supondo que os navegadores que você está direcionando para o suporte
flex-box
, a única ressalva é que a marcação deve estar na ordem inversa.Aqui está um exemplo de trabalho. https://codepen.io/jimbol/pen/YVJzBg
fonte
overflow:auto; display:flex; flex-direction:column-reverse;
-o ao invólucro externo, em vez do invólucro interno.Acabei de implementar isso e talvez você possa usar minha abordagem.
Digamos que temos o seguinte HTML:
Em seguida, podemos verificar se rolou para baixo com:
scrollHeight fornece a altura do elemento, incluindo qualquer área não visível devido ao estouro. clientHeight fornece a altura do CSS ou, de outra maneira, a altura real do elemento. Ambos os métodos retornam a altura sem
margin
, portanto você não precisa se preocupar com isso. scrollTop fornece a posição da rolagem vertical. 0 é superior e max é o scrollHeight do elemento menos a altura do elemento. Ao usar a barra de rolagem, pode ser difícil (estava no Chrome para mim) fazer a barra de rolagem descer até o final. então joguei uma imprecisão de 1px. IssoisScrolledToBottom
será verdade mesmo que a barra de rolagem esteja 1px a partir da parte inferior. Você pode definir isso como achar melhor para você.Depois, basta definir o scrollTop do elemento na parte inferior.
Eu criei um violino para você mostrar o conceito: http://jsfiddle.net/dotnetCarpenter/KpM5j/
EDIT: Adicionado trecho de código para esclarecer quando
isScrolledToBottom
étrue
.Posicione a barra de rolagem na parte inferior
fonte
if(!isScrolledToBottom)
: o teste parece errado para mim (e não funcionou no meu código até que eu o corrigisse).out.scrollHeight - out.clientHeight <= out.scrollTop + 1
. Você está usando preenchimento no seu CSS?document.getScrollingElement
como sugerido aqui: stackoverflow.com/questions/36227559/scrolltop-always-returns-0/...Demonstração ao vivo: http://jsfiddle.net/KGfG2/
fonte
fonte
Em 2020, você pode usar o snap a CSS , mas antes do Chrome 81 a alteração de layout não aciona o snap novamente , uma interface de usuário pura de bate-papo em CSS funciona no Chrome 81, também é possível marcar Posso usar o snap ao CSS .
Esta demonstração fará o snap do último elemento, se visível, role para baixo para ver o efeito.
fonte
Run code snippet
para ver o efeito. (PS: SeRun code snippet
não estiver funcionando, tente o seguinte: https://jsfiddle.net/Yeshen/xm2yLksu/3/ )Como isso funciona:
O excesso padrão é a rolagem de cima para baixo.
transform: rotate(180deg)
pode fazê-lo rolar ou carregar bloco dinâmico de baixo para cima.https://blog.csdn.net/yeshennet/article/details/88880252
fonte
Run code snippet
, veja diretamente o efeito.Isso calculará a posição ScrollTop a partir da altura do
#yourDivID
uso da$(document).height()
propriedade, de modo que, mesmo que conteúdos dinâmicos sejam adicionados à div, o scroller estará sempre na posição inferior. Espero que isto ajude. Mas também possui um pequeno erro, mesmo se rolarmos para cima e deixarmos o ponteiro do mouse no rolo, ele automaticamente chegará à posição inferior. Se alguém puder corrigir isso também será bom.fonte
Aqui está a minha versão com base na resposta do dotnetCarpenter. Minha abordagem é um jQuery puro e nomeei as variáveis para tornar as coisas um pouco mais claras. O que está acontecendo é que se a altura do conteúdo for maior que o contêiner, percorremos a distância extra para baixo para alcançar o resultado desejado.
Funciona no IE e no Chrome.
fonte
A resposta de Jim Hall é preferível porque, embora de fato não role para baixo quando você é rolado para cima, também é CSS puro.
Infelizmente, no entanto, essa não é uma solução estável: no chrome (possivelmente devido ao problema de 1 px descrito pelo dotnetCarpenter acima),
scrollTop
se comporta de maneira imprecisa em 1 pixel, mesmo sem a interação do usuário (mediante adição de elemento). Você pode definirscrollTop = scrollHeight - clientHeight
, mas isso manterá a div na posição quando outro elemento for adicionado, também conhecido como o recurso "manter-se na parte inferior", não está mais funcionando.Portanto, resumindo, adicionar uma pequena quantidade de Javascript (suspiro) corrigirá isso e atenderá a todos os requisitos:
Algo como https://codepen.io/anon/pen/pdrLEZ this (exemplo de Coo) e, após adicionar um elemento à lista, também o seguinte:
onde 29 é a altura de uma linha.
Portanto, quando o usuário rola meia linha (se isso é possível?), O Javascript o ignora e rola até o final. Mas acho que isso é negligenciável. E corrige a coisa de 1 px do Chrome.
fonte
Aqui está uma solução baseada em um post de Ryan Hunt . Depende da
overflow-anchor
propriedade CSS, que fixa a posição de rolagem a um elemento na parte inferior do conteúdo rolado.Observe que
overflow-anchor
atualmente não funciona no Safari ou Edge, portanto, esta solução atualmente não funciona em todos os navegadores.fonte
Você pode usar algo assim,
fonte
Aqui está como eu me aproximei. Minha altura div é de 650px. Decidi que, se a altura da rolagem estiver a 150px da parte inferior, role-a automaticamente. Senão, deixe para o usuário.
fonte