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


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 相关文章推荐
js Event对象的5种坐标
Sep 12 Javascript
两种常用的javascript数组去重方法思路及代码
Mar 26 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
Apr 01 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
Mar 18 Javascript
jQuery实现边框动态效果的实例代码
Sep 23 Javascript
JavaScript面试题(指针、帽子和女朋友)
Nov 23 Javascript
微信小程序教程系列之新建页面(4)
Apr 17 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
Aug 21 Javascript
VUE脚手架的下载和配置步骤详解
Apr 01 Javascript
Layui表格行工具事件与数据回填方法
Sep 13 Javascript
vue使用swiper.js重叠轮播组建样式
Nov 14 Javascript
vue通过接口直接下载java生成好的Excel表格案例
Oct 26 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
php汉字转拼音的示例
2014/02/27 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
2016/05/13 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
又一个小巧的图片预加载类
2007/05/05 Javascript
用jQuery技术实现Tab页界面之二
2009/09/21 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
AngularJS中取消对HTML片段转义的方法例子
2015/01/04 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
js实现页面刷新滚动条位置不变
2016/11/27 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
Python中optionParser模块的使用方法实例教程
2014/08/29 Python
基于Python log 的正确打开方式
2018/04/28 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
简历的个人自我评价范文
2014/01/03 职场文书
财务会计自荐信范文
2014/02/21 职场文书
作文评语集锦大全
2014/04/23 职场文书
个性车贴标语
2014/06/24 职场文书
代领毕业证委托书
2014/08/02 职场文书
教师竞聘上岗演讲稿
2014/09/03 职场文书
女生抽烟检讨书
2014/10/05 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
军训结束新闻稿
2015/07/17 职场文书
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis