移动端列表平滑滚动需将 scroll-behavior: smooth 显式加在可滚动容器上,而非 html;iOS Safari 15.4 前不支持,JS 调用 scrollIntoView({ behavior: 'smooth' }) 最可靠,但需确保容器渲染完成、目标存在,并配合降级方案与性能优化。
移动端列表平滑滚动不能只靠 scroll-behavior: smooth 写在 html 上——它对自定义滚动容器(比如带 overflow-y: auto 的列表)才真正起作用,且 iOS Safari 15.4 之前完全不支持,16+ 也仅限 JS 主动调用生效。
html 加 scroll-behavior: smooth 对列表无效因为 scroll-behavior 只作用于「实际发生滚动的容器」。整页滚动容器是 html,但列表滚动发生在某个 div 内部,它的滚动上下文和 html 是隔离的。
scroll-behavior: smooth 显式加到那个可滚动的列表容器上,例如:.list-container { overflow-y: auto; scroll-behavior: smooth; }
overflow: hidden 或没设高度/溢出,scroll-behavior 直接被忽略transform 容器,导致目标元素脱离标准滚动流,此时即使样式写了也不触发平滑scrollIntoView({ behavior: 'smooth' }) 在列表里怎么用才不翻车这是目前最可靠的方式,但时机和目标必须精准,否则滚动位置错乱或根本不动。
offsetTop 为 0:用 requestAnimationFrame 包一层再执行window 或 document.scrollingElement 调用,而是对列表容器内的目标元素调用:targetEl.scrollIntoView({ behavior: 'smooth', block: 'nearest' })
typeof Element.prototype.scrollIntoView === 'function' && 'behavior' in ScrollIntoViewOptions.prototype
react-window),目标元素可能尚未挂载,得配合 ref 和 onItemsRendered 回调触发它们常把 behavior: 'smooth' 当作非法参数忽略,不报错,但滚动变成硬跳。
立即学习“前端免费学习笔记(深入)”;
'scrollBehavior' in document.documentElement.style 做判断——这只能测 CSS 属性,不能反映 JS API 支持度el.scrollIntoView({ behavior: 'smooth' }),监听 scroll 事件是否在 100ms 内连续触发(平滑滚动会发多次)WebView 初始化时显式开启(如 Android 端配 webSettings.setSmoothScrollingEnabled(true))scrollTo + requestAnimationFrame 实现简易缓动,比引入 full polyfill 更轻量最易被忽略的一点:平滑滚动不是纯视觉效果,它会改变滚动事件频率、焦点顺序,甚至影响屏幕阅读器朗读节奏。尤其在长列表中频繁调用 scrollIntoView,主线程压力会明显上升——别在 touchmove 或 scroll 监听里直接调用,务必节流或改用 passive 事件。