微信小程序之自定义模态d窗(带动画)实例

微信小程序之自定义模态d窗(带动画)实例,第1张

首先看看官方提供的模态d窗

api如下:

示例:

这样的模态d窗,充其量只能做个alert,提示一下信息。

但是并不能使用它来处理复杂性的d窗业务,因此写了Michael从新自定义了一个,采用了仿原生的样式写法

wxml****:

wxss:

js:

相关连接: http://blog.csdn.net/michael_ouyang/article/details/54700871

------------------------------------------------------------

微信开发者工具的快捷键

微信小程序的文件结构 —— 微信小程序教程系列(1)

微信小程序的生命周期实例演示 —— 微信小程序教程系列(2)

微信小程序的动态修改视图层的数据 —— 微信小程序教程系列(3)

微信小程序的新建页面 —— 微信小程序教程系列(4)

微信小程序的如何使用全局属性 —— 微信小程序教程系列(5)

微信小程序的页面跳转 —— 微信小程序教程系列(6)

微信小程序标题栏和导航栏的设置 —— 微信小程序教程系列(7)

微信小程序的作用域和模块化 —— 微信小程序教程系列(8)

微信小程序视图层的数据绑定 —— 微信小程序教程系列(9)

微信小程序视图层的条件渲染 —— 微信小程序教程系列(10)

微信小程序视图层的列表渲染 —— 微信小程序教程系列(11)

微信小程序视图层的模板 —— 微信小程序教程系列(12)

微信小程序之wxss —— 微信小程序教程系列(13)

微信小程序的网络请求 —— 微信小程序教程系列(14)

微信小程序的百度地图获取地理位置 —— 微信小程序教程系列(15)

微信小程序使用百度api获取天气信息 —— 微信小程序教程系列(16)

微信小程序获取系统日期和时间 —— 微信小程序教程系列(17)

微信小程序之上拉加载和下拉刷新 —— 微信小程序教程系列(18)

微信小程序之组件 —— 微信小程序教程系列(19)

微信小程序之微信登陆 —— 微信小程序教程系列(20)

------------------------------------------------------------

微信小程序之顶部导航栏实例 —— 微信小程序实战系列(1)

微信小程序之上拉加载(分页加载)实例 —— 微信小程序实战系列(2)

微信小程序之轮播图实例 —— 微信小程序实战系列(3)

微信小程序之仿android fragment之可滑动的底部导航栏实例 —— 微信小程序实战系列(4)

微信小程序之登录页实例 —— 微信小程序实战系列(5)

微信小程序之自定义toast实例 —— 微信小程序实战系列(6)

微信小程序之自定义抽屉菜单(从下拉出)实例 —— 微信小程序实战系列(7)

微信小程序之自定义模态d窗(带动画)实例 —— 微信小程序实战系列(8)

------------------------------------------------------------

微信小程序之侧栏分类 —— 微信小程序实战商城系列(1)

微信小程序之仿淘宝分类入口 —— 微信小程序实战商城系列(2)

微信小程序之购物数量加减 —— 微信小程序实战商城系列(3)

微信小程序之商品属性分类 —— 微信小程序实战商城系列(4)

微信小程序之购物车 —— 微信小程序实战商城系列(5)

未完待续。。。

更多小程序的教程: http://blog.csdn.net/column/details/14653.html

谢谢观看,不足之处,敬请指导

往左边滑动出现删除按钮, 只对当前滑动的对象 *** 作

