小程序-实现左右菜单联动功能

在这里插入图片描述

实现效果类似:

1.左边点击 -> 右边滚动的相应的分类

2.右边滑动 -> 左边的样式跟着改变

wxml

<view class="goodsList">
  <!-- 左边商品分类 -->
  <scroll-view class="left" scroll-y scroll-top="{{scrollTops}}">
    <view wx:for="{{goodsList}}" class="goodsTitle {{tabCur==index?'active':''}}" wx:key="index" bindtap="gl" id="{{index}}">{{item.title}}</view>
  </scroll-view>

  <!-- 右边商品列表 -->
  <scroll-view class="right" scroll-y scroll-with-animation scroll-into-view="scroll-{{rightCur}}" bindscroll="scrollLink">
    <view wx:for="{{goodsList}}" class="goodsItem" id="scroll-{{idxs}}" wx:for-item="itemNames" wx:key="idxs" wx:for-index="idxs">
      <view>{{itemNames.title}}</view>
      <block wx:for="{{itemNames.list}}" wx:for-item="itemName" wx:for-index="idx" wx:key="idx">
        <view class="listItem">
          <image src="{{itemName.img}}" class="img"></image>
          <view class="name">{{itemName.name}}</view>
          <view class="sell">{{itemName.sell}}</view>
          <view class="price">{{itemName.price}}¥</view>
          <image src="../../img/加号,收起,添加.svg" class="add"></image>
        </view>
      </block>
    </view>
  </scroll-view>
</view>

js

