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 definir scrollTop = 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:
container = ...
if(container.scrollHeight - container.clientHeight - container.scrollTop <= 29) {
container.scrollTop = container.scrollHeight - container.clientHeight;
}
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.
{position : relative; bottom:0;}
. Remova a propriedade css assim que o usuário tiver rolado.