首页 > 其他分享 >h5使用better scroll实现左右列表联动

h5使用better scroll实现左右列表联动

时间:2025-01-23 17:02:40浏览次数:3  
标签:deptId storeName storeId h5 better item params 多多 scroll

  展示效果

安装vant^2.12.38和better-scroll^2.5.1

<template>
  <div>
    <div class="dept-filter" @click="showFilter">
      <div class="name">{
  
  { params.name }}</div>
      <img class="img" src="@/assets/images/index/filter.png" />
    </div>
    <van-popup v-model="show" position="bottom" :style="{ height: '70vh' }">
      <div class="title-box">
        <div class="title">店铺列表</div>
        <img class="close" src="@/assets/images/index/close.png" @click="show = false" />
      </div>
      <div class="content-box">
        <div class="left">
          <div
            @click="setDept(item, index)"
            class="item"
            :class="currentDeptIndex === index ? 'active' : ''"
            v-for="(item, index) in list"
            :key="item.deptId"
          >
            <div class="line"></div>
            <div class="dept">{
  
  { item.deptName }}</div>
          </div>
        </div>
        <div class="right" @mousewheel="dataScroll" @touchmove="dataScroll">
          <div
            class="item right-item"
            v-for="(item, index) in list"
            :key="item.deptId"
            :ref="'id' + item.deptId"
          >
            <div class="dept weight">{
  
  { item.deptName }}</div>
            <div class="store" :ref="'dept' + item.deptId" @click="setAllStore(item, index)">
              <div
                class="name"
                :class="params.deptId === item.deptId && params.storeId === null ? 'active' : ''"
              >
                所有店铺
              </div>
              <img
                v-if="params.deptId === item.deptId && params.storeId === null"
                class="checked"
                src="@/assets/images/index/checked.png"
              />
              <!-- 占位 -->
              <div v-else class="checked"></div>
            </div>
            <div class="dept" v-if="item.storeList.length !== 0">
              部门下店铺({
  
  { item.storeList.length }})
            </div>
            <div
              class="store"
              @click="setStore(item, child, index)"
              v-for="child in item.storeList"
              :key="child.storeId"
              :ref="'dept' + item.deptId + child.storeId"
            >
              <div class="name" :class="params.storeId === child.storeId ? 'active' : ''">
                {
  
  { child.storeName }}
              </div>
              <img
                v-if="params.storeId === child.storeId"
                class="checked"
                src="@/assets/images/index/checked.png"
              />
              <div v-else class="checked"></div>
            </div>
          </div>
        </div>
      </div>
    </van-popup>
  </div>
</template>
<script>
export default {
  name: 'DeptFilter1',
  data() {
    return {
      show: false,
      params: {
        deptId: 1,
        storeId: null,
        name: '所有部门'
      },
      currentDeptIndex: 0,
      list: [
        {
          deptId: 1,
          deptName: '所有部门',
          storeList: []
        },
        {
          deptId: 2,
          deptName: '软件研发部',
          storeList: []
        },
        {
          deptId: 3,
          deptName: '事业部',
          storeList: [
            { storeId: 1, storeName: '大药房官方旗舰店' },
            { storeId: 2, storeName: '拼多多事业店-拼多多事业店' },
            { storeId: 3, storeName: '拼多多事业店-拼多多事业店' }
          ]
        },
        {
          deptId: 4,
          deptName: '技术部',
          storeList: [
            { storeId: 13, storeName: '大药房官方旗舰店' },
            { storeId: 4, storeName: '拼多多事业店-拼多多事业店' },
            {
              storeId: 5,
              storeName:
                '拼多多事业部拼多多拼多多事业部拼多多拼多多事业部拼多多拼多多事业部拼多多拼多多事业部拼多多'
            },
            { storeId: 6, storeName: '拼多多事业店-拼多多事业店' },
            { storeId: 7, storeName: '拼多多事业店-拼多多事业店' },
            { storeId: 8, storeName: '拼多多事业店-拼多多事业店' },
            { storeId: 9, storeName: '拼多多事业店-拼多多事业店' },
            { storeId: 10, storeName: '拼多多事业店-拼多多事业店' }
          ]
        },
        {
          deptId: 5,
          deptName: '人事部',
          storeList: [
            { storeId: 11, storeName: '大药房官方旗舰店' },
            { storeId: 12, storeName: '拼多多事业店-拼多多事业店' }
          ]
        }
      ],
      initTop: 0
    }
  },
  methods: {
    setDept(item, index) {
      this.currentDeptIndex = index
      this.$refs['id' + item.deptId][0].scrollIntoView({ behavior: 'smooth' })
    },
    setAllStore(item, index) {
      this.params.deptId = item.deptId
      this.params.storeId = null
      this.params.name = item.deptName
      this.currentDeptIndex = index
      this.show = false
      console.log(this.params)
      this.$emit('getParams', this.params)
    },
    setStore(item, child, index) {
      this.params.storeId = child.storeId
      this.params.deptId = item.deptId
      this.params.name = child.storeName
      this.currentDeptIndex = index
      this.show = false
      console.log(this.params)
      this.$emit('getParams', this.params)
    },
    showFilter() {
      this.show = true
      this.setInitTop()
      this.topTop()
    },
    //设置选中元素置顶
    topTop() {
      this.$nextTick(() => {
        let ref = 'dept' + this.params.deptId
        if (this.params.storeId !== null) {
          ref = 'dept' + this.params.deptId + this.params.storeId
        }
        this.$refs[ref][0].scrollIntoView({ behavior: 'smooth' })
      })
    },
    //获取初始高度
    setInitTop() {
      this.$nextTick(() => {
        setTimeout(() => {
          const element = document.getElementsByClassName('title-box')[0]
          this.initTop = element.getBoundingClientRect().top + element.clientHeight
        }, 400)
      })
    },
    dataScroll() {
      const element = document.getElementsByClassName('right-item')
      this.currentDeptIndex = 0
      for (let i = 0; i < element.length; i++) {
        if (element[i].getBoundingClientRect().top <= this.initTop) {
          this.currentDeptIndex = i
        }
      }
    }
  }
}
</script>

