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

React应用中overflow属性导致window.scrollY取值异常如何解决?

问题根因

你给.app .mask设置了overflow:auto,同时该元素是绝对定位撑满整个视口的,此时页面的滚动行为发生在mask元素内部,而非window全局,所以window.scrollY永远返回0,自然无法正常取值。
当你移除overflow:auto后,mask的内部内容会溢出到外层,滚动行为回到window上,window.scrollY可以正常取值,但此时mask是绝对定位脱离文档流,父元素.app的高度只有min-height:100vh,不会跟着内部内容撑高,所以背景图只能覆盖100vh的高度,超出部分就出现空白,效果如下图:
背景异常效果图

解决方案(二选一即可)

方案1:修改滚动监听对象,适配现有CSS

不需要改动现有样式,只需要把原来监听window滚动的逻辑,改成监听mask元素的滚动即可,修改你的Test组件代码:

import React, { useEffect, useState } from "react";

export default function Test() {
  const [offset, setOffset] = useState(0);
  const setScroll = (e) => {
    // 从mask元素取滚动高度
    setOffset(e.target.scrollTop);
  };

  useEffect(() => {
    // 获取mask元素
    const maskEle = document.querySelector('.app .mask');
    maskEle.addEventListener("scroll", setScroll);
    return () => {
      maskEle.removeEventListener("scroll", setScroll);
    };
  }, []);

  return (
    <div>
      <div style={{color:"red"}}>{offset}</div>
    </div>
  );
}

方案2:调整CSS结构,让window成为滚动容器

修改样式逻辑,移除mask的绝对定位和overflow属性,让滚动行为回归window,同时保证背景自适应内容高度:
首先修改custom.css的对应代码:

/* 先重置全局默认边距 */
html, body {
  margin: 0;
  padding: 0;
}

.app .mask{
  /* 移除原有绝对定位、上下左右置0、overflow:auto属性 */
  min-height: 100vh;
  color:#fff;
  background-color:rgba(0, 0, 0, 0.6);
}

调整后滚动的就是window,你原来的window.scrollY监听代码可以正常使用,背景图也会跟着父元素.app的高度自动撑开,不会出现底部空白。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:36:07