React里用useRef做视差滚动为啥没效果?
我照着教程用 useRef 和 useEffect 写了个简单的视差效果,但图片根本不动,是哪里写错了吗?
控制台也没报错,scrollY 的值看起来是对的,但 transform 样式就是没应用上。
const Parallax = () => {
const ref = useRef(null);
useEffect(() => {
const handleScroll = () => {
if (ref.current) {
const scrollY = window.scrollY;
ref.current.style.transform = <code>translateY(${scrollY * 0.5}px)</code>;
}
};
window.addEventListener('scroll', handleScroll);
return () => window.removeEventListener('scroll', handleScroll);
}, []);
return <img ref={ref} src="/bg.jpg" alt="parallax" />;
};
视差效果要生效,图片通常需要
position: fixed或者position: absolute加上top: 0之类的定位,否则图片会跟着页面一起滚,你设置 transform 的时候它其实已经在视口外面了。你检查一下图片的 CSS 样式,大概需要这样的配置:
另外提醒一下,直接改 DOM 的 style 在 React 里虽然能跑,但容易遇到 React 重新渲染时被覆盖的情况。更稳妥的做法是用 state:
这样 React 能更好地管理样式更新,也不用担心被覆盖的问题。