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的左右联动 的相关文章

  • useParams 钩子在 React 功能组件中返回未定义

    该应用程序显示所有照片
  • 如何判断何时创建新组件?

    我一直在寻找背后的逻辑当有人在 AngularJS Angular 上的 Web 应用程序中创建新组件时但我认为这更通用 可能适用于所有基于组件的前端框架 我知道有像这样的一些原则应该是抽象的和可重用的但例如我在角度文档中看到 每个单独的路
  • 如何使用 Coffeescript 在 React 中渲染 HTML 标签?

    我目前正在学习 ReactJS 以及如何使用 Ruby on Rails 作为其后端 所以如果我做出愚蠢的假设 我深表歉意 请随意责骂我 我正在关注一个教程 其中作者使用 Coffeescript 而不是 ES6 来处理他的 ReactJS
  • Redux - 从函数调用操作

    我正在尝试从函数调用 redux 操作 我调用该函数的组件已连接到商店 但是 如果我通过以下操作 它就不起作用 function myFunc action action 有没有办法通过参数传递动作 谢谢 using bindActionC
  • 即使未显式使用“componentWillMount”,“componentWillMount”警告仍可见

    在我的代码中 我没有任何明确的用途componentWillMount 但我在运行时仍然看到一些警告webpack react dom development js 12386 警告 componentWillMount 已重命名 不建议使
  • Firestore 查询 .toUpperCase() 不起作用

    我正在尝试创建一个网站 使用户能够搜索 Firebase Firestore 中的文档集合 该过程涉及将用户的输入保存为状态 useState 并利用 useEffect 挂钩来查询 Firebase 数据库 但是 我遇到了一个问题 即使用
  • 如何在 webpack 中渲染嵌套的 SASS?

    采取以下CSS MyComponent color blue Button color red 以及以下 React 组件 import React from react import classes from MyComponent sc
  • 使用 ref 触发反应 dropzone 不起作用

    我正在实现这个库 https github com felixrieseberg React Dropzone Component https github com felixrieseberg React Dropzone Compone
  • 在 React 中将模板分离到外部文件

    我正在为客户开发 ReactJS 应用程序 我希望客户端能够自定义应用程序中的一些配置和模板 所以我创建了一个config js file window APP CONFIG url example com template item di
  • 如何映射轮播的子项数组?

    我正在尝试将 Carousel 组件包装在映射对象数组周围作为组件的子级 目前我只能让映射创建映射对象的 1 个子对象 轮播需要像这样
  • 如何在reactjs中禁用未来日期?

    我没有使用任何日期选择器 代码仍然工作正常 到目前为止 我已经选择了输入类型 一切正常 现在我想禁用未来的日期 我怎么做 div div
  • 使用 React.js + Express.js 发送电子邮件

    我在 ES6 中使用 React js 构建了一个 Web 应用程序 我目前想要创建一个基本的 联系我们 页面并想要发送电子邮件 我是 React 新手 刚刚发现我实际上无法使用 React 本身发送电子邮件 我正在遵循教程nodemail
  • 使用代理时,React 应用程序正在不同位置查找静态文件

    我用过npx create react app my app创建一个反应应用程序 我用过的npm run build构建应用程序并使用它进行部署serve s build 我正在使用代理服务器来公开我的应用程序 我的 httpd 配置如下所
  • React 应用程序中的 addEventListener 不起作用

    一些背景 我正在尝试消费自定义网络组件在 React 应用程序中并尝试监听来自 Web 组件的事件 我相信您不能只在自定义 Web 组件上以通常的反应方式处理事件 i e
  • ReactCSSTransitionGroup 组件WillLeave 未调用

    我尝试使用 ReactCssTransition 但不知何故该事件没有被调用 componentWillLeave 这是我的组件 import React Component from react import TransitionGrou
  • 即使我可以监视其他方法,也无法监视事件处理程序

    我想使用 Jest Jasmine Enzyme 测试 React 中的事件处理程序 MyComponent js import React from react class MyComponent extends React Compon
  • React Native:加载图像后应用程序性能不佳

    加载图像似乎没有问题 但是加载完毕后就出现问题了 在我的应用程序中 我在整个游戏中一张一张地加载卡片图像 一旦我加载了 40 张卡片图像 整个应用程序就会变得很慢 它总是发生在第 40 个图像处 当我在第 40 个图像之后继续加载更多卡片图
  • 将 firestore 中的数据分配给变量

    我尝试使用 get doc 函数将 firestore 数据库中的变量分配给它们所尊重的值 我注意到它不会分配或更新这些值 我尝试使用异步和等待 但似乎无法使其工作 getFromDatabase nameOfCollection name
  • React - 检查元素在 DOM 中是否可见

    我正在构建一个表单 用户需要回答一系列问题 单选按钮 然后才能进入下一个屏幕 对于字段验证 我使用 yup npm 包 和 redux 作为状态管理 对于一种特定场景 组合 会显示一个新屏幕 div 要求用户进行确认 复选框 然后用户才能继
  • useLocation 挂钩 - 确定过去的位置

    根据 React Router 5 1文档 https v5 reactrouter com web api location应该可以看到 应用程序现在在哪里 你想让它去哪里 甚至它曾经在哪里 在我的应用程序中 我需要查看 它在哪里 我访问

随机推荐

  • 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