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


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获取本机的外网/广域网ip地址完整源码
Aug 12 Javascript
jquery向上向下取整适合分页查询
Sep 06 Javascript
jQuery中innerWidth()方法用法实例
Jan 19 Javascript
javascript实现table表格隔行变色的方法
May 13 Javascript
动态加载js、css的实例代码
May 26 Javascript
浅谈js里面的InttoStr和StrtoInt
Jun 14 Javascript
浅谈js中的引用和复制(传值和传址)
Sep 18 Javascript
解析如何利用iframe标签以及js制作时钟
Dec 08 Javascript
vue路由拦截及页面跳转的设置方法
May 24 Javascript
React通过redux-persist持久化数据存储的方法示例
Feb 14 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
Aug 11 Javascript
微信小程序 搜索框组件代码实例
Sep 06 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
相对路径转化成绝对路径
2007/04/10 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
PHP开发框架Laravel数据库操作方法总结
2014/09/03 PHP
PHP内置的Math函数效率测试
2014/12/01 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
2015/01/26 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
php使用imagecopymerge()函数创建半透明水印
2018/01/25 PHP
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
JavaScript 面向对象之命名空间
2010/05/04 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
jQuery中prepend()方法用法实例
2014/12/25 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
2017/02/14 Javascript
Vue.Js中的$watch()方法总结
2017/03/23 Javascript
js数据类型检测总结
2018/08/05 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
python33 urllib2使用方法细节讲解
2013/12/03 Python
python实现的用于搜索文件并进行内容替换的类实例
2015/06/28 Python
Python实现将xml导入至excel
2015/11/20 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
python判断自身是否正在运行的方法
2019/08/08 Python
Python爬虫HTPP请求方法有哪些
2020/06/03 Python
简单了解python关键字global nonlocal区别
2020/09/21 Python
Revolution Beauty美国官网:英国知名化妆品网站
2018/07/23 全球购物
业务经理的岗位职责
2013/11/16 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
同意迁入证明模板
2014/10/26 职场文书
同学聚会邀请函
2015/01/30 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
爱的教育读书笔记
2015/06/26 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL