zoukankan      html  css  js  c++  java
  • weui+vue列表滑动删除

    由于移动端的屏幕尺寸限制,很多App都的列表项使用了的滑动显示删除按钮,然后点击删除功能。网页端可以采用插件方式很容易实现。

    这里采用Vue+Weui+vue2-touch-events插件实现。

    我们都知道滑动事件由按下、移动、松开3个步骤组成。要在按下的时候记录手指按下的屏幕位置,并判断是否有已经打开的列表,有的话先关闭;在滑动的过程中,根据当前触摸的坐标计算滑动距离,移动相应的列表,当滑动记录大于完全打开的记录的一半时自动打开列表;当松开时滑动距离小于完全打开的记录的一半时吧列表关闭。效果如下:

    很简单,直接贴代码,

    HTML代码:

    <div class="weui-panel">
        <div class="weui-panel__bd">
            <div class="weui-media-box weui-media-box_small-appmsg">
    
                    <div v-for="record in records" class="weui-cells">
                        <div class="weui-cell  weui-cell_swiped">
                            <div ref="ls" class="weui-cell__bd">
                                <div class="weui-cell" v-touch:start="listSwipeStart()" v-touch:moving="listSwipeMoving()" v-touch:end="listSwipeEnd()">
                                    <div class="weui-cell__hd">
                                        <i class="fas fa-folder color-orange"></i>
                                    </div>
                                    <div class="weui-cell__bd">
                                        {{record}}
                                    </div>
                                    <div class="weui-cell__ft">
                                    </div>
                                </div>
                            </div>
    
                            <div class="weui-cell__ft">
                                <a class="weui-swiped-btn weui-swiped-btn_orange" href="javascript:">修改</a>
                                <a class="weui-swiped-btn weui-swiped-btn_warn" href="javascript:">删除</a>
                            </div>
                        </div>
                    </div>
                    <div v-if="records == null || records.length==0" class="weui-cells">
                        <div class="weui-cell weui-cell_active weui-cell_access weui-cell_example">
                            <div class="weui-cell__bd weui-cell_primary" style="text-align:center">
                                <p>无数据!</p>
                            </div>
                        </div>
                    </div>
            </div>
        </div>
    </div>
    

    主内容区域是一个weui面板,面板的主体方式weui-cell组件用于显示列表。

    由于要显示修改删除按钮,所以嵌套一层weui-cell:外层的weui-cell的bd里嵌套一个weui-cell,里面的weui-cell是列表内容,外层weui-cell的ft里放修改删除按钮,正常时内层的weui-cell遮掉外层的ft,当滑动时移动内层的weui-cell外层的按钮就可显示出来了。

    给内层的weui-cell绑定vue2-touch-events插件的3个事件,v-touch:start,v-touch:moving,v-touch:end。

    Js代码:

    <script>
            const Counter = {
                el: ".page",
                data() {
                    return {
                        swipe: {
                            startX: 0,
                            startY:0,
                            maxDistance: 136
                        }
    
                    }
                },
                mounted: function () {
                    for (var i = 1; i <= 20; i++) {
                        this.records.push("n" + i);
                    }
                },
    
                methods: {
                    listSwipeStart() {
                        that = this;
                        return function (direction, event) {
                            if (direction.changedTouches != undefined && direction.changedTouches.length === 1) {
                                //清楚已打开的列表
                                for (i = 0, len = that.$refs.ls.length; i < len; i++) {
                                    if (that.$refs.ls[i].style != "") that.$refs.ls[i].style = "";
                                }
                                //记录起始位置
                                that.swipe.startX = direction.changedTouches[0].pageX;
                                that.swipe.startY = direction.changedTouches[0].pageY;
                            }
                        };
                    },
                    listSwipeMoving() {
                        that = this;
                        return function (direction, event) {
                            if (direction.changedTouches != undefined && direction.changedTouches.length === 1) {
                                var distanceX = direction.changedTouches[0].pageX - that.swipe.startX;
                                var distanceY = direction.changedTouches[0].pageY - that.swipe.startY;
                                //左滑
                                if (distanceX < 0 && Math.abs(distanceX) > Math.abs(distanceY)) {
                                    if (Math.abs(distanceX) < (that.swipe.maxDistance / 2)) direction.path[direction.path.length - 14].style = "transform: translateX(" + distanceX + "px)";
                                    else direction.path[direction.path.length - 14].style = "transform: translateX(" + -that.swipe.maxDistance + "px)";
                                }
                            }
                        };
                    },
                    listSwipeEnd() {
                        that = this;
                        return function (direction, event) {
                            if (direction.changedTouches != undefined && direction.changedTouches.length === 1) {
                                var distanceX = direction.changedTouches[0].pageX - that.swipe.startX;
                                var distanceY = direction.changedTouches[0].pageY - that.swipe.startY;
                                //左滑
                                if (distanceX < 0 && Math.abs(distanceX) > Math.abs(distanceY)) {
                                    if (Math.abs(distanceX) < (that.swipe.maxDistance / 2)) direction.path[direction.path.length - 14].style = "";
                                    else direction.path[direction.path.length - 14].style = "transform: translateX(" + -that.swipe.maxDistance + "px)";
                                }
                            }
                        };
                    },
                }
            };
            var page = new Vue(Counter);
        </script>
    
    作者:洞庭夕照
    出处:http://mzwhj.cnblogs.com
    本文由洞庭夕照原创,并发布到博客园,欢迎转载,但必须在文章页面明显位置写明作者和出处,非常感谢!
    公众号:
  • 相关阅读:
    tensorflow 安装 CentOS查看CPU、内存、版本等系统信息
    tensorflow 安装 centos下显卡驱动和cuda安装
    tensorflow 安装: could no t load dynamic library 'cudart64_101.dll'; dlerror: cudart64_101.dll not found
    安装tensorflow 官网手册
    安装 TensorFlow时:Cannot uninstall 'enum34'. It is a distutils installed project and thus we ca...
    python pip 和pip3区别
    安装TensorFlow报错Memoryerror
    使用清华开源镜像安装tensorflow
    centos7(python2.7) 安装tensorflow+keras过程
    JavaWeb核心之Servlet
  • 原文地址:https://www.cnblogs.com/mzwhj/p/14680939.html
Copyright © 2011-2022 走看看