react的左右联动

2023-11-14

效果图

 

 

 

 

 

这是css的代码

body {
    margin: 0;
  }
  .linkage {
    width: 100vw;
    height: 100vh;
    display: flex;
    .linkage-button {
      width: 20vw;
      height: 100vh;
      background: rgb(10, 253, 233);
      text-align: center;
      font-size: 40px;
      color: #fff;
      overflow: scroll;
      scroll-behavior: smooth;
      .linkage-button-list {
        width: 20vw;
        // scroll-behavior:smooth
        .linkage-button-item.ac {
          background: lightblue;
        }
        .linkage-button-item {
            scroll-behavior: smooth;
          width: 20vw;
          height: 10vh;
          line-height: 10vh;
        }
      }
    }
    .linkage-content {
      width: 80vw;
      height: 100vh;
      scroll-behavior: smooth;
      overflow: scroll;
      .linkage-content-list {
        .linkage-content-item {
            position: sticky;
            top: 0;
          width: 80vw;
          height: 100vh;
          .linkage-content-title {
            height: 6vh;
            line-height: 6vh;
            width: 80vw;
            text-align: center;
            background: rgb(68, 0, 255);
            color: #fff;
            font-size: 30px;
          }
        }
      }
    }
  }
  .linkage-button::-webkit-scrollbar {
    display: none; /* Chrome Safari */
  }
  .linkage-content::-webkit-scrollbar {
    display: none; /* Chrome Safari */
  }

这是js的代码

import { Component } from 'react'

import './linkage.less'


class LinkAge extends Component {
  constructor(...args) {
    super(...args);
    this.state = {
      LeftButton: [],
      RightList:[],
      Active:0
    }
    this.ButtonList=[]
    this.ContentList=[]
    this.ScrollBys= true
    this.ContTop=[0]

  }

  FnSetButton(n) {
    for (var i = 0; i < n; i++) {
      this.ButtonList.push({
        id: `按钮${i}`,
        text: `按钮${i}`,
      });
    }

    // console.log(this.state.LeftButton)
  }
  componentDidMount() {
    this.FnSetButton(19)
    this.FnSetContent(19)
    this.setState({
      LeftButton: this.ButtonList,
      RightList: this.ContentList
    });




  }
  FnSetContent(n) {
    let ContTop = 0; //第一个元素距离页面顶部的距离
    let Random = this.FnSetRandom(1400, 750);
    for (let i = 0; i < n; i++) {
      this.ContentList.push({
        height: Random,
        id: `内容${i}`,
        text: `内容${i}`,
        top: ContTop,
      });
      ContTop += Random;
    }
  }
  FnSetRandom(m, n) {
    return parseInt(Math.random() * (m - n) + n);
  }
  FnClick(index,ev){
    this.ScrollBys = false;
    this.setState({
      Active:index

    })
    this.refs["linkage-content"].scrollTop = this.ContentList[index].top;
    

    this.ow = ev.target.parentNode.parentNode.offsetHeight / 2
    console.log( ev.target )
    this.top = ev.target.offsetTop - this.ow + ev.target.offsetHeight / 2;
    ev.target.parentNode.parentNode.scrollTo({
        top: this.top,
    });
    
   
  }
  FnScroll() {
    this.leftHeight =this.refs["linkage-button-list"].querySelector(".linkage-button-item").offsetHeight;

    // var scrollTop = this.$refs[""].scrollTop;
    this.ContTop = this.refs["linkage-content"].scrollTop;
    if (this.ScrollBys) {
      let n = 0;
      for (let i = 0; i < this.ContentList.length; i++) {
        if (
          this.refs["linkage-content"].scrollTop >= this.ContentList[i].top
        ) {
          //盒子滚动的距离如果大于右边盒子里的元素距离页面顶部的距离
           // 如果 dom滚动位置 >= 元素距离视窗距离 && dom滚动位置 <= 元素距离视窗距离+元素本身高度
          // if (
          //   scrollTop >= offsetTop - headerHeight &&
          //   scrollTop <= offsetTop - headerHeight + scrollHeight
          // ) 
          // if (i > 4) {
          //   this.refs["linkage-button"].scrollTop = (i - 4) * this.leftHeight;
            
          // }
          // if (i <= 1) {
          //   this.refs["linkage-button"].scrollTop = 0;
          // }
          n = i;
          console.log(this.leftHeight)
        }

      }
      this.setState({
        Active : n
      })
     
    }
    if (this.ContTop == this.ContentList[this.state.Active].top) {
      this.ScrollBys = true;
    }

    this.current = Math.ceil((this.refs['linkage-button'].clientHeight) / this.refs['linkage-button-list'].querySelector('.linkage-button-item').offsetHeight / 2)-0.5
        if (this.state.Active > this.current) {//center当前变化的值,current,中间的那个值
            this.refs['linkage-button'].scrollTop = this.refs['linkage-button-list'].querySelector('.linkage-button-item').offsetHeight * (this.state.Active - this.current)
        } else {
            this.refs['linkage-button'].scrollTop = 0
        }
  }
  

