微信小程序右到左联动

上一篇说了小程序的左到右的联动效果的实现,这个还不算太难,真正为难人的是右边滑动左边的选项对应切换的效果,咱今天就讲一下。话不多说先看效果。

右左联动.gif

一、关键技术:

(1) 小程序 wxss 中使用 rpx,而 js 中 scrollTop 获取到的值是 px,所以存在rpx 转 px 的问题。以 iPhone6 为基准,转换公式:

// percent 为当前设备1rpx对应的px值
var percent = res.windowWidth / 750;

详情参考:WXSS尺寸单位

(2) 微信自带scroll-view UI组件,通过 bindscroll="scroll" 绑定滚动事件;通过 scroll-top="{{scrollTop}}" 动态控制 左侧滑栏的被动滚动。

二、实现思路:

通过计算整个右侧滑栏滚动上去的高度 与 右侧滑栏中每一个分类距顶部的距离做比对,获取到该滚动置顶的分类的 index 。然后用获取到的 index 乘以左侧滑栏中某一项的高度,动态赋值给左侧滑栏内的 scrollTop ,控制左侧滑栏的联动。

图片发自简书App

以下是代码,考虑到部分新手同学,几乎为每一行代码添加了注释。

wxml代码:标签中属性如有不懂,请自行查看小程序API,内有详细讲解!

<view class="container">
  <!--左侧栏-->
  <scroll-view class=‘scroll_left‘ scroll-y="true" style="height:{{winHeight}}px;" scroll-with-animation="true" scroll-top="{{scrollTop}}">
    <view class="nav_left">
      <block wx:for="{{list}}" wx:for-index="idx" wx:for-item="itemName" wx:key="*this">
        <!--当前项的id等于item项的id,那个就是当前状态-->
        <!--用data-index记录这个数据在数组的下标位置,使用data-id设置每个item的id值,供打开2级页面使用-->
        <view class="nav_left_items {{curNav == idx ? ‘active‘ : ‘‘}}" bindtap="switchRightTab" data-index="{{index}}" data-id="{{item.id}}" id="{{idx}}">{{itemName[0].title}}</view>
      </block>
    </view>
  </scroll-view>

  <!--右侧栏-->
  <scroll-view scroll-y="true" class="scroll_right" style="height:{{winHeight}}px;" scroll-into-view="{{scrollTopId}}" scroll-with-animation="true" bindscroll="scroll">
    <view class="nav_right">
      <view class=‘mink‘ wx:for="{{list}}" wx:for-index="idx" wx:for-item="itemName" wx:key="*this">
        <view class=‘minl‘ id=‘{{idx}}‘>{{itemName[0].title}}</view>
          <block wx:for="{{itemName}}" wx:key="*this" wx:for-index="idex">
            <view class="nav_right_items" wx:if="{{idex>0}}">
              <navigator url="../detail/detail" hover-class="other-navigator-hover">
                <view>
                  <image src="{{item.picture}}"></image>
                  <view >
                    <text>{{item.desc}}</text>
                  </view>
                </view>
              </navigator>
            </view>
          </block>
        </view>
      <view style="width:100%;height:30rpx;background:#f0f4f7"></view>
    </view>
  </scroll-view>
</view>

js代码:

