我正在设置scrollTop动画,以保持聊天视图在底部显示最新消息。
在加载会话和发送消息后,我会触发以下方法:
loadMessages(matchId) {
...
// ..filling the messages array..
this.scrollToBottom();
...
}
sendMessage(matchId) {
...
// ..updating the messages array..
this.scrollToBottom();
...
}
scrollToBottom() {
const div = document.getElementById('contentArea');
div.scrollTop = div.scrollHeight;
}
chat.css:
.contentArea {
margin-left: auto;
margin-right: auto;
margin-top: 10px;
margin-bottom: 20px;
width: 90%;
height: 60%;
background-color: rgba(255, 255, 255, 0.267);
border-radius: 10px;
overflow-x: hidden;
overflow-y: visible;
}
我需要单击loadMessages()
两次,以使滚动发生,发送消息时,同样的事情,我需要发送两条消息,以使内容滚动到两条消息中的第一条。 / p>
看来我必须两次document.getElementById('contentArea')
才能获得正确的值。
我想我第一次调用该函数太早而无法获得正确的值。
我该怎么办?谢谢!
答案 0 :(得分:0)
我认为这里正在发生的事情是您正在操纵DOM并试图立即读取更新的DOM值。
应用于DOM元素的更改不会立即应用,在一个执行周期内对DOM所做的所有更改都会被收集并一次重涂。
因此,您需要等待重新绘制完成,然后才能尝试读取元素的更新尺寸。
requestAnimationFrame
是在每次重新绘制之前执行的方法,您可以使用它来计算下一次重新绘制之前的scrollHeight
,即,它将在当前重新绘制之后被调用,并且您将获得正确的{{ 1}}值
scrollHeight
PS:此解决方案基于以下假设:您是在DOM操作之后直接调用
scrollToBottom() { window.requestAnimationFrame(function () { const div = document.getElementById('contentArea'); div.scrollTop = div.scrollHeight; }); }
方法,因此我不确定这是否正在发生,因为您没有与您的scrollToBottom
通话共享代码。但是根据您的方法名称和注释,我想这就是您遇到问题的原因。