// pages/member/member.js
Page({
  /**
   * 页面的初始数据
   */
  data: {
    tabCur: 0, //当前项
    rightCur: 0, // 用于实现左边联动右边
    goodsList: [{
        title: '碳酸类型',
        id: 1,
        list:[{
          name:'可口可乐',
          img: 'https://img2.baidu.com/it/u=3616759465,2727399041&fm=253&fmt=auto&app=138&f=JPEG?w=375&h=500',
          sell: '月售:108',
          price: '4.8'
        },
        {
          name:'雪碧',
          img: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic.51yuansu.com%2Fpic3%2Fcover%2F01%2F93%2F00%2F5982eed63cc27_610.jpg&refer=http%3A%2F%2Fpic.51yuansu.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662339581&t=8bbd7f16e03512ff0e8c32100bbcfc86',
          sell: '月售:88',
          price: '4.8'
        },
        {
          name:'可口可乐',
          img: 'https://img2.baidu.com/it/u=3616759465,2727399041&fm=253&fmt=auto&app=138&f=JPEG?w=375&h=500',
          sell: '月售:108',
          price: '4.8'
        },
        {
          name:'雪碧',
          img: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic.51yuansu.com%2Fpic3%2Fcover%2F01%2F93%2F00%2F5982eed63cc27_610.jpg&refer=http%3A%2F%2Fpic.51yuansu.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662339581&t=8bbd7f16e03512ff0e8c32100bbcfc86',
          sell: '月售:88',
          price: '4.8'
        },
        {
          name:'可口可乐',
          img: 'https://img2.baidu.com/it/u=3616759465,2727399041&fm=253&fmt=auto&app=138&f=JPEG?w=375&h=500',
          sell: '月售:108',
          price: '4.8'
        },
        {
          name:'雪碧',
          img: 'https://img2.baidu.com/it/u=3616759465,2727399041&fm=253&fmt=auto&app=138&f=JPEG?w=375&h=500',
          sell: '月售:88',
          price: '4.8'
        }
        ]
      }, {
        title: '奶茶类型',
        id: 2,
        list:[{
          name:'阿萨姆奶茶',
          img: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcbu01.alicdn.com%2Fimg%2Fibank%2FO1CN01SHPIlm2GVfaCwHCfx_%21%212211349499021-0-cib.jpg&refer=http%3A%2F%2Fcbu01.alicdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662285715&t=c575199b747c342d0844a1d8ab593a04',
          sell: '月售:108',
          price: '4.8'
        },
        {
          name:'香飘飘奶茶',
          img: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcbu01.alicdn.com%2Fimg%2Fibank%2FO1CN01SHPIlm2GVfaCwHCfx_%21%212211349499021-0-cib.jpg&refer=http%3A%2F%2Fcbu01.alicdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662285715&t=c575199b747c342d0844a1d8ab593a04',
          sell: '月售:108',
          price: '4.8'
        },
        {
          name:'阿萨姆奶茶',
          img: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcbu01.alicdn.com%2Fimg%2Fibank%2FO1CN01SHPIlm2GVfaCwHCfx_%21%212211349499021-0-cib.jpg&refer=http%3A%2F%2Fcbu01.alicdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662285715&t=c575199b747c342d0844a1d8ab593a04',
          sell: '月售:108',
          price: '4.8'
        },
        {
          name:'香飘飘奶茶',
          img: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcbu01.alicdn.com%2Fimg%2Fibank%2FO1CN01SHPIlm2GVfaCwHCfx_%21%212211349499021-0-cib.jpg&refer=http%3A%2F%2Fcbu01.alicdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662285715&t=c575199b747c342d0844a1d8ab593a04',
          sell: '月售:108',
          price: '4.8'
        },
        {
          name:'阿萨姆奶茶',
          img: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcbu01.alicdn.com%2Fimg%2Fibank%2FO1CN01SHPIlm2GVfaCwHCfx_%21%212211349499021-0-cib.jpg&refer=http%3A%2F%2Fcbu01.alicdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662285715&t=c575199b747c342d0844a1d8ab593a04',
          sell: '月售:108',
          price: '4.8'
        },
        {
          name:'香飘飘奶茶',
          img: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcbu01.alicdn.com%2Fimg%2Fibank%2FO1CN01SHPIlm2GVfaCwHCfx_%21%212211349499021-0-cib.jpg&refer=http%3A%2F%2Fcbu01.alicdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662285715&t=c575199b747c342d0844a1d8ab593a04',
          sell: '月售:108',
          price: '4.8'
        }
        ]
      },
      {
        title: '矿泉水',
        id: 3,
        list:[
          {
          name:'农夫山泉',
          img: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.defanli.com%2Fi4%2F792547767%2FO1CN01HuwT1T27FKjNjeyQO_%21%21792547767.jpg_q90.jpg&refer=http%3A%2F%2Fimg.defanli.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662285923&t=29d7244212e15dc78bb5bdf1d617a45f',
          sell: '月售:108',
          price: '4.8'
        },
        {
          name:'怡宝',
          img: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.yzcdn.cn%2Fupload_files%2F2018%2F11%2F05%2FFonL0_5VwTfHmiwQiAlBtIZiy3sq.jpg%3FimageView2%2F2%2Fw%2F580%2Fh%2F580%2Fq%2F75%2Fformat%2Fjpg&refer=http%3A%2F%2Fimg.yzcdn.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662339509&t=e1988f3159060384664ce3de18e45aaf',
          sell: '月售:108',
          price: '4.8'
        },
        {
          name:'农夫山泉',
          img: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.defanli.com%2Fi4%2F792547767%2FO1CN01HuwT1T27FKjNjeyQO_%21%21792547767.jpg_q90.jpg&refer=http%3A%2F%2Fimg.defanli.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662285923&t=29d7244212e15dc78bb5bdf1d617a45f',
          sell: '月售:108',
          price: '4.8'
        },
        {
          name:'怡宝',
          img: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.yzcdn.cn%2Fupload_files%2F2018%2F11%2F05%2FFonL0_5VwTfHmiwQiAlBtIZiy3sq.jpg%3FimageView2%2F2%2Fw%2F580%2Fh%2F580%2Fq%2F75%2Fformat%2Fjpg&refer=http%3A%2F%2Fimg.yzcdn.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662339509&t=e1988f3159060384664ce3de18e45aaf',
          sell: '月售:108',
          price: '4.8'
        },
        {
          name:'农夫山泉',
          img: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.defanli.com%2Fi4%2F792547767%2FO1CN01HuwT1T27FKjNjeyQO_%21%21792547767.jpg_q90.jpg&refer=http%3A%2F%2Fimg.defanli.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662285923&t=29d7244212e15dc78bb5bdf1d617a45f',
          sell: '月售:108',
          price: '4.8'
        },
        {
          name:'怡宝',
          img: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.yzcdn.cn%2Fupload_files%2F2018%2F11%2F05%2FFonL0_5VwTfHmiwQiAlBtIZiy3sq.jpg%3FimageView2%2F2%2Fw%2F580%2Fh%2F580%2Fq%2F75%2Fformat%2Fjpg&refer=http%3A%2F%2Fimg.yzcdn.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662339509&t=e1988f3159060384664ce3de18e45aaf',
          sell: '月售:108',
          price: '4.8'
        }
        ]
      },
    ]
  },
  gl(e) {
    this.setData({
      tabCur: e.currentTarget.id,
      rightCur: e.currentTarget.id,
    })
  },
  scrollLink(e) {
    let list = this.data.goodsList
    let itemHeight = 0;
    for (let i = 0; i < list.length; i++) {
      //拿到每个元素
      let els = wx.createSelectorQuery().select("#scroll-" + i);
      els.fields({
        size: true
      }, function (res) {
        list[i].top = itemHeight;
        itemHeight += res.height;
        list[i].bottom = itemHeight
      }).exec()
    }

    // 拿到滚动的高度
    let scrollTop = e.detail.scrollTop;
    for (let i = 0; i < list.length; i++) {
      if (scrollTop > list[i].top && scrollTop < list[i].bottom) {
        this.setData({
          tabCur: i,
        })
        return false
      }
    }
  }
})

