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


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 相关文章推荐
基础的prototype.js常用函数及其用法
Mar 10 Javascript
ExtJS扩展 垂直tabLayout实现代码
Jun 21 Javascript
Jquery 动态添加按钮实现代码
May 06 Javascript
jquery isType() 类型判断代码
Feb 14 Javascript
各浏览器对click方法的支持差异小结
Jul 31 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
Jan 14 Javascript
项目中常用的JS方法整理
Jan 30 Javascript
正则表达式优化JSON字符串的技巧
Dec 24 Javascript
seajs实现强制刷新本地缓存的方法分析
Oct 16 Javascript
利用ES6实现单例模式及其应用详解
Dec 09 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
Feb 27 Javascript
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
Jan 28 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学习之变量的使用
2011/05/29 PHP
PHP漏洞全解(详细介绍)
2012/11/13 PHP
PHP实现基于mysqli的Model基类完整实例
2016/04/08 PHP
php强制下载文件函数
2016/08/24 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
探讨javascript是不是面向对象的语言
2013/11/21 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
jquery datatable后台封装数据示例代码
2014/08/07 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
深入研究React中setState源码
2017/11/17 Javascript
浅析node.js的模块加载机制
2018/05/25 Javascript
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
2018/07/13 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
[01:18:36]LGD vs VP Supermajor 败者组决赛 BO3 第一场 6.10
2018/07/04 DOTA
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
python threading和multiprocessing模块基本用法实例分析
2019/07/25 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
品质标语大全
2014/06/21 职场文书
群众路线教育实践活动剖析材料
2014/09/30 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
2015元旦感言
2015/12/09 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang