左右联动-左侧点击相应的位置,右侧随之滚动

2023-05-16

第一步:npm下载

npm install better-scroll --save

第二步:局部注册(当前组件)

import BScroll from 'better-scroll'

第三步:使用

<template>
  <div>
    <div class="goods">
      <div class="left">
        <ul>
          <li
            class="menu-item"
            v-for="(good, index) in goods"
            :key="index"
            :class="{ current: index === currentIndex }"
            @click="clickMenuItem(index)"
          >
            <span class="text">
              <img class="icon" :src="good.icon" v-if="good.icon" />
              {{ good.name }}
            </span>
          </li>
        </ul>
      </div>
      <div class="right">
        <ul ref="foodsUl">
          <li class="food-list-hook">
            <h1 class="title">{{ goods[0].name }}</h1>
            <ul>
              <div class="food-item">AAAAAAAAAAAAAAAAA</div>
            </ul>
          </li>
          <li class="food-list-hook">
            <h1 class="title">{{ goods[1].name }}</h1>
            <ul>
              <div class="food-item">BBBBBBBBBBBBBBBBB</div>
            </ul>
          </li>
          <li class="food-list-hook">
            <h1 class="title">{{ goods[2].name }}</h1>
            <ul>
              <div class="food-item">CCCCCCCCCCCCCC</div>
            </ul>
          </li>
          <li class="food-list-hook">
            <h1 class="title">{{ goods[3].name }}</h1>
            <ul>
              <div class="food-item">DDDDDDDDDDDDDDD</div>
            </ul>
          </li>
          <li class="food-list-hook">
            <h1 class="title">{{ goods[4].name }}</h1>
            <ul>
              <div class="food-item">EEEEEEEEEEEEEE</div>
            </ul>
          </li>
        </ul>
      </div>
    </div>
  </div>
</template>
<script>
import BScroll from 'better-scroll'
export default {
  data() {
    return {
      scrollY: 0, // 右侧滑动的Y轴坐标 (滑动过程时实时变化)
      tops: [], // 所有右侧分类li的top组成的数组  (列表第一次显示后就不再变化)
      goods: [{ name: 'A' }, { name: 'B' }, { name: 'C' }, { name: 'D' }, { name: 'E' }],
    }
  },
  mounted() {
    this.$nextTick(() => {
      this._initScroll()
      this._initTops()
    })
  },
  computed: {
    // 计算得到当前分类的下标
    currentIndex() {
      // 初始化和相关数据发生了变化时执行
      // 得到条件数据
      const { scrollY, tops } = this
      // 根据条件计算产生一个结果
      const index = tops.findIndex((top, index) => {
        // scrollY>=当前top && scrollY<下一个top
        return scrollY >= top && scrollY < tops[index + 1]
      })
      console.log('根据条件计算产生一个结果', index)
      // 返回结果
      return index
    },
  },
  methods: {
    // 初始化滚动
    _initScroll() {
      // 列表显示之后创建
      new BScroll('.left', {
        click: true,
      })
      this.foodsScroll = new BScroll('.right', {
        probeType: 2, // 因为惯性滑动不会触发
        click: true,
      })

      // 给右侧列表绑定scroll监听
      this.foodsScroll.on('scroll', ({ x, y }) => {
        console.log('scroll', x, y)
        this.scrollY = Math.abs(y)
      })
      // 给右侧列表绑定scroll结束的监听
      this.foodsScroll.on('scrollEnd', ({ x, y }) => {
        console.log('scrollEnd', x, y)
        this.scrollY = Math.abs(y)
      })
    },
    // 初始化tops
    _initTops() {
      // 1. 初始化tops
      const tops = []
      let top = 0
      tops.push(top)
      // 2. 收集
      // 找到所有分类的li
      const lis = this.$refs.foodsUl.getElementsByClassName('food-list-hook')
      Array.prototype.slice.call(lis).forEach(li => {
        top += li.clientHeight
        tops.push(top)
      })

      // 3. 更新数据
      this.tops = tops
      console.log(tops)
    },

    clickMenuItem(index) {
      console.log(index)
      // 使用右侧列表滑动到对应的位置

      // 得到目标位置的scrollY
      const scrollY = this.tops[index]
      // 立即更新scrollY(让点击的分类项成为当前分类)
      this.scrollY = scrollY
      // 平滑滑动右侧列表
      this.foodsScroll.scrollTo(0, -scrollY, 300)
    },
  },
}
</script>
<style lang="scss">
.goods {
  display: flex;
  position: absolute;
  top: 15px;
  bottom: 46px;
  width: 100%;
  background: #fff;
  overflow: hidden;

  .left {
    flex: 0 0 80px;
    width: 200px;
    background: #f3f5f7;

    .menu-item {
      display: table;
      height: 54px;
      width: 200px;
      padding: 0 12px;
      line-height: 14px;

      &.current {
        position: relative;
        z-index: 10;
        margin-top: -1px;
        background: #fff;
        // color: $green;
        font-weight: 700;
      }

      .icon {
        display: inline-block;
        vertical-align: top;
        width: 12px;
        height: 12px;
        margin-right: 2px;
        background-size: 12px 12px;
        background-repeat: no-repeat;
      }

      .text {
        display: table-cell;
        width: 56px;
        vertical-align: middle;
        // bottom-border-1px(rgba(7, 17, 27, 0.1));
        font-size: 16px;
      }
    }
  }

  .right {
    flex: 1;
    .title {
      padding-left: 14px;
      height: 26px;
      line-height: 26px;
      border-left: 2px solid #d9dde1;
      font-size: 16px;
      color: rgb(147, 153, 159);
      background: #f3f5f7;
      text-align: left;
      margin: 0;
    }

    .food-item {
      height: 500px;
      display: flex;
      margin: 18px;
      padding-bottom: 18px;
      // bottom-border-1px(rgba(7, 17, 27, 0.1));

      &:last-child {
        margin-bottom: 0;
      }

      .icon {
        flex: 0 0 57px;
        margin-right: 10px;
      }

      .content {
        flex: 1;
        text-align: left;

        .name {
          margin: 2px 0 8px 0;
          height: 14px;
          line-height: 14px;
          font-size: 16px;
          color: rgb(7, 17, 27);
        }

        .desc,
        .extra {
          line-height: 10px;
          font-size: 16px;
          color: rgb(147, 153, 159);
        }

        .desc {
          line-height: 12px;
          margin-bottom: 8px;
        }

        .extra {
          .count {
            margin-right: 12px;
          }
        }

        .price {
          font-weight: 700;
          line-height: 24px;

          .now {
            margin-right: 8px;
            font-size: 16px;
            color: rgb(240, 20, 20);
          }

          .old {
            text-decoration: line-through;
            font-size: 16px;
            color: rgb(147, 153, 159);
          }
        }
      }
    }
  }
}

