html { overflow-anchor: auto; }
[data-theme] * { transition: background-color .2s, color .2s; }
在长文页面底部切主题,页面瞬间回弹 80px,正在读的那段跑出视口,移动端每次都能复现。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,切换时改了根字号或边框宽度,文档高度变化触发重排,浏览器重新计算滚动锚点。滚动容器上还写了 scroll-behavior: smooth,回弹被放大。
「主题切换重排」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
处理上按这个顺序:切换只改颜色变量 不动字号、边框宽度和间距;给滚动容器加 overflow-anchor 保持锚点;在长文中部切换 对比切换前后的滚动位置。
改完只确认一件事:长文中部切换主题后仍停在原来那段,不再回弹。