<style scoped lang="scss">
.dept-filter {
  display: flex;
  align-items: center;
  background: #191e28;
  color: #fff;
  height: 30px;
  .name {
    font-weight: 500;
    font-size: 13px;
    line-height: 13px;
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
    margin: 0 5px 0 10px;
    max-width: 92px;
  }
  .img {
    width: 12px;
    height: 12px;
  }
}
::v-deep .van-popup {
  border-radius: 10px 10px 0 0;
  background: linear-gradient(
    179.71deg,
    rgba(23, 28, 37, 1) 0.75%,
    rgba(49, 55, 65, 1) 49.55%,
    rgba(23, 28, 37, 1) 98.76%
  );
  overflow-y: hidden;
  color: #ffffff;
}
.title-box {
  font-weight: 600;
  font-size: 15px;
  padding: 16px 20px;
  position: relative;
  .title {
    text-align: center;
  }
  .close {
    width: 30px;
    height: 30px;
    position: absolute;
    right: 20px;
    top: 12px;
  }
}
.content-box {
  display: flex;
  .left {
    width: 108px;
    height: calc(70vh - 52px);
    overflow-y: scroll;
    .item {
      height: 48px;
      display: flex;
      align-items: center;
      .line {
        width: 4px;
        height: 16px;
      }
      .dept {
        padding: 0 12px 0 8px;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
        font-size: 14px;
      }
    }
    .active {
      .dept {
        background: linear-gradient(
          136.52deg,
          rgba(4, 189, 248, 0.88) 4.9%,
          rgba(8, 252, 223, 0.88) 132.73%
        );
        -webkit-background-clip: text !important;
        -webkit-text-fill-color: transparent;
      }
      .line {
        background: linear-gradient(
          136.52deg,
          rgba(4, 189, 248, 0.88) 4.9%,
          rgba(8, 252, 223, 0.88) 132.73%
        );
      }
    }
  }

  .right {
    width: calc(100vw - 108px);
    height: calc(70vh - 52px);
    overflow-y: scroll;
    .item {
      border-top: 2px solid rgba(255, 255, 255, 0.5);
      padding: 0 16px 0 16px;
      &:first-child {
        border: none;
      }
      .dept {
        color: #bfbfbf;
        font-size: 12px;
        height: 25px;
        display: flex;
        align-items: flex-end;
      }
      .weight {
        font-weight: 500;
      }
      .store {
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding: 12px 0;
        font-size: 14px;
        .name {
          width: calc(100vw - 170px);
        }
        .active {
          background: linear-gradient(
            136.52deg,
            rgba(4, 189, 248, 0.88) 4.9%,
            rgba(8, 252, 223, 0.88) 132.73%
          );
          -webkit-background-clip: text !important;
          -webkit-text-fill-color: transparent;
        }
        .checked {
          width: 20px;
          height: 20px;
          margin-left: 10px;
        }
      }
    }
  }
}
</style>

