当前位置: 首页 > 知识库问答 >
问题:

react.js - 实现虚拟列表过程中出现滚动条抖动问题该怎么解决?

凤安然
2023-08-19

学习实现虚拟列表的过程中,让类名为holder的元素不占据高度的情况下,发现页面在往下滚动的过程中出现滚动条抖动的问题,并且是反复抽搐,为什么会出现这样的情况

export default function VirtualList() {  const [position, setPosition] = useState({ start: 0, end: 0 });  const [data, setData] = useState([]);  const listBoxRef = useRef();  const contentRef = useRef();  const scrollInfo = useRef({    itemHeight: 60,    bufferCount: 8,    renderCount: 0  });  useEffect(() => {    const { itemHeight, bufferCount } = scrollInfo.current;    const { height } = listBoxRef.current.getBoundingClientRect();    const renderCount = Math.ceil(height / itemHeight) + bufferCount;    const dataList = new Array(10000).fill(0).map((_, index) => index + 1);    scrollInfo.current = { ...scrollInfo.current, renderCount };    setData(dataList);    setPosition({ start: 0, end: renderCount });  }, []);  const handleScroll = () => {    const { itemHeight, renderCount } = scrollInfo.current;    const scrollTop = listBoxRef.current.scrollTop;    console.log('scrollTop', scrollTop);    const start = Math.floor(scrollTop / itemHeight);    const end = start + renderCount;    // contentRef.current.style.transform = `translate3d(0, ${scrollTop}px, 0)`;    if (start !== position.start || end !== position.end) {      setPosition({ start, end });    }  };  console.log(position);  const { itemHeight } = scrollInfo.current;  return (    <div className="list-box" ref={listBoxRef} onScroll={handleScroll}>      <div        className="holder"        style={{ height: `${itemHeight * data.length}px` }}      ></div>      <div className="content-area" ref={contentRef}>        {data.slice(position.start, position.end).map((item) => (          <div key={item} className="item">            {item}          </div>        ))}      </div>    </div>  );}
.item {  list-style: none;  background-color: #fc4838;  padding: 10px 20px;  color: #fff;  height: 50px;  line-height: 50px;  box-sizing: border-box;  margin-bottom: 10px;  margin-left: 24px;  margin-right: 24px;  font-weight: bold;  border-radius: 10px;}.list-box {  position: fixed;  left: 0;  right: 0;  top: 20px;  bottom: 0;  overflow: scroll;}.holder {  position: absolute;  top: 0;  left: 0;  right: 0;}

共有1个答案

冯元魁
2023-08-19

浏览器滚动锚点导致,要么你每次滚动后重设scrollTop,要么css取消滚动锚点:overflow-anchor: none

 类似资料:
  • 本文向大家介绍vue实现列表滚动的过渡动画,包括了vue实现列表滚动的过渡动画的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Vue实现列表滚动过渡动画的具体代码,供大家参考,具体内容如下 效果图 失帧比较严重,在手机上效果更佳。 原理分析 这个滚动页面由两个部分布局(底部固定的Tab页面除外)。一个是顶部的banner轮播,一个是下面的列表。这里的重点是做列表的动画,banner轮

  • 本文向大家介绍怎么让table的thead 不动,tbody出现滚动条呢?相关面试题,主要包含被问及怎么让table的thead 不动,tbody出现滚动条呢?时的应答技巧和注意事项,需要的朋友参考一下

  • vue怎么实现滚动条隐藏但有滚动效果

  • 现在的情况是:当内部滚动条滚动到底部时如果继续滚动,外部滚动条不会滚动,需要停顿或者移动鼠标滚动才能触发外层滚动条

  • 当我使用JFileChooser时,第一次使用它的滚动条时,我会得到以下错误消息的两到四个副本: 以下是具有此行为的示例代码: 我的Swing程序继续运行(大部分),但这让我感到困扰。这是什么原因造成的,我该如何避免? Mac OS X 10.11.2 El Capitan java version“1.8.0\u 66” java(TM)SE Runtime Environment(build

  • 本文向大家介绍虚拟机linux安装redis实现过程解析,包括了虚拟机linux安装redis实现过程解析的使用技巧和注意事项,需要的朋友参考一下 redis官网 website-adress 安装步骤 1.先按照官网下方的weget命令把redis下载下来 接着如果没猜错,你会在make命令上出错 由于redis是C写的,所以需要装上c的运行环境 yum install gcc-c++ 接着你还