微信小程序实现左右联动的实战记录


Posted in Javascript onJuly 05, 2018

前言

最近在学习小程序,实现了左右联动的功能,记录一下思绪,方便以后参考。

最终的界面如下, 点击左边任意一个项目,右边会跳到相应项目的起始位置,右边滑动,左则会跳到相应的位置。

微信小程序实现左右联动的实战记录

微信小程序实现左右联动的实战记录 

实现思路

在这里,右则每一项的高度都是固定的,方便定位当前滑动距离在哪一个大项(左则)里。右则的 scroll-view 使用了一项关键的属性:scroll-into-view,这个属性用来确定 scrollTop 的值的,当 scroll-into-view 的值和 scroll-view 里面的元素的id的值相等时,scroll-view 会定位到该元素,scrollTop 的值就是滑动到该元素的值。

做这个功能的时候,遇到一个问题,就是右则的小项种类不多的时候,例如某个类目只有1~2个,那么点击左则的大项的时候,会出现点击不到的现象。这里可以用点小技巧来解决:

点击左则大项的时候,设置当前点击标记为true,设置 classifySeleted 为当前点击的项目。 然后在滑动触发函数(onGoodsScroll)里面,判断当前触发滑动是否点击产生的,如果是,则不设置 classifySeleted  的值,否则就计算 classifySeleted 的值并设置。

示例代码:

wxml代码如下:

<view class="content-container">
  <scroll-view class="classify-container" scroll-y="true">
   <view class="classify {{classifySeleted==classify.typeId?'active':''}}" wx:for="{{cakeTypes}}" wx:for-item="classify" wx:key="id" data-id="{{classify.typeId}}" bindtap="tapClassify">
    <view class="name">{{classify.typeName}}</view>
   </view>
  </scroll-view>
  <scroll-view class="goods-container" scroll-y="true" scroll-into-view="{{'inToView' + typeIndex}}" bindscroll="onGoodsScroll" scroll-top="{{scrollTop}}">
   <view wx:for="{{cakeTypes}}" wx:for-item="classify" wx:key="id">
    <view class="title" id="{{'inToView'+classify.typeId}}">{{classify.typeName}}</view>
    <view class="goods" wx:for="{{classify.productIds}}" wx:for-item="cake" wx:key="id">
     <image class="pic" src="{{cake.imgSrc}}" data-src="{{cake.imgSrc}}" data-list="{{cake.imgSrc}}" bindtap="tapImg"></image>
     <view class="name ellipsis">{{cake.name}}</view>
     <view class="sold">{{cake.introduce}}</view>
     <view class="price">¥{{cake.price}}</view>
    </view>
   </view>
  </scroll-view>
 </view>

js代码如下:

onGoodsScroll: function (e) {

 var scrollTop = e.detail.scrollTop;
 var h = 0;
 var classifySeleted = this.data.classifySeleted;
 var titleHeight = Math.ceil(70 * this.data.percent);
 var itemHeight = Math.ceil(180 * this.data.percent);

 this.data.cakeTypes.forEach(function (classify, i) {
  console.log("h:" + h + " scrollTop:" + scrollTop);
  var _h = titleHeight + classify.productIds.length * itemHeight; 
  if (scrollTop >= h - 10) {
  classifySeleted = classify.typeId;
  }
  h += _h;
 });

 if (this.data.isTap) {
  this.setData ({
  isTap: false
  })
 } else {
  this.setData({
   classifySeleted: classifySeleted
  }); 
 } 
 },

 tapClassify: function (e) {
 var id = e.target.dataset.id;
 this.setData({
  isTap: true,
  classifySeleted: id,
  typeIndex: id
 });
 },

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript中的eval()函数详解
Aug 22 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
Nov 09 Javascript
微信小程序 获取微信OpenId详解及实例代码
Oct 31 Javascript
利用js定义一个导航条菜单
Mar 14 Javascript
深入浅析Vue不同场景下组件间的数据交流
Aug 15 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
Sep 04 Javascript
Vue动态获取width的方法
Aug 22 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
Sep 15 Javascript
vue watch关于对象内的属性监听
Apr 22 Javascript
javascript将扁平的数据转为树形结构的高效率算法
Feb 27 Javascript
使用这 6个Vue加载动画库来减少我们网站的跳出率
May 18 Vue.js
输入框跟随文字内容适配宽实现示例
Aug 14 Javascript
vue实现自定义多选与单选的答题功能
Jul 05 #Javascript
JavaScript实现图片懒加载的方法分析
Jul 05 #Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
Jul 05 #Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
Jul 05 #Javascript
vue使用ElementUI时导航栏默认展开功能的实现
Jul 04 #Javascript
vue两个组件间值的传递或修改方式
Jul 04 #Javascript
jQuery实现炫丽的3d旋转星空效果
Jul 04 #jQuery
You might like
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
jQuery Tools tab使用介绍
2012/07/14 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
jquery仿百度百科底部浮动导航特效
2015/08/08 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
8 行 Node.js 代码实现代理服务器
2016/12/05 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
微信小程序之数据缓存的实例详解
2017/09/29 Javascript
Bootstrap栅格系统的使用详解
2017/10/30 Javascript
vue ssr 指南详读
2018/06/29 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
2018/08/20 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
[51:28]EG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/16 DOTA
python编写暴力破解FTP密码小工具
2014/11/19 Python
Python松散正则表达式用法分析
2016/04/29 Python
python 实时得到cpu和内存的使用情况方法
2018/06/11 Python
python async with和async for的使用
2019/06/20 Python
python实现发送邮件
2021/03/02 Python
html5 乒乓球(碰撞检测)实例二
2013/07/25 HTML / CSS
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
美国知名的旅游网站:OneTravel
2018/10/09 全球购物
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
解释i节点在文件系统中的作用
2013/11/26 面试题
服务之星获奖感言
2014/01/21 职场文书
测控技术自荐信
2014/06/05 职场文书
应急处置方案
2014/06/16 职场文书
毕业生政审意见范文
2015/06/04 职场文书
致青春观后感
2015/06/09 职场文书
公司处罚决定书
2015/06/24 职场文书
PyQt5爬取12306车票信息程序的实现
2021/05/14 Python