js实现左右列表对齐(左边点击时,右边滚动和左边对齐。反之右边点击时,左边滚动和右边对齐)

53 篇文章 3 订阅
25 篇文章 0 订阅

需求:

js实现左右列表对其(左边点击时,右边滚动和左边对齐。反之右边点击时,左边滚动和右边对齐)
效果示意图:
效果示意图
点击6666的效果图如下:
效果图

实现代码:

思路:

1…需要一个东西把两个列表里的项关联起来,我用的id。左边就是left+id ,右边是 right+id.
2…点击左侧,右边滚动。获取当前点击的元素距离其父元素的顶部距离(offsetTop),右则相同id距离其父元素的顶部距离(offsetTop)。左则距离-右侧距离 。当左侧有滚动时,则需要左则距离-右侧距离 + 左侧滚动距离

3…点击右侧,左边滚动。
jsx代码:

const Home1 = () => {
  const listRef = useRef([]);
  const list = [
    {
      text: "555555",
      id: 1
    },
    {
      text: "6666",
      id: 2
    },
    {
      text: "7777",
      id: 3
    },
    {
      text: "8888",
      id: 4
    },
    {
      text: "9999",
      id: 5
    },
    {
      text: "10000",
      id: 6
    }
  ];

  const clickTxt = (id) => { //点击左侧事件
    let domId = "right" + id;
    let dom = document.getElementById(domId);
    let right = document.getElementById("right");
    const offsetTop = dom.offsetTop;

    let domIdL = "left" + id;
    let domL = document.getElementById(domIdL);
    let left = document.getElementById("left");
    const offsetTopL = domL.offsetTop;
    let scrollNum
    if (left.scrollTop > 0) { //左侧 滚动距离 大于0 则 右-左
      scrollNum = offsetTop - offsetTopL + left.scrollTop;
    } else {
      scrollNum = offsetTop - offsetTopL;
    }
    right.scrollTop = scrollNum;
  }


  const clickTxt1 = (id) => { //点右侧事件
    let domId = "left" + id;
    let dom = document.getElementById(domId);
    let left = document.getElementById("left");
    const offsetTop = dom.offsetTop;

    let domIdR = "right" + id;
    let domR = document.getElementById(domIdR);

    const offsetTopR = domR.offsetTop;
    let scrollNum
    if (right.scrollTop > 0) { //右侧 滚动距离 大于0 则 左-右
      scrollNum = offsetTop - offsetTopR + right.scrollTop;
    } else {
      scrollNum = offsetTop - offsetTopR;
    }
    left.scrollTop = scrollNum;
  }
  return (
    <div className={styles.home1} style={{ height: '100vh', padding: 20 }}>
      <div className={styles.left} id='left'>

        {
          list.map((item, index) => {
            return <div onClick={() => clickTxt(item.id)} className={styles.item} key={index} id={"left" + item.id}>
              {
                item.text
              }
            </div>
          })
        }
      </div>

      <div className={styles.right} id='right'>
        {
          list.map((item, index) => {
            return <div onClick={() => clickTxt1(item.id)} className={styles.itemRight} key={index} id={"right" + item.id}>
              {
                item.text
              }
            </div>
          })
        }
      </div>
    </div>
  )
}

export default Home1

less代码:

.home1{
    display: flex;
    
}
.left,.right{
    width: 50%;
    height: 100%;
    height: 900px;
    overflow-y: auto;
}
.item{
    width: 100%;
    height: 200px;
    border: 1px solid red;
    cursor: pointer;
}
.itemRight{
    width: 100%;
    height: 300px;
    border: 1px solid gray;
    cursor: pointer;
}

总结:

我这个是react里实现的,不过 主要是思路和代码,这个代码js,vue基本都能用。还可以改用ref,不用 documnet。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

崽崽的谷雨

漫漫前端路,摸爬滚打

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值