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

JavaScript无限循环滚动异常:右方向仅两轮后停止

React无限滚动问题:右方向滚动两轮后无新对象出现

我尝试用React结合JavaScript实现无限滚动效果,对象左方向滚动时能正常无限循环,但右方向滚动两轮后,就不再有新对象出现。

  • scroll:平滑滚动因子

代码实现

import { useRef, useEffect } from "react";
import Physics from "./Physics";
import { useStateValue } from "./StateProvider";

export function App() {
  return (
    <>
      <Boxes />
      <Physics />
    </>
  );
}

const totalbox = 16;

export const Boxes = () => {
  return (
    <>
      {Array(totalbox)
        .fill(totalbox)
        .map((num, i) => (
          <BoxDetail key={i} keyindex={i} />
        ))}
    </>
  );
};

const BoxDetail = ({ keyindex }) => {
  const [{ pos: scroll }] = useStateValue();
  const boxRef = useRef();

  // 总宽度:所有盒子的宽度+间距之和
  const margin = 50;
  const width = 50;
  const WHOLEWIDTH = totalbox * (margin + width);

  function calcPos(_scroll, _position) {
    const temp =
      ((_scroll + _position + margin + width + WHOLEWIDTH) % WHOLEWIDTH) - margin - width;

    return temp;
  }

  useEffect(() => {
    const boxPos = 100 * keyindex;
    boxRef.current.style.left = `${calcPos(scroll, boxPos)}px`;
  }, [scroll, calcPos]);

  return (
    <>
      <div
        ref={boxRef}
        style={{
          border: '1px solid red',
          position: 'absolute',
          color: 'blue',
          margin: '0px',
          width: '50px',
          height: '50px',
        }}
      >
        box {keyindex}
      </div>
    </>
  );
};

滚动效果

右方向滚动

右方向滚动

左方向滚动

左方向滚动


问题原因与修复

问题根源

问题出在calcPos函数的位置计算逻辑上:
当向右滚动时,scroll值持续增大,计算后的temp会变成负数。这些负数位置的元素会被定位到可视区域左侧之外,而向右滚动时用户看不到左侧的元素,因此误以为没有新对象出现;但向左滚动时,这些左侧的元素会重新进入可视区域,所以左方向滚动正常。

修复代码

修改calcPos函数,确保计算出的位置始终在0到WHOLEWIDTH之间,让元素在滚动时能从正确的一侧进入可视区域:

function calcPos(_scroll, _position) {
  // 计算偏移量,确保结果始终为非负值
  const offset = (_scroll + _position) % WHOLEWIDTH;
  return offset < 0 ? offset + WHOLEWIDTH : offset;
}

或者用更简洁的写法处理负数取模的问题:

function calcPos(_scroll, _position) {
  return ((_scroll + _position) % WHOLEWIDTH + WHOLEWIDTH) % WHOLEWIDTH;
}

修改后,向右滚动时,元素会在移出右侧可视区域后,从右侧重新进入视野,实现完整的无限滚动循环。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:30:40