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


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 相关文章推荐
深入理解Javascript闭包 新手版
Dec 28 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
Aug 26 Javascript
javascript中的作用域和上下文使用简要概述
Dec 05 Javascript
让IE8浏览器支持function.bind()方法
Oct 16 Javascript
JavaScript中对象property的删除方法介绍
Dec 30 Javascript
javascript中attachEvent用法实例分析
May 14 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
Aug 27 Javascript
ReactNative实现Toast的示例
Dec 31 Javascript
Vue父组件调用子组件事件方法
Feb 23 Javascript
JS隐藏号码中间4位代码实例
Apr 09 Javascript
js简单遍历获取对象中的属性值的方法示例
Jun 19 Javascript
vue路由缓存的几种实现方式小结
Feb 02 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
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
php仿ZOL分页类代码
2008/10/02 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
2013/06/28 PHP
Firefox window.close()的使用注意事项
2009/04/11 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
详解Node 定时器
2018/02/26 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
2018/02/26 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
利用vue-i18n实现多语言切换效果的方法
2019/06/19 Javascript
基于Express框架使用POST传递Form数据
2019/08/10 Javascript
vue-model实现简易计算器
2020/08/17 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
Python中条件判断语句的简单使用方法
2015/08/21 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
2018/04/22 Python
python删除不需要的python文件方法
2018/04/24 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
Django接收自定义http header过程详解
2019/08/23 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
2021/02/07 Python
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
焊接专业毕业生求职信
2013/10/01 职场文书
装修施工安全责任书
2014/07/24 职场文书
班级活动总结格式
2014/08/30 职场文书
八一建军节演讲稿
2014/09/10 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
法院授权委托书格式
2014/09/28 职场文书
Python 视频画质增强
2022/04/28 Python