微信小程序实现购物页面左右联动


Posted in Javascript onFebruary 15, 2019

本文实例为大家分享了微信小程序实现购物页面左右联动的具体代码,供大家参考,具体内容如下

效果图:

微信小程序实现购物页面左右联动

wxml

<view class="pro-container">
 <scroll-view class="left-menu" scroll-y scroll-with-animation="true" scroll-top="{{leftMenuTop}}">
  <view class="menu-item {{index===currentActiveIndex?'menu-active':''}}" wx:for="{{item}}" wx:key="{{item.index}}" id="{{index}}" catchtap='changeMenu' >{{item.typename}}</view>
 </scroll-view>
 <scroll-view v-if="item!=''" class="right-pro" bindscroll = "scroll" scroll-y scroll-with-animation="true" scroll-top="{{rightProTop}}">
  <view class="pro-item" wx:for="{{item}}">
    <view class="item-header">{{item.typename}}</view>
    <view class="pro-item-container">
      <view wx:for="{{item.shop_goods}}" wx:key="{{index}}" class="pro-item-item"> 
      <image lazy-load="true" src="{{item}}"></image>
      <text>{{item.goodname}}</text>
     </view>
    </view>
  </view>
 </scroll-view>
</view>

wxss

.left-menu{
 position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  width: 180rpx;
  background-color: #f8f8f8;
  font-size: 32rpx;
}
::-webkit-scrollbar{
 width: 0;
 height: 0;
 color: transparent;
}
.left-menu .menu-item{
 width: calc(100% - 16rpx);
 height: 80rpx;
 padding:0 8rpx;
 line-height: 80rpx;
 text-align: center;
}
.left-menu .menu-item.menu-active{
 border-left:8rpx solid red;
 padding-left: 0;
 background-color: #fff;
}
 
/* 右边商品区域 */
.right-pro{
 position: absolute;
 left: 180rpx;
 top:0;
 bottom: 0;
 width:calc(100% - 180rpx);
 background-color: #fff; 
 display: flex;
 overflow: hidden;
}
.right-pro .pro-item{
 padding:20rpx;
}
.right-pro .item-header{
 display: inline-block;
 font-size: 30rpx;
 line-height: 40rpx;
 color: #fff;
 background-color: red;
 padding:0rpx 30rpx; 
 margin: 10rpx auto;
}
.right-pro .pro-item-container{
 font-size: 28rpx;
}
.pro-item-item{
 width: calc((100% - 180rpx) / 2 );
 display:inline-block; 
}
.right-pro .pro-item-container image{
 width: 100rpx;
 height: 100rpx;
 display: block;
 margin: 0 auto;
}
.right-pro .pro-item-container text{
 display: block;
 text-align: center;
}

wxjs

