feat:解决强制滚动的问题

This commit is contained in:
Roe-xin
2025-12-25 11:00:23 +08:00
parent 2e6812d00d
commit ef83016b7f

View File

@ -556,6 +556,19 @@ export function getMessageAreaScript(): string {
return toolNameMap[toolName] || toolName; return toolNameMap[toolName] || toolName;
} }
// 检查用户是否在底部附近允许50px的误差
function isUserNearBottom() {
const threshold = 50;
return messagesEl.scrollHeight - messagesEl.scrollTop - messagesEl.clientHeight < threshold;
}
// 智能滚动:只有用户在底部附近时才自动滚动
function smartScrollToBottom() {
if (isUserNearBottom()) {
messagesEl.scrollTop = messagesEl.scrollHeight;
}
}
// 添加消息 // 添加消息
function addMessage(text, sender) { function addMessage(text, sender) {
const div = document.createElement('div'); const div = document.createElement('div');
@ -602,7 +615,7 @@ export function getMessageAreaScript(): string {
} }
messagesEl.appendChild(div); messagesEl.appendChild(div);
messagesEl.scrollTop = messagesEl.scrollHeight; smartScrollToBottom();
// 添加消息后检查 header 显示状态 // 添加消息后检查 header 显示状态
checkHeaderVisibility(); checkHeaderVisibility();
@ -672,8 +685,8 @@ export function getMessageAreaScript(): string {
} }
} }
// 滚动到底部 // 智能滚动到底部
messagesEl.scrollTop = messagesEl.scrollHeight; smartScrollToBottom();
} }
// 完成流式消息 // 完成流式消息
@ -699,7 +712,7 @@ export function getMessageAreaScript(): string {
currentStreamingMessage = null; currentStreamingMessage = null;
} }
messagesEl.scrollTop = messagesEl.scrollHeight; smartScrollToBottom();
} }
// 显示加载指示器 // 显示加载指示器
@ -715,7 +728,7 @@ export function getMessageAreaScript(): string {
<span class="loading-text">\${text}</span> <span class="loading-text">\${text}</span>
\`; \`;
messagesEl.appendChild(loadingIndicator); messagesEl.appendChild(loadingIndicator);
messagesEl.scrollTop = messagesEl.scrollHeight; smartScrollToBottom();
} }
// 隐藏加载指示器 // 隐藏加载指示器
@ -930,8 +943,8 @@ export function getMessageAreaScript(): string {
currentSegmentedMessage = null; currentSegmentedMessage = null;
} }
// 滚动到底部 // 智能滚动到底部
messagesEl.scrollTop = messagesEl.scrollHeight; smartScrollToBottom();
} }
// 渲染分段消息(兼容旧代码) // 渲染分段消息(兼容旧代码)
@ -1067,7 +1080,7 @@ export function getMessageAreaScript(): string {
container.appendChild(actionsDiv); container.appendChild(actionsDiv);
messagesEl.appendChild(container); messagesEl.appendChild(container);
messagesEl.scrollTop = messagesEl.scrollHeight; smartScrollToBottom();
} }
// 格式化文本(支持 Markdown // 格式化文本(支持 Markdown
@ -1138,7 +1151,7 @@ export function getMessageAreaScript(): string {
\${detail ? \`<div class="tool-detail">\${detail}</div>\` : ''} \${detail ? \`<div class="tool-detail">\${detail}</div>\` : ''}
\`; \`;
messagesEl.appendChild(div); messagesEl.appendChild(div);
messagesEl.scrollTop = messagesEl.scrollHeight; smartScrollToBottom();
// 添加消息后检查 header 显示状态 // 添加消息后检查 header 显示状态
checkHeaderVisibility(); checkHeaderVisibility();
@ -1198,7 +1211,7 @@ export function getMessageAreaScript(): string {
div.appendChild(customContainer); div.appendChild(customContainer);
messagesEl.appendChild(div); messagesEl.appendChild(div);
messagesEl.scrollTop = messagesEl.scrollHeight; smartScrollToBottom();
// 添加消息后检查 header 显示状态 // 添加消息后检查 header 显示状态
checkHeaderVisibility(); checkHeaderVisibility();