From 493c7f64163e6169220462b06ba34f9c29131014 Mon Sep 17 00:00:00 2001 From: LuminousRuoxi <2494735589@qq.com> Date: Thu, 10 Sep 2026 16:54:53 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=B7=A6=E6=A0=8F=E6=89=93=E5=BC=80?= =?UTF-8?q?=E6=97=B6=E6=BB=9A=E5=8A=A8=E6=9D=A1=E5=81=9C=E5=9C=A8=E6=9C=80?= =?UTF-8?q?=E4=B8=8B=E9=9D=A2=EF=BC=88=E5=BA=94=E9=BB=98=E8=AE=A4=E5=9C=A8?= =?UTF-8?q?=E9=A1=B6=E9=83=A8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 根因: 浏览器刷新会恢复内层滚动容器的位置,且恢复时机可能晚于渲染; 之前 renderOriginalPane 无条件沿用旧 scrollTop,打开即停在底部(用户实测) - renderOriginalPane 加 keepScroll 参数:默认回顶部(首次渲染/切段/切视图), 仅翻译与对照展开/收起保持位置(这两处是内容更新,沿用位置才不跳) - 首次渲染后再延迟固定一次顶部,对抗浏览器延迟的滚动恢复 - 验证: 打开/刷新/切段/切聚焦全文 均回顶部,翻译保持位置;长内容 5/5 + 核心场景 5/6 (1 项为测试内容过短滚不动的断言误报) --- index.html | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/index.html b/index.html index 4851280..b84da7f 100644 --- a/index.html +++ b/index.html @@ -1042,12 +1042,14 @@ function updateParagraphSwitcherState(){ btn.classList.toggle('has-copy', hasRewrite(i)); }); } -function renderOriginalPane(){ +// keepScroll=true 时保留当前滚动位置(翻译/对照展开这类内容更新); +// 默认回到顶部 —— 切段/首次渲染/切视图若沿用旧位置,会停在上次滚到的 +// 位置(浏览器刷新后也会自动恢复内层滚动容器的位置,表现为"一打开就在 +// 最下面",用户实测)。 +function renderOriginalPane(keepScroll){ const wrap=$('#originalFull'); - // 重建 DOM 前记住滚动位置:「查看之前的写作建议」展开后点翻译/切视图等 - // 都会走到这里,不恢复会导致内容跳回顶部 const body = wrap.closest('.pane-body'); - const scrollTop = body ? body.scrollTop : 0; + const scrollTop = keepScroll && body ? body.scrollTop : 0; wrap.innerHTML=''; if(originalView==='focus') renderFocusOriginal(wrap); else renderFullOriginal(wrap); renderParagraphSwitcher(); @@ -1216,7 +1218,7 @@ async function toggleOrigTranslate(){ const fresh = rec && rec.text === text; if(fresh){ origTranslateOpen[i] = !origTranslateOpen[i]; - persistNow(); renderOriginalPane(); + persistNow(); renderOriginalPane(true); return; } const sentences = splitSentences(text); @@ -1233,7 +1235,7 @@ async function toggleOrigTranslate(){ if(btn){ btn.disabled = false; btn.textContent = '翻译失败,点击重试'; } return; } - renderOriginalPane(); + renderOriginalPane(true); } function resetHelpPanels(){ const key = pidOf(current); @@ -1262,6 +1264,12 @@ function renderWorkbench(){ resetHelpPanels(); updateProgress(); renderRecheckHistory(); + // 首次渲染后再固定一次顶部:浏览器刷新会恢复内层滚动容器位置, + // 其恢复时机可能晚于本次渲染(用户实测「一打开就在最下面」)。 + if(!renderWorkbench._pinnedTop){ + renderWorkbench._pinnedTop = true; + setTimeout(()=>{ const b = $('#originalFull') && $('#originalFull').closest('.pane-body'); if(b) b.scrollTop = 0; }, 150); + } } async function submitConstraint(){ const input = $('#constraintInput');