标签:deptId,storeName,storeId,h5,better,item,params,多多,scroll
From: https://blog.csdn.net/qq_37004501/article/details/145278889

相关文章

  • h5页面两个吸顶tab切换第二个tab从头开始显示
    问题描述:滚动条滚动到最后时,切换其他tab,滚动条依旧是旧的解决办法:用一个固定定位记录tab的初始位置,这样可以防止页面还没加载完就滑动页面了,值也不会改变核心代码:<template><divclass="content"><divclass="tab-box"style="z-index:1">第一个吸顶tab......
  • es scroll id 每次都相同
    https://elasticsearch.cn/question/2988 https://elasticsearch.cn/?/question/7781     https://www.v2ex.com/t/975955 https://cloud.tencent.com/developer/ask/sof/102352850 https://cloud.tencent.com/developer/ask/sof/102352850 社区首页>问......
  • 国产3D 霍尔传感器,低功耗、高精度,KTH5701
    KTH5701是一款数字输出的3D霍尔芯片,内部分别集成了X轴、Y轴和Z轴三个独立的霍尔传感器。信号链采用高精度运放通过16bitADC将模拟信号转换成数字输出。外部主机可以采用SPI或I2C两种模式读出测量数据。此外,在芯片内部集成了一个温度传感器用......
  • STM32H563 HAL库 LWIP裸机移植
    一、STM32H563与LWIP简介STM32H563是STMicroelectronics推出的一款高性能32位微控制器,具有丰富的外设和强大的处理能力,适用于各种复杂的嵌入式系统应用。LWIP(LightweightIP)是一个小型开源的TCP/IP协议栈,旨在为嵌入式系统提供轻量级的网络功能,它能够在资源有限的......
  • H5端微信登录完整流程
    功能概述H5端微信登录是基于微信开放平台和OAuth2.0协议,实现用户通过移动端微信授权登录的功能。通过调用微信提供的接口,用户无需输入账号密码即可完成快捷登录。一、流程概览完整流程图以下为H5端微信登录的整体流程:二、详细流程步骤步骤1:注册微信开放平台并获取基......
  • 遇到overflow: scroll不能平滑滚动怎么解决?
    overflow:scroll这个CSS属性允许内容在容器内滚动,但是它本身并不提供平滑滚动的功能。如果你想要实现平滑滚动的效果,你可能需要使用其他方法。以下是一些可能的解决方案:1.使用CSS的scroll-behavior属性你可以使用CSS的scroll-behavior属性来设置滚动行为。将其设置......
  • RN/H5多设备自适应组件库来了,高效实现鸿蒙原生应用多设备精致体验
    在原生鸿蒙应用开发中,华为针对ArkUI框架推出了一整套针对多设备适配的完善能力(如“一多”能力)以及高阶组件(如分栏、边看边评等),帮助开发者轻松实现“一次开发,多端部署”。然而,当前鸿蒙生态仍存在大量用跨平台框架开发的应用,部分页面采用ReactNative(RN)和H5等框架开发,这些框架在系统......
  • 如何解决Webview和H5缓存问题,确保每次加载最新版本的资源
    WebView用于加载H5页面是常见的做法,它能够加载远程的HTML、CSS、JavaScript资源,并且让Web应用嵌入到原生App中。然而,WebView的缓存机制有时会导致用户看到的是旧版本的页面或资源,尤其是在H5发版后,iOS端用户可能仍然加载到缓存的旧页面,造成了不一致的体验。本篇文......
  • 在Windows上调试iOS Safari中的H5页面
    本次开发的web页面需要适配移动端,第一个版本在发布到线上,发现ios设备一直打不开网页,无论是自带的safari浏览器还是其他浏览器,页面经常出现“***页面重复出现错误”,但是在本地以及使用PC浏览器模拟都没有复现该问题。为了进行线上的调试查询了一下如何在windows上调试ios的浏览器we......
  • uniapp开发app、h5和微信小程序,8大好用的组件库推荐
    文章目录**1.uViewUI****2.TDesign(腾讯出品)****3.VarletUI****4.thor-ui****5.ColorUI****6.NutUI****7.VantWeapp****8.GraceUI****推荐选择****总结**在使用uni-app开发App、H5和微信小程序时,选择合适的组件库可以显著提升开发效率和用户体验。......