wxss文件

.goodsList{
  width: 100%;
  height: 100%;
  display: flex;
}
.left{
  float: left;
  width: 260rpx;
  background-color: #EEEEEE;
  height: 100vh;
}
.left .goodsTitle{
  line-height: 100rpx;
  text-align: center;
}
.active{
  background-color: #fff;
}
.right{
  height: 100vh;
}
.goodsItem{
  padding: 20rpx;
}
.goodsName{
  text-align: center;
}

.listItem{
  position: relative;
  height: 180rpx;
  margin:  20rpx 0 ;
  border-radius: 20rpx;
  overflow: hidden;
  box-shadow: 0px 1px 4px 0px rgba(0,0,0,0.75);
}
.listItem .img{
  position: absolute;
  top: 0;
  left: 0;
  width: 180rpx;
  height: 180rpx;
  border-radius: 20rpx;
}
.listItem .add{
  position: absolute;
  right: 10rpx;
  bottom: 10rpx;
  width: 40rpx;
  height: 40rpx;
}
.listItem .name{
  position: absolute;
  top: 0;
  left: 190rpx;
  font-size: 36rpx;
  font-weight: 700;
}
.listItem .sell{
  position: absolute;
  top: 40%;
  left: 190rpx;
  color: #858687;
  font-size: 30rpx;
}
.listItem .price{
  position: absolute;
  bottom: 5rpx;
  left: 190rpx;
  color: #FF4A26;
  font-weight: 700;
}

参考资料

  • 8
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Vue是一种用于构建用户界面的渐进式JavaScript框架,它可以帮助开发者更高效地构建单页面应用程序。而vue-better-scroll是基于Vue的一款优秀的滚动插件,它能够实现更流畅的滚动效果,并且支持上下左右的滚动和联动效果。 如果需要实现左右菜单联动效果,我们可以通过使用vue-better-scroll的scrollToElement方法来实现。首先,我们需要在Vue中引入vue-better-scroll插件并进行配置。 在Vue实例的data中,我们可以定义左右两个菜单的数据,例如leftMenu和rightMenu,并在created生命周期中初始化数据。然后,在mounted生命周期中,我们可以通过refs属性获取到两个菜单容器的DOM元素。 接下来,我们需要监听左边菜单的点击事件,当点击左边菜单的某个选项时,我们可以通过调用vue-better-scroll的scrollToElement方法,将右边菜单滚动到对应的位置。通过传递目标元素的选择器或具体的DOM元素,我们可以实现左右菜单联动效果。 具体实现时,我们可以在左边菜单的点击事件中,使用this.$refs来访问右边菜单容器,并调用scrollToElement方法,将目标元素滚动到可视区域。通过传递选择器或具体DOM元素作为参数,我们可以精确控制滚动的位置。 同时,为了视觉上更好的效果,我们还可以给目标元素添加样式,如高亮当前选中项,以提升用户体验。 最后,通过一系列的事件处理和样式设置,我们就可以实现左右菜单联动demo了。 以上就是使用Vue和vue-better-scroll实现左右菜单联动demo的大致思路和步骤。通过合理运用这两个工具,我们可以轻松地实现出一个流畅、友好的用户界面效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值