<view class="container"> <scroll-view class="side-nav" style="height:100%;" scroll-y="true"> <view class="type-list"> <view class="type-item" wx:for="{{imgArray}}" wx:for-item="item" bindtap="changepage" id="{{index}}" scroll-top="{{scollTop}}"> <view class="type__img" style="background:url('{{item.url}}');background-size: contain;"></view> <view class="type__desc">{{item.title}}</view> </view> </view> </scroll-view> <scroll-view class="main-page" style="height:100%;" scroll-y="true" scroll-into-view="{{scroll_into_view}}"> <view class="food-list" wx:for="{{foodArray}}" wx:for-item="item" id="foodtype{{index}}"> <view class="food__title">{{item.title}}</view> <view class="food-item" wx:for="{{item.foodsIndex}}" wx:for-item="food" wx:for-index="foodidx" id="food{{index}}"> <image class="food-left" src='{{food.url}}'></image> <view class="food-right"> <view class="food__name">{{food.name}}</view> <view class="food__price">{{food.price}}¥</view> <view class="food__add" data-foodidx="{{index}}{{foodidx}}" data-price="{{food.price}}" data-name="{{food.name}}" catchtap="addShopcart">+</view> </view> </view> </view> </scroll-view> <view class="shopcart" bindtap="showCart" hidden="{{cartIsHidden}}"> <view class="shopcart-main"> <view class="shopcart-left"> <image src="../../image/shopcart.png" class="shopcart__icon"></image> <view class="shopcart__count">{{totalCount}}</view> </view> <view class="shopcart-middle"> <view class="shopcart__price">¥ <text>{{totalPrice}}</text> </view> </view> <view class="shopcart-right" catchtap="toCount"> <text>选好了</text> </view> </view> </view> </view> <view class="list-mask" hidden="{{cartIndexIsHidden}}" animation="{{animationData}}"> <view hidden="{{cartIndexIsHidden}}" class="shopcart__items" wx:for="{{shoppingList}}" wx:for-item="item"> <view class="shopcart__item" hidden="{{cartIndexIsHidden}}"> <view class="cart__left"> <view class="item__h3">{{item.name}}</view> <view class="item__price">¥{{item.price}}</view> </view> <view class="cart__right"> <view class="food__add food__add--delete" data-foodidx="{{index}}" data-price="{{item.price}}" data-name="{{item.name}}" catchtap="deleteShopcartInCart">-</view> <text>{{item.num}}</text> <view class="food__add" data-foodidx="{{index}}" data-price="{{item.price}}" data-name="{{item.name}}" catchtap="addShopcartInCart">+</view> </view> </view> </view> </view> |
.container { position: relative; display: flex; flex-direction: row; height: 667px; width: 100%; overflow-y: hidden; } .main-page { height: 100%; background-color: #fff; z-index: 1; } .side-nav { height: 100%; width: 21.333333%; background-color: #f5f0e9; z-index: 1; } .type-list { width: 100%; height: 100%; } .type-item { width: 100%; height: 92px; text-align: center; position: relative; } .type-item .type__img { display: inline-block; width: 50px; height: 50px; } .type-item .type__desc { position: absolute; top: 50px; width: 100%; font-size: 12px; color: gray; } .page { height: 100%; border-bottom: 1px solid #000; } .buttonArea { height: 30%; display: flex; flex-direction: column; justify-content: space-around; position: fixed; top: 0px; left: 0px; } .food-item { width: 100%; height: 161px; position: relative; } .food-left, .food-right { height: 100%; width: 50%; display: inline-block; } .food-left { width: 140px; height: 140px; vertical-align: middle; } .food-right { text-align: right; } .food__name { opacity: .8; font-weight: 500; font-size: 14px; margin-top: 5px; } .food__price { font-size: 28px; color: #e02d3f; font-weight: 600; } .food__add { float: right; width: 24px; height: 24px; line-height: 22px; font-size: 16px; text-align: center; color: #e02d3f; border: 1px solid #d6d3d3; border-radius: 37px; } .food__title,.food-item { border-bottom: 1px solid #d6d3d3; } .food__title { color: gray; font-size: 12px; height: 15px; line-height: 15px; text-align: center; padding: 0 5px; } .shopcart { position: fixed; background-color: #e02d3f; height: 45px; width: 100%; bottom: 0px; left: 0; z-index: 9; } .shopcart-main { display: flex; height: 45px; } .shopcart-left { flex: 2; position: relative; } .shopcart__icon { padding-top: 8px; height: 32px; width: 50px; } .shopcart__count { position: absolute; top: 5px; left: 46px; height: 15px; width: 15px; font-size: 12px; border-radius: 99px; background-color: #ff7b0f; color: #fff; text-align: center; line-height: 15px; } .shopcart-middle { flex: 5; background-color: #e02d3f; border-right: 1px solid #fff; } .shopcart__price { line-height: 45px; text-align: left; color: #fff; } .shopcart__price text { font-size: 24px; } .shopcart-right { position: relative; flex: 3; line-height: 45px; } .shopcart-right text { text-align: center; color: #fff; font-size: 16px; font-weight: 300; margin-left: 14px; } .shopcart-right:after { content: ''; position: absolute; top: 15px; left: 78px; height: 12px; width: 12px; opacity: .7; border-top: 2px solid #fff; border-right: 2px solid #fff; transform: rotateZ(45deg) } .item { background-color: rebeccapurple ; } .list-mask { position: fixed; width: 100%; height: 55px; bottom: 0px; left: 0px; background-color: #fff; z-index: 5; } .shopcart__items { width: 100%; } .shopcart__items { width: 375px; background-color: rgba(0,0,0,.7); } .shopcart__item { height: 65px; display: flex; background-color: #fff; border-bottom: 1px solid #f5f0e9; } .cart__left { margin-left: 4px; margin-top: 8px; flex: 1; } .cart__right { margin-top: 14px; } .cart__right .food__delete, .cart__right text,.cart__right .food__add { float: left; margin-right: 6px; } .shopcart__items:after,.cart__right:after { clear: both; content: ' '; display: table; } .item__h3 { font-weight: 500; font-size: 14px; } .item__price { font-size: 18px; color: #e02d3f; } |
// 初始化动画实例 let animation = wx.createAnimation({ duration: 400, timingFunction: "linear", delay: 0 }); Page({ data: { scollTop: 0, scroll_into_view: 'foodtype0', // scroll-view的初始位置 imgArray: [], // 导航的图片数组,通过ajax获取 foodArray: [], // 食品的对象数组 shoppingList: [], // 购物车储存的对象数组 totalPrice: 0, // 购物车的总价格 totalCount: 0, // 购物车的总数量 movelength: 0, // 上移或下拉动画的单位距离 cartIsHidden: true, // 购物车是否隐藏 cartIndexIsHidden: true, // 购物车详情菜单是否隐藏 animationData: {} // 动画动作对象 }, // 设置标题名 onReady: function () { wx.setNavigationBarTitle({ title: '菜单' }) }, // 加载ajax的最佳时机 onLoad: function (options) { let that = this wx.showToast({ title: '加载中', icon: 'loading', duration: 0, mask: true }) // 发送请求 wx.request({ url: 'http://easy-mock.com/mock/5905d4597a878d73716e2c6b/kfc/kfc', method: 'GET', data: {}, header: { 'Accept': 'application/json' }, success: function (res) { console.log(res.data) that.setData({ imgArray: res.data.navArray, foodArray: res.data.foodArray }) } }, function () { wx.hideToast(); }) }, // 跳页的id changepage: function (e) { // 滚动到指定的id let goPage = e.currentTarget.id this.setData({ scroll_into_view: "foodtype" + goPage }) }, // 点击‘+’添加进购物车 addShopcart: function (e) { let move_length = this.data.movelength; let shopping_list = this.data.shoppingList; let total_price = this.data.totalPrice; let total_count = this.data.totalCount + 1; total_price = parseInt(total_price) + parseInt(e.target.dataset.price); let itemNum = 1; let that = this; // 是否有同种商品判断 if (this.data.shoppingList.length > 0) { // 商品名是否相同判断,不重复添加同名商品 let isHave = this.data.shoppingList.findIndex(item => item.name == e.target.dataset.name) if (isHave != -1) { that.data.shoppingList[isHave].num++ } else { // 购物车数组加进新的一样食品 that.data.shoppingList.push({ price: e.target.dataset.price, name: e.target.dataset.name, num: itemNum }) // 动画效果的长度添加 move_length++ } // 没有商品时直接添加 } else { this.data.shoppingList.push({ price: e.target.dataset.price, name: e.target.dataset.name, num: itemNum }) move_length++ } // 动画上拉长度对应的bottom的计算 /** * mlength是bottom的长度 * animation.bottom(mlength).step() 加入动画队列 */ let mlength = move_length * 55; if (move_length > 1) { mlength = 55 + (move_length - 1) * 65; } this.animation = animation animation.bottom(mlength).step() this.setData({ animationData: animation.export() }) this.setData({ shoppingList: shopping_list, totalPrice: total_price, totalCount: total_count, // 购物车当有商品时弹出 cartIsHidden: false, movelength: move_length }) }, // 购物车详情抽屉点击时弹出 showCart: function (e) { let move_length = 0; move_length = this.data.movelength * 55; if (this.data.movelength > 1) { move_length = 55 + (this.data.movelength - 1) * 65; } this.animation = animation animation.bottom(move_length).step() let cart_indexIsHidden = !this.data.cartIndexIsHidden; this.setData({ cartIndexIsHidden: cart_indexIsHidden, animationData: animation.export() }) }, // 购物车详情抽屉中增加数量 addShopcartInCart: function (e) { let total_count = this.data.totalCount + 1; let addTarget = this.data.shoppingList.findIndex(item => item.name === e.target.dataset.name); this.data.shoppingList[addTarget].num++; let tempPrice = parseInt(this.data.totalPrice) + parseInt(this.data.shoppingList[addTarget].price) this.setData({ shoppingList: this.data.shoppingList, totalPrice: tempPrice, totalCount: total_count }) }, // 购物车详情抽屉中减少数量,但没有商品时需要抽屉下降并购物车组件消失 deleteShopcartInCart: function (e) { let move_length = this.data.movelength; // 选定被点击的元素 let addTarget = this.data.shoppingList.findIndex(item => item.name === e.target.dataset.name); let tempPrice = 0; let total_count = this.data.totalCount - 1; this.data.shoppingList[addTarget].num--; if (this.data.shoppingList[addTarget].num < 1) { // 总价的减少 tempPrice = parseInt(this.data.totalPrice) - parseInt(this.data.shoppingList[addTarget].price) this.data.shoppingList.splice(addTarget, 1); move_length--; // bottom值变化产生动画 let mlength = move_length * 61; if (move_length < 2) { mlength = move_length * 50 } if (move_length < 1) { mlength = -55 } console.log(this.data.totalPrice) this.animation = animation animation.bottom(mlength).step() // 总数等于0时购物车组件设置为消失 if (total_count == 0) { let cart_isHidden = !this.data.cartIsHidden console.log(cart_isHidden) // 这里设置一个计时器,让下拉抽屉动画完成后再消失组件,不然体验性太差 setTimeout(() => { this.setData({ cartIsHidden: cart_isHidden }) }, 1000) } this.setData({ shoppingList: this.data.shoppingList, movelength: move_length, animationData: animation.export(), totalPrice: tempPrice }) } else { // 计算出来新的价格 tempPrice = parseInt(this.data.totalPrice) - parseInt(this.data.shoppingList[addTarget].price) console.log(this.data.totalPrice) } this.setData({ shoppingList: this.data.shoppingList, totalPrice: tempPrice, totalCount: total_count }) }, toCount: function (e) { console.log(this.data.totalCount) // 菜单对象 let OrderMenu = { list: this.data.shoppingList, price: this.data.totalPrice, count: this.data.totalCount } // 本地存储菜单对象 wx.setStorage({ key: "OrderMenu", data: OrderMenu }); wx.navigateTo({ url: '../order/order' }) } }) |
模板简介:该模板名称为【微信小程序肯德基产品食物分类菜单设计制作开发教程】,大小是,文档格式为.,推荐使用打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【小程序教程】栏目查找您需要的精美模板。