<view class="shop-list">

    <view class="check-all-box" bindtap="onCheckAll">

      <view>

        <label class="check-around8"  bindtap="selected" data-lor='1'>

          <radio checked="{{allSelected?true:false}}" color="#000"></radio>

          <text class="check-all">{{checkAllText}}全选</text>

        </label> 

      </view>

    </view>

    <view class="item-box  {{item.isTouchMove ? 'touch-move-active' : ''}}" data-index="{{index}}" bindtouchstart="touchstart" bindtouchmove="touchmove" wx:for="{{list}}" wx:key="{{index}}">

      <view class="item">

        <view class="check-around-box" data-id="{{item.id}}" >

            <label bindtap="selected" data-id="{{item.id}}" data-isSelect="{{item.isSelect}}">

              <radio checked="{{item.isSelect>0?true:false}}" color="#000"></radio>

            </label>   

          </view>

        <view class="item-img-box">

          <image class="item-img" src="{{item.thumbUrl}}" />

        </view>

        <view class="item-info-box">

          <text class="item-title">{{item.title}}</text>

          <text class="item-spec">{{item.spec}}</text>

          <text class="item-price">¥{{item.price}}</text>

          <view class="num-box">

            <view class="num-desc" data-id="{{item.id}}" data-total="{{item.total}}" bindtap="reduce">-</view>

            <input class="item-input" type="number"disabled="boolean" value="{{item.total}}" />

            <view class="num-plus" data-id="{{item.id}}" data-total="{{item.total}}" bindtap="plus">+</view>

          </view>

        </view>

      </view>

      <view class="remove" data-id="{{item.id}}" bindtap="remove">{{remove}}删除</view>

    </view>

  </view>

page{

  background-color: #f8f8f8

}

.shop-list {

  display: flex

  flex-direction: column

  margin-top: 30rpx

  padding-bottom:120rpx

}

.check-all-box {

  display: flex

  align-items: center

  padding: 30rpx

  background-color: #fff

}

.check-all-box  .check-all {

  margin-left: 20rpx

  font-size: 30rpx

}

.check-around {

  width: 35rpx

  height: 35rpx

  margin-right:20rpx

  border-radius: 50rpx

  border: 1rpx solid #f8f8f8

}

.check-active {

  width: 35rpx

  height: 35rpx

  border-radius: 50rpx

  background-color: #999999

}

.item-box {

  margin-bottom: 20rpx

  position: relative

  z-index: 99

  font-size: 14px

  display: flex

  justify-content: space-between

  border-bottom:1px solid #ccc

  width: 100%

  overflow: hidden

}

.item {

  display: flex

  align-items: center

  padding: 30rpx

  background-color: #fff

  position: relative

  z-index: 99

  width: 100%

  margin-right:0

  -webkit-transition: all 0.4s

  transition: all 0.4s

  -webkit-transform: translateX(90px)

  transform: translateX(90px)

  margin-left: -90px

}

.item .item-img {

  width: 180rpx

  height: 180rpx

  border-radius: 5rpx

  border: 1rpx solid #eaeaea

}

.item .item-info-box {

  display: flex

  flex-direction: column

  justify-content: space-between

  width: 420rpx

  height: 180rpx

  margin-left:20rpx

}

.item-info-box .item-title {

  font-size: 30rpx

  white-space: nowrap

  text-overflow: ellipsis

  overflow: hidden

  word-break: break-all

}

.item-info-box .item-spec {

  color: #676767

  margin-top: 15rpx

  text-overflow: -o-ellipsis-lastline

  overflow: hidden

  text-overflow: ellipsis

  display: -webkit-box

  -webkit-line-clamp: 2

  line-clamp: 2

  -webkit-box-orient: vertical

}

.item-info-box .item-price {

  display: flex

  margin-top: 15rpx

}

.item-info-box .num-box {

  display: flex

  align-items: center

  justify-content: flex-end

  font-size: 30rpx

}

.num-box .num-desc {

  padding: 0 10rpx

  color: #999

  border: 4rpx solid #999

}

.num-box .item-input {

  width: 80rpx

}

.item-input {

  text-align: center

}

.num-box .num-plus {

  padding: 0 10rpx

  color: #fff

  background-color: #000

  border: 4rpx solid #000

}

.remove {

  background-color: orangered

  width: 90px

  display: flex

  flex-direction: column

  align-items: center

  justify-content: center

  color: #fff

  -webkit-transform: translateX(90px)

  transform: translateX(90px)

  -webkit-transition: all 0.4s

  transition: all 0.4s

}

.touch-move-active .item,

.touch-move-active .remove {

  -webkit-transform: translateX(0)

  transform: translateX(0)

}

var app = getApp()