li {
  list-style: none;
}

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

左右联动-左侧点击相应的位置,右侧随之滚动 的相关文章

  • Postman安装

    1 官网下载 下载链接地址 xff1a https www postman com downloads 点击Download the App 根据自己的电脑以及需求选择对应的32位或者64位的版本 2 双击安装包 xff0c 不用任何操作
  • UART串口通信

    串口是 串行接口 的简称 xff0c 即采用串行通信方式的接口 串行通信将数据字节分成一位一位的形式在一条数据线上逐个传送 xff0c 其特点是通信线路简单 xff0c 但传输速度较慢 因此串口广泛应用于嵌入式 工业控制等领域中对数据传输速
  • Java第四课数据类型(二)

    一 变量类型 1 字节型 byte 2 整型 xff08 1 xff09 int 整型 4字节 xff08 2 xff09 show 短型 2字节 xff08 3 xff09 long 长型 8字节 3 浮点型 xff08 1 xff09
  • ESP32蓝牙配网

    注意 menuconfig 配置 xff08 必须打开蓝牙我这是C2所以使用NimBLE xff09 可以直接从demo的配置文件拷贝 Component config gt Bluetooth gt NimBLE BLE only Com
  • [C#] UDP协议 常用简单的代码(基于UdpClient类)(Thread实现)

    目录 说明1 消息发送端2 消息接收端 说明 在使用 C 开发Winform WPF等富客户端应用程序时 xff0c 有时会有 进程 之间 相互通信 的需求 下面是一种能够实现Udp 消息收发 常用且较为简单的 C 代码 使用注意 xff1
  • 掌控板OLED显示

    掌控板OLED显示 OLED显示文本内容 需要先将显示清空 xff0c 然后将想要显示的内容放在里面 xff0c 最后放入oled显示生效 源代码如下 xff1a span class token keyword from span mpy
  • 激光slam学习笔记1--RTK组合惯导、激光雷达传感器一些经验知识分享

    前言 xff1a 跟组合惯导和激光雷达打交道半年了 xff0c 过程中查找学习了这两方面的资料 xff0c 这里来个小结 如果有理解错误的 xff0c 望大佬们不吝赐教 一 RTK组合惯导 个人理解有两部分组成 xff0c 一个提供gps信
  • 计算机组成原理第五章:输入输出系统

    本章知识架构 接口 接口分类 xff1a 并行接口 xff1a 接口与系统总线 xff0c 接口与外设均按并行方式传送数据 串行接口 xff1a 接口与系统总线并行 xff0c 与外部设备串行 按I O传送控制方式划分 xff1a 直接程序
  • STM32串口通信 (缓冲区 发送不出数据&接收不到数据)

    STM32串口通信 流程附上代码注意事项一点心得 xff1a 流程 xff08 简单的发送数据 xff09 GPIO时钟使能串口时钟使能串口的GPIO配置写初始化串口函数 xff0c 配置串口USART Init USART1 amp US
  • 设计一个脉冲发生器,已知系统时钟为50MHz,生成脉冲宽度为1ms,脉冲间隔可调,最大间隔为1s

    设计一个脉冲发生器 xff0c 已知系统时钟为50MHz xff0c 生成脉冲宽度为1ms xff0c 脉冲间隔可调 xff0c 最大间隔为1s Design a pulse generator The system clock is kn
  • 详解结构体与链表

    目录 1 定义使用结构体变量 2 使用结构体数组 3 结构体指针 4 结构体内存对齐 重点 5 typedef的使用 6 动态内存的分配与释放 7 链表的创立 增删查改插 什么是链表 xff1f 静态链表和动态链表 链表的创立 链表的插入元
  • c++头文件及函数

    目前小编只了解到这些 xff0c 如果还有其他的一些头文件或函数 xff0c 欢迎评论区留言或者私信小编 xff0c 谢谢大家的观看 1 include lt iostream gt system pause 系统暂停 system mod
  • 将Ubuntu虚拟机架设到GNS3拓扑网络上并进行TCP协议仿真分析

    目录 前言环境配置 xff08 将Ubuntu虚拟机挂载到GNS3拓扑网络上 xff09 配置Ubuntu虚拟机GNS3拓扑网络配置先进行一下数据传输检验通路是否正常 开始实验task1 TCP传输过程中的IP分片task2 TCP请求与一
  • HTTP协议---工作原理&报文详情&完整请求过程

    1 工作原理 1 1 OSI 七层模型 OSI xff08 Open System Interconnection xff0c 开放系统互连 xff09 七层网络模型称为开放式系统互联参考模型 xff0c 是一个逻辑上的定义 xff0c 一
  • Makefile和CMake的简单入门

    Makefile和CMake的简单入门 从源代码到可执行文件Makefile的产生背景从make的调用到MakefileMakefile的基本格式Makefile的扩展用法Makefile的生成和部署 一 从源代码到可执行文件 当编译文件依
  • ubuntu搭建HTTP服务器

    1 首先安装apache2工具 sudo apt get update sudo apt get install apache2 apache2安装成功后 xff0c 我们可以在 var www html 目录下看到一个index html
  • 2021 大学生电子设计竞赛 G题 无人机 识别部分

    硬件解决方案 前视OpenMV与下视OpenMV 赛题整体解决方案 视觉只负责识别部分 采用定焦镜头 OpenMV只负责发送像素坐标系下的坐标信息 其他解算等决策部分均由嵌入式控制解决 解决思想 xff1a 围绕田地即地图中的绿色边缘巡航喷
  • c++:不使用STL标准模板库,实现双端队列

    c 43 43 xff1a 不使用STL标准模板库 xff0c 实现双端队列 文章目录 c 43 43 xff1a 不使用STL标准模板库 xff0c 实现双端队列0 简介1 怎么写1 1思路1 2代码 2 结尾 0 简介 最近一个实验验收
  • Android Android Studio 4.0 牛逼功能预览

    作者 xff1a wanbo 地址 xff1a https juejin im post 5db8cee351882557134d0411 新的 Android Studio 4 0 更换了全新的启动界面 xff0c 在今天 Google
  • Qt学习笔记之类继承关系图

随机推荐

  • C++:头文件递归包含问题(互相包含问题)

    目录 引言初始版本头文件守卫递归包含会怎么样为什么会出错前置声明是什么如何解决递归包含问题参考 引言 最近正在疯狂补技术债 xff0c 以及疯狂赶项目 大一大二摸的鱼终归是要还的 xff0c 也奉劝大家少摸鱼 xff0c 不然临近找工作可能
  • 拓展:示波器使用_波形分析

    这里主要对上一个练习中的波形图来拓展 xff0c 讲讲怎么在示波器输出的波形图中 xff0c 对该界面上的一些功能的使用 01 关于适应全屏 放大 缩小 对于输出波形 xff0c 经常要用到的即是适应屏幕 xff0c 以及放大缩小 xff0
  • 【已解决】element-ui组件嵌套太多层,导致内部el-input和el-select 等组件无法正常输入解决方案

    如果 element ui 组件嵌套太多层 xff0c 可能会导致内部的 el input 和 el select 等组件无法正常输入 出现这种问题通常是由于 z index 属性设置不正确导致的 解决这个问题的方法是调整组件的 z ind
  • 两个半天一刷Ubuntu入门指令

    目录 两个半天一刷Ubuntu入门指令 一 Ubuntu初次体验 二 设备驱动 三 Ubuntu用户组及其权限分配 四 压缩解压 五 Linux连接文件 六 vim编辑器 七 Linux下C编程 八 gcc和make及其Makefile的引
  • ENV环境配置及其下载网络组件包问题

    准备工作 Env 工具包含了 RT Thread 源代码开发编译环境和软件包管理系统 从 RT Thread 官网下载 Env 工具 在电脑上装好 git xff0c 软件包管理功能需要 git 的支持 git 的下载地址为https gi
  • 芯片flash保护(解锁)

    报错结果 Error while accessing a target resource The resource is perhaps notavailable 就是无法下载程序 解决办法 1 下载ST LINK Utility 链接 x
  • 2.RTT-点灯大师的修炼

    1 创建工程模板 相信大家通过学习上一篇文章 1 RTT 环境搭建 现在能熟练的创建一个标准模板了 xff0c 如果不会就跳回去学习一下吧 链接 xff1a 1 RTT 环境搭建 嵌入式路上的流浪的博客 CSDN博客 建立好的工程模板编译并
  • 4.RTT-UART-中断接收及轮询发送

    本期博客开始分享RTT的UART xff0c 利用战舰V3的uart2来输入输出一些字符串 UART xff08 Universal Asynchronous Receiver Transmitter xff09 通用异步收发传输器 xff
  • 12.RTT-IIC设备-AHT10温湿度传感器

    本系列博客更新结束啦 xff01 完结啦 xff01 xff01 xff01 撒花 xff01 xff01 xff01 关于RTT的设备和驱动专题更新完毕啦 xff0c 本期是最后一期 一段学习旅途的结束意味着下一段学习冒险的开始 虽然本系
  • RTduino+sht31温湿度传感器

    本次博客使用的是STM32F103C8T6 xff0c 因为该BSP已经对接好RTduino了可以直接上手使用 一 RTduino简介 RTduino是RT Thread实时操作系统的Arduino生态兼容层 xff0c 为RT Threa
  • 一文揭秘字节跳动、华为、京东的薪资职级

    声明 xff1a 本文所有数字均不是官方数据 xff0c 为网络资料收集整理 字节跳动 01 全球员工总数 字节的员工数量目前超过5万人 图片来源 xff1a 字节范 02 岗位职级 字节跳动的职级研发序列一共10级 xff1a 字节跳动创
  • ESP_C3在ubuntu下运行RT-Thread

    1 clone源代码RT Thread git clone git 64 github com RT Thread rt thread git 2 开始搭建ESP IDF环境 进入源码到bsp文件夹下找到ESP32 C3 xff0c 开始配
  • uniapp中使用弹出层

    uniapp中使用弹出层 因为业务的需要 xff0c 需要弹出一个复选框 xff0c 使用uniapp中自带的框架 使用 xff1a 第一步 xff1a 下载下示例项目 xff0c 找到主要的文件夹 第二步 xff1a 将该文件夹放到组件的
  • 手写一个uniapp的步骤条组件

    span class token operator lt span template span class token operator gt span span class token operator lt span view span
  • uniapp中的分页

    数据量过多就会使用分页 第一种 xff1a API span class token comment 和data同级 span span class token function variable function onReachBotto
  • uniapp中生成随机的二维码并进行保存

    需求 xff1a 需要根据用户id的不同生成不同的二维码 xff0c 并进行本地保存 第一步 xff1a 下载插件 这里对于二维码的生成 xff0c 使用的是第三方插件weapp qrcode min js xff0c 主要用到的文件是 d
  • Pc端的基本Echarts

    Pc端的基本Echarts 双环传态图组件 span class token operator lt span template span class token operator gt span span class token oper
  • el-table表格的sortable排序的使用以及出现小数、%排序错乱

    前端实现排序 xff1a 只需要在表头上加上一个sortable属性即可 span class token tag span class token tag span class token punctuation lt span el t
  • 浏览器的回退和导航栏的选中转态不同步,路由在新窗口打开

    问题1 xff1a 浏览器的回退和导航栏的选中状态不能同步的问题 问题 xff1a 用户后退时候 xff0c 左边导航栏显示的还是上一个页面的导航 xff0c 但是路由和页面已经变了 span class token operator lt
  • 左右联动-左侧点击相应的位置,右侧随之滚动

    第一步 xff1a npm下载 npm install better scroll save 第二步 xff1a 局部注册 xff08 当前组件 xff09 span class token keyword import span BScr