You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移动端导航失效、点击transition元素或input聚焦页面跳顶部问题求助

问题根因定位

三个异常表现的核心诱因完全一致:你给 html、body 根元素设置了 height: 100% 或 overflow: hidden 规则,采用了自定义内部容器实现页面滚动,而非使用浏览器原生的文档滚动能力。移动端浏览器在元素触发重绘(transition 动画执行、input 获焦弹出软键盘)时,会错误识别滚动容器,直接将根滚动位置重置为 0,进而触发所有异常。
你之前尝试的保留滚动位置方案逻辑存在错误:你将滚动位置赋值给了当前点击的元素,而非实际承担滚动能力的容器,自然无法生效。

可行解决方案

  • 优先采用方案1:移除 html、body 上的 height: 100%、overflow: hidden 相关样式规则,直接使用浏览器原生页面滚动能力,所有滚动逻辑交还给默认的 document 滚动容器,即可一次性修复所有异常,是兼容性最好的处理方式。
  • 若业务逻辑必须保留自定义内部滚动容器,采用方案2:手动监听重绘触发时机,记录并回设滚动位置,正确实现代码如下:
let lastScrollTop = 0;
// 替换为你实际承担页面滚动的容器元素
const scrollContainer = document.documentElement; 

// 处理带transition元素的点击异常
document.querySelectorAll('[style*="transition"], [class*="transition"]').forEach(el => {
  el.addEventListener('click', () => {
    lastScrollTop = scrollContainer.scrollTop;
    setTimeout(() => scrollContainer.scrollTop = lastScrollTop, 0);
  });
});

// 处理input获焦异常
document.querySelectorAll('input').forEach(el => {
  el.addEventListener('focus', () => {
    lastScrollTop = scrollContainer.scrollTop;
    // 延迟匹配软键盘弹出时机,避免赋值被软键盘弹出逻辑覆盖
    setTimeout(() => scrollContainer.scrollTop = lastScrollTop, 100);
  });
});
  • 同步修复移动端导航异常:将导航点击事件直接绑定到按钮最内层元素,避免事件冒泡触发父元素的重绘逻辑即可。

内容的提问来源于stack exchange,提问作者Bronx Branx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 10:12:01