// pages/list-1/list-1.js
var list = require(‘../../utils/list.js‘)
Page({
  data: {
    // 左侧点击类样式
    curNav: ‘A‘,
    scrollTop: 0,
    // 定义一个空数组,用来存放右侧滑栏中每一个商品分类的 Height
    listHeight:‘‘
  },
  // 生命周期函数--监听页面初次渲染完成
  onReady: function () {
    var that = this;
    // 定义右侧标题的 rpx 高度 和 px 高度
    var right_titleRpxHeight = 60;
    var right_titleHeight;
    // 定义右侧单个商品的 rpx 高度 和 px 高度
    var right_contentRpxHeight = 180;
    var right_contentHeight;
    // 定义左侧单个tab的 rpx 高度 和 px 高度
    var left_titleRpxHeight = 140;
    var left_titleHeight;
    //  获取可视区屏幕高度
    wx.getSystemInfo({
      success: function (res) {
        // percent 为当前设备1rpx对应的px值
        var percent = res.windowWidth / 750;
        that.setData({
          winHeight: res.windowHeight,
          right_titleHeight: Number(right_titleRpxHeight * percent),
          right_contentHeight: Number(right_contentRpxHeight * percent),
          left_titleHeight: Number(left_titleRpxHeight * percent)
        })
      }
    })
    // 把请求到的 list 中的数据赋值给  listChild1
    var listChild1 = list.List[0];
    // 定义一个 names ,用于存放 scroll-into-view 使用的 id
    var names = ‘‘;
    // 循环 listChild1 中的每一项
    for (var item in listChild1) {
      // 把 listChild1 中每一项的键值用“:”(便于后期处理)分隔开,存入 names 中,数据格式见图‘names中的数据’
      names+= ":"+item;
      // 计算右侧每一个分类的 Height 。
      // listChild1 下的每一个 item 中包含该分类的 title,所以 listChild1[item].length 需要减一
      // 右侧每一个分类中每一行放两个商品,所以 this.data.right_contentHeight 除二
      // 最后加上 right_titleHeight,此时 height 为右侧一个完整分类的高度
      var height = (listChild1[item].length - 1) * this.data.right_contentHeight / 2 + this.data.right_titleHeight;
      // 同上面 names 的道理,把每一个 height 用“:”隔开放入 listHeight 中
      this.data.listHeight += ":" + height;
      this.setData({
        // 把 listChild1 赋值给 list ,供 wxml 中循环使用
        list: listChild1,
        listHeight:this.data.listHeight
      })
    }
    // 把 names 的数据切成数组
    var names = names.substring(1).split(‘:‘);
    this.setData({
      names:names
    })
  },
  // 右侧滑栏的 bindscroll 事件函数(ES6写法)
  scroll(event){
    // 把 listHeight 切割成数组
    var height = this.data.listHeight.substring(1).split(‘:‘);
    // 定义一个 index 供左侧边栏联动使用
    var index = 1;
    var num = 0;
    for(var i = 0;i<height.length;i++){
      // 累计右侧滑栏滚动上去的每一个分类的 Height
        num+=parseInt(height[i]);
        // 循环判断 num 是否大于右侧滑栏滚动上去的 Height ,然后 get 到 i 值赋给 index
        if (num > event.detail.scrollTop){
          index = i+1;
          // 如果右侧滑栏滚动高度小于单个类别高度的 1/2 时,index 为 0
          if (event.detail.scrollTop < height[0]/2) {
            index = 0;
          }
          break;
        }
    }
    // 定义并设置左侧边栏的滚动高度
    var left_scrollTop = this.data.left_titleHeight*index
    this.setData({
      scrollTop: left_scrollTop,
      // 动态给左侧滑栏传递对应该项的 id,用于高亮效果显示
      curNav: this.data.names[index]
    })
  },
  //点击左侧 tab ,右侧列表相应位置联动 置顶
  switchRightTab: function (e) {
    var id = e.target.id;
    this.setData({
      scrollTopId: id,
      // 左侧点击类样式
      curNav:id,
    })
  }
})  

样式表 和 list 数据请翻看上一篇:微信小程序左到右联动

原文地址:https://www.cnblogs.com/changk/p/9270799.html

时间: 2024-08-02 12:30:11

微信小程序右到左联动的相关文章

微信小程序源码下载(200多个)

微信小程序源码下载汇总,点击标题进入对应的微信小程序下载页面. 最新 demo源码(点击标题进入帖子下载) 描述 1 微信小程序 会议室预定小程序 微信小程序 会议室预定小程序**** 本内容被作者隐藏 **** 2 微信小程序-双人五子棋小游戏 微信小程序-双人五子棋小游戏**** 本内容被作者隐藏 **** 3 打卡签到小程序 用微信小程序实现的一个简单的打卡签到的小程序拒绝 4 微信小程序---左滑删除 微信小程序---左滑删除**** 本内容被作者隐藏 **** 5 一个借钱的记事本的微

