美文网首页
同步滚动的解决方案

同步滚动的解决方案

作者: 爱翔是我二媳妇 | 来源:发表于2021-01-11 16:39 被阅读0次

    问题引入

    部分场景需要用到两个文本输入框联动滚动的情况,如下:


    scroll.gif

    关键属性

    scrollTop 可读可写的dom属性,标识元素滚动距离顶部的距离。

    实现思路

    1.将两个需要同步滚动的元素分别绑定上onScroll,监听event变化,以及用于获取dom的id

    <TextArea
      id='rightScroll'
      onScroll={(e)=>handleScroll(e, 'leftScroll')}
    />
    <TextArea
      id='leftScroll'
      onScroll={(e)=>handleScroll(e, 'rightScroll')}
    />
    

    2.handleScroll方法中,获取到scrollTop并将另一个textarea的scrollTop也修改
    注意:如果仅仅这样做,会触发重复执行,因为rightScrollscrollTop更改后,修改leftScroll时,也会触发leftScrollonScroll。需要判断相邻两次滚动的值是否相等,不相等再触发修改。

    
      handleScroll = (e, goal) => {
        const { scrollTop } = e.target;
        const { inputScroll, scrollLock } = this.state;
          const doc = document.getElementById(goal);
          if (doc && inputScroll !== scrollTop) {
            doc.scrollTop = scrollTop;
            this.setState({
              inputScroll: scrollTop,
            });
          }
      };
    

    3.针对textarea的滚动,当左右元素的实际高度不同时,会导致其中一个已经滚到底了,另一个还能继续滚动的情况。可以考虑获取两个textarea的行数差,用换行符填充\n较短的那一个。

    相关文章

      网友评论

          本文标题:同步滚动的解决方案

          本文链接:https://www.haomeiwen.com/subject/cfudaktx.html