var objDiv = document.getElementById(id);
var doScroll=objDiv.scrollTop>=(objDiv.scrollHeight-objDiv.clientHeight);
// add new content to div
$('#' + id ).append("new line at end<br>"); // this is jquery!
// doScroll is true, if we the bottom line is already visible
if( doScroll) objDiv.scrollTop = objDiv.scrollHeight;
4
就像一个奖金片段 . 我正在使用angular,并且当用户选择与用户的不同对话时,尝试将消息线程滚动到底部 . 为了确保在使用ng-repeat for messages将新数据加载到div之后滚动工作,只需将滚动片段包装在超时中 .
$timeout(function(){
var messageThread = document.getElementById('message-thread-div-id');
messageThread.scrollTop = messageThread.scrollHeight;
},0)
这将确保在将数据插入DOM之后触发scroll事件 .
11
Javascript或jquery:
var scroll = document.getElementById('messages');
scroll.scrollTop = scroll.scrollHeight;
scroll.animate({scrollTop: scroll.scrollHeight});
var scrollContainer = document.getElementById("myId");
// Define the Mutation Observer
var observer = new MutationObserver(function(mutations) {
// Compute sum of the heights of added Nodes
var newNodesHeight = mutations.reduce(function(sum, mutation) {
return sum + [].slice.call(mutation.addedNodes)
.map(function (node) { return node.scrollHeight || 0; })
.reduce(function(sum, height) {return sum + height});
}, 0);
// Scroll to bottom if it was already scrolled to bottom
if (scrollContainer.clientHeight + scrollContainer.scrollTop + newNodesHeight + 10 >= scrollContainer.scrollHeight) {
scrollContainer.scrollTop = scrollContainer.scrollHeight;
}
});
// Observe the DOM Element
observer.observe(scrollContainer, {childList: true});
18 回答
这是我在我的网站上使用的内容:
如果你使用jQuery,这会容易得多:
使用jQuery animate:
您可以使用以下代码:
要执行 smooth 滚动,请使用以下代码(需要jQuery):
请参阅JSFiddle sample
这就是它的工作原理:
参考:scrollTop,scrollHeight,clientHeight
适用于jQuery 1.6
https://api.jquery.com/scrollTop/
http://api.jquery.com/prop/
较新的方法:
如果您不想依赖
scrollHeight
,则以下代码有助于:使用jQuery,scrollTop用于设置任何给定元素的scollbar的垂直位置 . 还有一个很好的jquery scrollTo plugin用于滚动动画和不同的选项(demos)
如果要在向下滚动时使用jQuery's animate method添加动画,请检查以下代码段:
发现这真的很有帮助,谢谢 .
对于Angular 1.X的人来说:
仅仅因为jQuery元素与HTML DOM元素的包装与angular有点混淆 .
另外,对于聊天应用程序,我发现在你的聊天被加载后做出这个任务是有用的,你也可能需要打一个短暂的超时 .
小附录:仅限滚动,如果最后一行已经可见 . 如果滚动一点点,将内容留在原处(注意:没有使用不同的字体大小进行测试 . 这可能需要在“> =比较”中进行一些调整):
就像一个奖金片段 . 我正在使用angular,并且当用户选择与用户的不同对话时,尝试将消息线程滚动到底部 . 为了确保在使用ng-repeat for messages将新数据加载到div之后滚动工作,只需将滚动片段包装在超时中 .
这将确保在将数据插入DOM之后触发scroll事件 .
Javascript或jquery:
CSS:
这将让您一直向下滚动文档高度
您还可以使用jQuery通过以下方式将动画附加到文档的
html,body
:$("html,body").animate({scrollTop:$("#div-id")[0].offsetTop}, 1000);
这将导致平滑滚动到div的顶部,ID为“div-id” .
我遇到了同样的问题,但有一个额外的约束:我无法控制将新元素附加到滚动容器的代码 . 我在这里找到的所有例子都没有让我这样做 . 这是我最终得到的解决方案 .
它使用
Mutation Observers
(https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver),这使它只能在现代浏览器上使用(尽管存在polyfill)所以基本上代码就是这样:
我做了一个小提琴来演示这个概念:https://jsfiddle.net/j17r4bnk/
Java脚本:
document.getElementById('messages').scrollIntoView(false);
滚动到当前内容的最后一行 .
一个非常简单的方法是将
scroll to
设置为div的高度 .我知道这是一个老问题,但这些解决方案都不适用于我 . 我最终使用offset() . top来获得所需的结果 . 以下是我习惯轻轻地 scroll the screen down 到聊天应用程序中的最后一条消息:
我希望这有助于其他人 .