let proListToTop = [], menuToTop = [], MENU = 0, windowHeight,timeoutId;
// MENU ==> 是否为点击左侧进行滚动的,如果是,则不需要再次设置左侧的激活状态
Page({
 data: {
  proList: [],
  item: [],
  item2:[
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
   {
    "typename": "服饰",
   },
  ],
  currentActiveIndex: 0
 },
 onLoad: function (options) {
  // ---------------------------ajax----------------------
  var utilMd5 = require('../../utils/md5.js');
  var md5 = utilMd5.hexMD5;
  var timestamp = new Date().getTime();
  var that = this;
  var jsonStr = JSON.stringify({ "shopid": "34" });
  var token = md5(jsonStr + timestamp) + timestamp;
  wx.request({
   url: "https://api.jvjiewang.com/Home/Shop/goods",
   data: {
    jsonStr: jsonStr,
    token: token
   },
   method: 'POST',
   header: {
    "Content-Type": "application/x-www-form-urlencoded"
   },
   success: function (res) {
    console.log(res.data.respond);
    var items = res.data.respond;
    that.setData({
     item: items
    })
   }
  })
//----------------------------ajax----------------------
  // 确保页面数据已经刷新完毕~
  setTimeout(() => {
   this.getAllRects()
  }, 200)
 },
 changeMenu(e) {
  // 改变左侧tab栏操作
  if (Number(e.target.id) === this.data.currentActiveIndex) return
  MENU = 1
  this.setData({
   currentActiveIndex: Number(e.target.id),
   rightProTop: proListToTop[Number(e.target.id)]
  })
  this.setMenuAnimation(Number(e.target.id))
 },
 scroll(e) {
  for (let i = 0; i < proListToTop.length; i++) {
   if (e.detail.scrollTop < proListToTop[i] && i !== 0 && e.detail.scrollTop > proListToTop[i - 1]) {
    return this.setDis(i)
   }
  }
  // 找不到匹配项,默认显示第一个数据
  if (!MENU) {
   this.setData({
    currentActiveIndex: 0
   })
  }
  MENU = 0
 },
 setDis(i) {
  // 设置左侧menu栏的选中状态
  if (i !== this.data.currentActiveIndex + 1 && !MENU) {
   this.setData({
    currentActiveIndex: i - 1
   })
  }
  MENU = 0
  this.setMenuAnimation(i)
 },
 setMenuAnimation(i){
  // 设置动画,使menu滚动到指定位置。
  let self = this
  
  if (menuToTop[i]) {
   console.log(11111)
   // 节流操作
   if(timeoutId){
    clearTimeout(timeoutId)
   }
   timeoutId = setTimeout(()=>{
    console.log(12138)
    self.setData({
     leftMenuTop: (menuToTop[i].top - windowHeight)
    })
   },50)
  } else {
   if (this.data.leftMenuTop === 0) return
   this.setData({
    leftMenuTop: 0
   })
  }
 },
 getActiveReacts(){
  wx.createSelectorQuery().selectAll('.menu-active').boundingClientRect(function (rects) {
   return rects[0].top
  }).exec()
 },
 getAllRects() {
 
  // 获取商品数组的位置信息
  wx.createSelectorQuery().selectAll('.pro-item').boundingClientRect(function (rects) {
   rects.forEach(function (rect) {
    proListToTop.push(rect.top)
   })
  }).exec()
 
  // 获取menu数组的位置信息
  wx.createSelectorQuery().selectAll('.menu-item').boundingClientRect(function (rects) {
   wx.getSystemInfo({
    success: function (res) {
     windowHeight = res.windowHeight / 2
     rects.forEach(function (rect) {
      menuToTop.push({
       top: rect.top,
       // animate:rect.top > windowHeight
       })
     })
    }
   })
  }).exec()
 },
 // 获取系统的高度信息
 getSystemInfo() {
  let self = this
  wx.getSystemInfo({
   success: function (res) {
    windowHeight = res.windowHeight / 2
   }
  })
 }
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ajax提交表单实现网页无刷新注册示例
May 08 Javascript
纯javascript实现分页(两种方法)
Aug 26 Javascript
js完整倒计时代码分享
Sep 18 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
Dec 15 Javascript
深入理解JS继承和原型链的问题
Dec 17 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
Dec 19 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
Feb 19 Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
May 08 jQuery
React 源码中的依赖注入方法
Nov 07 Javascript
原生js实现each方法实例代码详解
May 27 Javascript
通过实例了解JS 连续赋值
Sep 24 Javascript
解决vue项目F5刷新mounted里的函数不执行问题
Nov 05 Javascript
微信小程序基于picker实现级联菜单
Feb 15 #Javascript
微信小程序实现多个按钮的颜色状态转换
Feb 15 #Javascript
详解react-refetch的使用小例子
Feb 15 #Javascript
小程序实现多列选择器
Feb 15 #Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
Feb 15 #jQuery
微信实现自动跳转到用其他浏览器打开指定APP下载
Feb 15 #Javascript
微信小程序实现联动选择器
Feb 15 #Javascript
You might like
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
基于文本的访客签到簿
2006/10/09 PHP
php简单静态页生成过程
2008/03/27 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
PHP连接MySQL数据库操作代码实例解析
2020/07/11 PHP
关于JavaScript的一些看法
2009/05/27 Javascript
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
2011/07/28 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
JavaScript ES5标准中新增的Array方法
2016/06/28 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
vue单文件组件lint error自动fix与styleLint报错自动fix详解
2019/01/08 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
python下10个简单实例代码
2017/11/15 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
Django 多语言教程的实现(i18n)
2018/07/07 Python
浅析Python 读取图像文件的性能对比
2019/03/07 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
保安自我鉴定范文
2013/12/08 职场文书
小学生自我评价范文
2014/01/25 职场文书
规划编制实施方案
2014/03/15 职场文书
个园导游词
2015/02/04 职场文书
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL