• 小程序左滑删除之<movable-area/>实现


    之前在做项目的过程中有这么一个需求,列表左滑删除,这里我使用的小程序的<movable-area/>(官方地址)实现的,最终研究了一番,实现了产品需求。效果图如下:

     实现思路:

        1、最外层标签使用movable-area标签,宽高必须固定;

          2、子标签必须使用movable-view,宽高和父元素movable-area一样,不是子标签无法移动;

          3、使用view标签将,列表内容和删除按钮包裹起来;

          4、列表内容和删除按钮使用css属性transform: translateX(108rpx)设置,达到隐藏删除按钮的目的;再给列表内容添加属性margin-left: -180px,使其正常显示;

          5、使用movable-area标签实现左滑删除,适用于高度固定的列表;

          6、若出现苹果真机页面还能整体左滑的问题,可在最外层标签添加css属性overflow-x: hidden,就可以解决页面整体滑动的问题了;

     代码部分:

    <!-- pages/index/index.wxml -->
    <view class="container">
    
      <view class="mess padding">考勤规则相同的人设置到同一考勤组,以便于统计</view>
    
      <!-- 考勤组列表 -->
      <block wx:for="{{list}}" wx:key="index">
        <movable-area class='movable-area'>
          <movable-view direction="horizontal" class='movable-view bg_white'>
            <view class="touch-item  {{item.isTouchMove ? 'touch-move-active' : ''}}" data-index="{{index}}" bindtouchstart="touchstart" bindtouchmove="touchmove">
              <view class="content" bindtap='toDetail' data-id="{{item.groupId}}">
                <view class="attendance_name font_size">{{item.groupName}}</view>
                <view class="attendance_text flex-x">
                  <view class="attendance_text_l font_size">成员:</view>
                  <view class="attendance_text_r font_size">{{item.numberOfPeople}}人</view>
                </view>
                <view class="attendance_text flex-x">
                  <view class="attendance_text_l font_size">负责人:</view>
                  <view class="attendance_text_r font_size">{{item.principalName}}</view>
                </view>
                <view class="attendance_text flex-x">
                  <view class="attendance_text_l font_size">固定班制:</view>
                  <view class="attendance_text_r font_size">{{item.attDateList[0]}}至{{item.attDateList[(item.attDateList.length-1)]}} {{item.sTime}}-{{item.eTime}}</view>
                </view>
              </view>
              <view class="del bg_red font_size" catchtap="del" data-idx="{{index}}">删除</view>
            </view>
          </movable-view>
        </movable-area>
      </block>
    
      <view class="btn font_size padding" bindtap="addAttendance">+新增考勤组</view>
    
    </view>
    /* pages/index/index.wxss */
    page {
      background: #f2f2f2;
    }
    
    .font_size {
      font-size: 28rpx;
    }
    
    .mess {
      font-size: 26rpx;
    }
    
    .mess {
      color: #999;
      line-height: 60rpx;
      padding: 0 30rpx;
      box-sizing: border-box;
    }
    
    .btn {
      width: 90%;
      height: 90rpx;
      background: #fff;
      color: #999;
      text-align: center;
      margin: 0 auto;
      line-height: 90rpx;
    }
    
    /* 列表布局 */
    
    .movable-area {
      width: 100%;
      height: 200rpx;
      margin-bottom: 20rpx;
    }
    
    .movable-view {
      width: 100%;
      height: 100%;
    }
    
    .touch-item {
      display: flex;
      justify-content: space-between;
      width: 100%;
      height: 100%;
      overflow: hidden;
    }
    
    .content {
      width: 100%;
      margin-right: 0;
      padding: 10rpx 10rpx 20rpx 30rpx;
      box-sizing: border-box;
      -webkit-transition: all 0.4s;
      transition: all 0.4s;
      -webkit-transform: translateX(180rpx);
      transform: translateX(180rpx);
      margin-left: -180rpx;
      overflow: hidden;
    }
    
    .del {
      width: 180rpx;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      color: #fff;
      -webkit-transform: translateX(180rpx);
      transform: translateX(180rpx);
      -webkit-transition: all 0.4s;
      transition: all 0.4s;
    }
    
    .touch-move-active .content, .touch-move-active .del {
      -webkit-transform: translateX(0);
      transform: translateX(0);
    }
    
    .attendance_name {
      color: #999;
      margin-bottom: 8rpx;
    }
    
    .attendance_text > view {
      margin-bottom: 8rpx;
      color: #828282;
      white-space: nowrap;
      text-overflow: ellipsis;
      overflow: hidden;
    
    }
    
    .attendance_text_l {
      width: 17%;
      flex-shrink: 0;
    }
    
    .attendance_text_r {
      flex-grow: 1;
    }
    // pages/index/index.js
    Page({
    
        /**
       * 页面的初始数据
       */
      data: {
        list: [
          {
            groupId: 1, //考勤组ID
            groupName: '正常班',
            principalName: '路老师', //考勤负责人姓名
            numberOfPeople: '1', //考勤组人数
            attDate: '周一至周五 8:00-17:00', //固定班制
            isTouchMove: false, //默认全隐藏删除
          },
          {
            groupId: 2, //考勤组ID
            groupName: '实习生考勤',
            principalName: '路老师', //考勤负责人姓名
            numberOfPeople: '1', //考勤组人数
            attDate: '周一至周五 7:20-17:20', //固定班制
            isTouchMove: false, //默认全隐藏删除
          },
        ], //考勤组列表
        startX: 0, //开始x坐标
        startY: 0, //开始y坐标
      },
    
        /**
       * 生命周期函数--监听页面加载
       */
      onLoad: function(options) {
        
      },
    
          /**
       * 手指触摸动作开始 记录起点X坐标
       */
      touchstart: function(e) {
        // console.log('进来了', 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, //滑动变化X坐标
          touchMoveY = e.changedTouches[0].clientY, //滑动变化Y坐标
          //获取滑动角度
          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
        })
      },
    
          /**
       * 计算滑动角度
       * start 起点坐标
       * end 终点坐标
      * Math.PI 表示一个圆的周长与直径的比例,约为 3.14159;PI就是圆周率π,PI是弧度制的π,也就是180°
    */ angle: function(start, end) { var _X = end.X - start.X, _Y = end.Y - start.Y return 360 * Math.atan(_Y / _X) / (2 * Math.PI); }, /** * 删除 */ del(e) { var id = e.currentTarget.dataset.idx,
         _list = this.data.list; wx.showModal({ title:
    '提示', content: '确定删除该考勤组吗?', confirmColor: "#f16765", success: res => { if (res.confirm) { isShow = false; this.touchstart(e);
          _list.splice(idx, 1);
    // 删除考勤组 this.setData({
           list: _list
          })
    } else { } } }) },
    })
  • 相关阅读:
    springboot之redis的应用
    redis外部访问
    Calendar时间操作
    zookeeper安装
    springboot的interceptor(拦截器)的应用
    springboot中filter的用法
    IIS无法启动,应用程序池自动关闭
    HTTP 错误 403.14
    【转】JavaScript => TypeScript 入门
    angular2使用ng g component navbar创建组件报错
  • 原文地址:https://www.cnblogs.com/rzsyztd/p/12101213.html
Copyright © 2020-2023  润新知