  render() {
    return (<div>
      <div className="linkage">
        <div className="linkage-button" ref="linkage-button">
          <div className="linkage-button-list" ref="linkage-button-list">
            {this.state.LeftButton.map((item,index) => (
              <div onClick={this.FnClick.bind(this,index)} className={this.state.Active ===index?"linkage-button-item ac":"linkage-button-item"} key={item.id}>
                {item.text}
              </div>))

            }

          </div>
        </div>
        <div className="linkage-content" ref="linkage-content" onScroll={this.FnScroll.bind(this)} >
          <div className="linkage-content-list" >
            {this.state.RightList.map((item) => (
              <div key={item.id} style={{height:item.height}} className="linkage-content-item">
                <div className="linkage-content-title">{ item.text }</div>
              </div>
            ))

            }

          </div>
        </div>
      </div>
    </div>)
  }

}
export default LinkAge

复制就可以用了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react的左右联动 的相关文章

随机推荐

  • 43岁读博士,无关年龄

    本文来源 西湖大学WestlakeUniversity 2017年 鲍光胜和女儿在英国 这一年他决定读博士 为此他准备了5年 鲍光胜还是被媒体围住了 在西湖大学博士生开学典礼上 他微笑着回答了每一个问题 在视频发布后的评论区 有人说他看上去
  • Idea之单元测试覆盖率

    Idea之单元测试覆盖率 创建接口 参加测试类 点击Run xxx with Coverage 在运行完毕后 就会出现Coverage窗口 在窗口中就能看到关于覆盖率的内容 如果需要达到更高的覆盖率 将if的每一个分支都测试一遍
  • Win7下使用Putty代替超级终端通过COM串口连接开发板方法

    1 如果电脑 笔记本 没有串口接口 则需要使用一个 USB Serial 转换线 这里使用 prolific usb serial USB 串口转换线 首先需要在win7上安装对应的 USB 串口转换线 驱动程序 PL2303 Prolif
  • 《Android 开发艺术探索》笔记5--View工作原理

    View工作原理思维导图 ViewRoot和DecorView MeasureSpec 理解MeasureSpec MeasureSpec和LayoutParams关系 View的工作流程 measure过程 正确获取宽高方法 layout
  • c++(26) 输入输出流、文件操作

    1 cout cin标准输入输出流 cin会创建一个输入缓冲区 键盘向屏幕输入字符的时候 会将数据放进缓冲区 如果缓冲区内没有数据 则会阻塞等待键盘输入 同样的cout也会有自己的缓冲区 在有的linux编译器下 cout lt lt he
  • 2022年最新MySQL安装教程

    Mysql官方提供社区版本和商业版本 这里以mysql 社区版本8 0 26 为例 官方网站 https www mysql com 安装 1 点击官网 点击上面的DOWNLOADS 2 如图 3 这里以windows系统为例 3 打开my
  • qt 如果出现未声明的变量,前提是已经声明过的

    找到你的 cpp h 文件 用记事本打开 然后另存为的时候最下面的编码改成unicode的 最好cpp文件也改成unicode的
  • 责任链(Chain of Responsibility)模式

    行为模式 Behavioral Pattern 是对在不同的对象之间划分责任和算法的抽象化 行为模式不仅仅是关于类和对象的 而且是关于它们之间的相互作用的 行为模式分为类的行为模式和对象的行为模式两种 类的行为模式 类的行为模式使用继承关系
  • 快速傅氏变换之旅(一) 概念简介 1

    FFT Fast Fourier Transformation 即为快速傅氏变换 是离散傅氏变换的快速算法 它是根据离散傅氏变换的奇 偶 虚 实等特性 对离散傅立叶变换的算法进行改进获得的 它对傅氏变换的理论并没有新的发现 但是对于在计算机
  • STM32进入HardFault_Handler处理办法

    思考 使用stm32的时候 有时会出现不明情况的死机 此时可以采用 HardFault Handler 处理方法来跟踪栈 STM32进入HardFault Handler处理办法 HardFault Handler出现的情况一般有两种 一种
  • java 事务 异常_spring事务常见问题、异常分析和解决方法

    1 spring事务超时transaction unexpectedly rolled back maybe due to a timeout nested exception is javax transaction RollbackEx
  • 简述机器指令与微指令之间的关系_机器指令与微指令有什么联系和区别?

    展开全部 一 概念不62616964757a686964616fe78988e69d8331333431353263同 1 机器指令 机器指令是CPU能直接识别并执行的指令 2 微指令 是指在机器的一个CPU周期中 一组实现一定操作功能的微
  • 什么是对数器?

    什么是对数器 对数器的概念 1 有一个你想要测的方法a 2 实现一个绝对正确但是复杂度不好的方法b 3 实现一个随机样本产生器 4 实现对比算法a和b的方法 5 把方法a和方法b比对多次来验证方法a是否正确 6 如果有一个样本使得比对出错
  • windows设定redis自启动

    常规操作就是将redis添加作为服务 在redis目录下进入控制台输入以下命令可以实现将redis添加为服务 redis server service install redis windows service conf loglevel
  • npm install 安装报错解决几种办法

    最近做项目遇到npm install 的问题 发现有多种原因可导致 将经历过的总结一下啊 还有很多可能的报错未涉及 欢迎补充交流 1 原npm地址 npm install下载过慢问题 解决方案 设置国内淘宝镜像 命令行管理员模式 对应目录下
  • uni-app ios11 退出应用

    此段代码在ios11上 强制退出app不可用了 const threadClass plus ios importClass NSThread const mainThread plus ios invoke threadClass mai
  • Vue-cli的安装与配置

    Node的下载与安装 工欲善其事必先利其器 在搭建vue的开发环境之前 一定一定要先下载node js vue的运行是要依赖于node的npm的管理工具来实现 1 首先我们进入到node的官网 https nodejs org zh cn
  • 史上“zui全”产品经理专业术语,建议收藏

    1 职称术语 CEO Chief Executive Officer 席执 官 GM General Manager 总经理 VP Vice President 副总裁 CTO Chief Technology Officer 席技术官 C
  • linux系统做java编程,编写能同时运行在Windows与Linux系统下的JAVA程序

    最近做了一个项目 客户要求写个bat能在Windows下直接运行 还得能在Linux下运行 当然Linux下不可能是bat文件了 客户也是搞开发的 他是只是外包了一部分让我们做 也许是觉得HttpUnit的东西他们做不如外包的化算 Wind
  • react的左右联动

    效果图 这是css的代码 body margin 0 linkage width 100vw height 100vh display flex linkage button width 20vw height 100vh backgrou