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

为何滚动页面时window.scrollY值始终不变化?

问题分析与解决办法

最可能的原因:滚动容器不是window

如果页面里存在某个容器(比如<body>、自定义<div>)设置了overflow: scroll或overflow: auto,且实际滚动操作是针对这个容器而非整个window,那么window.scrollY自然不会发生变化。

解决步骤:

  1. 检查页面CSS,确认是否有元素设置了height: 100vh+overflow: scroll这类样式,导致滚动范围被限制在该元素内部。
  2. 将滚动事件监听绑定到实际滚动的容器上,用该元素的scrollTop属性替代window.scrollY:
// 示例:假设滚动容器是id为scrollContainer的div
const scrollContainer = document.getElementById('scrollContainer');

useEffect(() => {
  function changeColor() {
    const scrolled = scrollContainer.scrollTop > 60;
    console.log(scrolled);
    setColor(scrolled);
  }

  scrollContainer.addEventListener('scroll', changeColor);
  // 组件卸载时移除监听,避免内存泄漏
  return () => scrollContainer.removeEventListener('scroll', changeColor);
}, []);

其他可能的问题点

  • 事件监听时机错误:如果你的代码直接写在组件顶层(而非useEffect钩子内),会导致组件每次渲染都重复添加监听,甚至在组件未挂载时就执行,可能引发异常。需将事件监听放在useEffect中,确保组件挂载后再绑定:
useEffect(() => {
  function changeColor() {
    const scrolled = window.scrollY > 60;
    console.log(scrolled);
    setColor(scrolled);
  }

  window.addEventListener('scroll', changeColor, true);
  return () => window.removeEventListener('scroll', changeColor, true);
}, []);
  • 捕获模式的潜在冲突:你给监听事件传了第三个参数true(捕获模式),虽然一般不影响scrollY的取值,但如果页面内有其他阻止滚动事件冒泡的代码,可能导致事件触发异常,可以尝试改为false(冒泡模式)测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:52:03