微信小程序学习指南

作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 微信小程序正式公测, 张小龙全面阐述小程序,定档1月9日上线(附90分钟演讲全文) ... 前言:新人第一坑,跳坑指南:修改后,必须保存:ctrl+S: 1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教

微信小程序-整理各种小程序源码和资料免费下载

微信小程序整理下载 [小程序源码]微信小程序-车源宝微信版 [小程序源码]小程序-微赞社区(论坛demo) [小程序源码]微信小程序-收支账单 [小程序工具]微信小程序-日历 [小程序源码]小程序-在线聊天功能 [小程序源码]微信小程序-大好商城(新增功能天气查询和2048游戏) [小程序源码]微信小程序-查询号码归属地 [小程序源码]微信小程序-备忘录2 [小程序源码]微信小程序-QQ音乐 [小程序源码]小程序-货币汇率 [小程序源码]微信小程序-大学图书馆 [小程序源码]小程序-积分商城 [

资讯 | 2018年1月15日微信公开课解读!微信小程序开发资源

引言:2018年1月15日 微信公开课PRO开课了,本次课时内容将涉及:小程序.智慧零售.企业微信.小游戏  (附学习参考资料) 为了快速理解「2018 微信公开课 PRO 版」上张小龙的一小时演讲内容,结合下午微信公开课课室A_B_C的课时安排,这里为大家提前整理了相应的小程序学习参考资料: 微信公开课pro_A课室(14:00-17:50) 主题:小程序产品能力.开发.应用及规则 一.如何开发一个优秀的微信小程序/小游戏 微信小程序官方工具  https://mp.weixin.qq.com

微信小程序picker组件 - 省市二级联动

微信小程序picker组件自带省市区选择器,但是业务需求需要省市选择器,参考官方demo自己写了一个省市选择器 wxml文件 <view class="section"> <view class="section__title">省市二级联动demo</view> <picker mode="multiSelector" bindchange="bindMultiPickerChange&quo

微信小程序省市联动

最近呢刚好做了一个省市联动的功能,今天看到有人问这个怎么做,我就把我做的放上来共享一下: 首先呢,来看看效果,点击文字'点击',弹出选择窗口,点击取消或者确定(取消.确定按钮在选择框上边,截图有些不清楚),窗口下滑, 做这个我用的是picker-view这个组件,现在来看一看picker-view的属性: 现在开始写wxml的代码,对了,插一句,我这里是把它写成一个模板的,先看看目录结构 我们先来看看cascade.wxml里的代码: <template name="cascade&quo

微信小程序(5)--阅读器

最近用微信小程序写了一个图书阅读器,可以实现左右滑动翻页,按钮翻页,上下滚动,切换背景,控制字体大小.以及记住设置好的状态,如页面再次进来保留上次的背景色和字体大小. 由于暂时没有真实的数据接口,所以我用了静态数据. <!-- 文本 --> <view class="container" style="background:{{bodyColor}}"> <!-- 中间层,点击,头部底部显示 --> <view class=

微信小程序 瀑布流布局

今天做小程序的时候,碰到一个比较常见的需求,就是要瀑布流布局,两列,交错分布,大概如下图 最终要实现的结果就是如左图所示. 不过在微信小程序里面,不能通过JavaScript来直接操作dome,所以一些常用的方法在这里都没有办法用了.这让笔者非常着急,因为项目比较赶,不能因为这种低级的布局问题拖慢了进度. 百度了半天,发现了css3的column这个属性,但是最后实现出来的方法就如右图所示,这不符合需求,需求是两列,从左到右进行排列的,大概就像小红书APP那种瀑布流布局 最后笔者终于找到一种非常

微信小程序组件解读和分析:六、progress进度条

progress进度条组件说明: 进度条,就是表示事情当前完成到什么地步了,可以让用户视觉上感知事情的执行.progress进度条是微信小程序的组件,和HTML5的进度条progress类似. progress进度条组件示例代码运行效果如下: 下面是WXML代码: [XML] 纯文本查看 复制代码 ? 1 2 3 4 5 <!--index.wxml--> <view class="content">     <text class="con-t