Page({

  data: {

    list: [

      {

        id: '1',

        thumbUrl: 'https://cdnimg.pfhoo.com/Pro/s/20180404/8a22565d-9bb3-4b87-bf58-00e9db0e2d28.jpg',

        title: '大英博物馆珠宝首饰系列“OK”首饰',

        spec: 'K黄',

        price: '199.10',

        num: 1,

        total: 10

      }, {

        id: '2',

        thumbUrl: 'https://cdnimg.pfhoo.com/Pro/s/20180404/8a22565d-9bb3-4b87-bf58-00e9db0e2d28.jpg',

        title: '大英博物馆珠宝首饰系列“OK”首饰',

        spec: 'K黄',

        price: '899.20',

        num: 1,

        total: 1

      }

    ],

    startX: 0, //开始坐标

    startY: 0

  },

  onLoad: function () {

  },

  //手指触摸动作开始 记录起点X坐标

  touchstart: function (e) {

    //开始触摸时 重置所有删除

    this.data.list.forEach(function (v, i) {

      if (v.isTouchMove)//只 *** 作为true的

        v.isTouchMove = false

    })

    this.setData({

      startX: e.changedTouches[0].clientX,

      startY: e.changedTouches[0].clientY,

      list: this.data.list

    })

  },

  //滑动事件处理

  touchmove: function (e) {

    var that = this,

      index = e.currentTarget.dataset.index,//当前索引

      startX = that.data.startX,//开始X坐标

      startY = that.data.startY,//开始Y坐标

      touchMoveX = e.changedTouches[0].clientX,//滑动变化坐标

      touchMoveY = e.changedTouches[0].clientY,//滑动变化坐标

      //获取滑动角度

      angle = that.angle({ X: startX, Y: startY }, { X: touchMoveX, Y: touchMoveY })

    that.data.list.forEach(function (v, i) {

      v.isTouchMove = false

      //滑动超过30度角 return

      if (Math.abs(angle) >30) return

      if (i == index) {

        if (touchMoveX >startX) //右滑

          v.isTouchMove = false

        else //左滑

          v.isTouchMove = true

      }

    })

    //更新数据

    that.setData({

      list: that.data.list

    })

  },

  /**

  * 计算滑动角度

  * @param {Object} start 起点坐标

  * @param {Object} end 终点坐标

  */

  angle: function (start, end) {

    var _X = end.X - start.X,

      _Y = end.Y - start.Y

    //返回角度 /Math.atan()返回数字的反正切值

    return 360 * Math.atan(_Y / _X) / (2 * Math.PI)

  },

  //删除事件

  remove: function (e) {

    let that =this

    let index = e.currentTarget.dataset.index

    let list = that.data.list

    wx.showModal({

      title: 'w温馨提示!',

      content: '你确认删除吗?',

      success: function (res) {

        if (res.confirm) {

          console.log('444')

          list.splice(index, 1)

          that.setData({

            list:list

          })

        } else{

          console.log('用户点击取消')

        }

      }

    })

  }

})

微信小程序的购物车功能

在商品列表页

index.wxml

中,给下单按钮绑定一个添加购物车的事件

addCart

,使用

catchtap

是不会冒泡,同时传入

data-item

,当前的商品,代码如下所示:

1

<view class="order" catchtap="addCart" data-item="{{ item }}">下单</view>

index.js

中,在

Page

中,定义

addCart

事件。对此,可以分析一下当点击按钮以后添加购物车的逻辑:

拿到点击要添加入到购物车的商品

判断该商品在不在购物车里面

如果不在, 把该商品添加到购物车里面, 并且新加一个字段

num = 1

如果在,修改改商品的

num

值 累加

addCart

中,第一步拿到该商品,通过

e.currentTarget.dataset

获取。第二步,判断该商品在不在购物车里面,根据

_id

尝试从购物车里面获取数据,看能不能获取的到。使用

try...catch

,在有值的情况下,把购物车里面的该商品的

num

值累加

,并且进行下单成功的提示;在没有值,把商品添加到购物车里面,并且进行下单成功的提示,最后调用

setTabBar()

方法修改底部购物车


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11349864.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存