zoukankan      html  css  js  c++  java
  • 前端特技——滑动出现菜单编辑

    效果图:

    代码:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
        <!-- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> -->
        <title>Document</title>
        <style>
            *{margin: 0;padding: 0;}
            ul{
                width: 100%;
            }
            li{
                width: 100%;
                height: 50px;
                line-height: 50px;
                list-style-type: none;
                text-align: center;
                border-bottom: 1px solid #ddd;
                cursor: pointer;
                position: relative;
            }
    
            li .btn-menu{
                position: absolute;
                top:0;
                right: 0;
                height: 50px;
                line-height: 50px;
            }
    
            .button{
                height: 48px;
                line-height: 48px;
                border: none;
                border-radius: 0;
                min-width: 52px;
                float: left;
                border-width: 1px;
                border-style: solid;
                cursor: pointer;
            }
    
            .delete{
                border-color: #e42012;
                background-color: #ef473a;
                color: #fff;
            }
            .cancle{
                border-color: #ddd;
                background-color: #ccc;
                color: #fff;
            }
    
            li a{
                position: absolute;
                z-index: 100;
                display: block;
                width: 100%;
                height: 100%;
                background-color: #fff;
                -webkit-transition-duration: 250ms;
                transition-duration: 250ms;
                -webkit-transition-timing-function: ease-in-out;
                transition-timing-function: ease-in-out;
                -webkit-transition-property: -webkit-transform;
                -moz-transition-property: -moz-transform;
                transition-property: transform;
            }
            .body{
                width: 100%;
                position: relative;
            }
            .content{
                width: 100%;
                height: 500px;
                background-color: green;
            }
            .example{
                width: 365px;
                height: 792px;
                position: absolute;
                top: 0;
                right: 0;
                overflow: hidden;
                background-image: url(http://www.ionicframework.com/img/phone-case.png);
            }
            .ex-content{
                margin-top: 90px;
                margin-left: 15px;
                width: 335px;
                height: 600px;
                overflow: hidden;
                background-color: #fff;
            }
            .head{
                width: 100%;
                height: 50px;
                line-height: 50px;
                color: #fff;
                background-color: #387ef5;
                text-align: center;
            }
        </style>
    </head>
    <body>
        <div class="body">
            <div class="content"></div>
            <div class="example">
                <div class="ex-content">
                    <div class="head">
                        列表滑动菜单
                    </div>
                    <ul>
                        <li>
                            <a>1</a>
                            <div class="btn-menu">
                                <div class="delete button" onclick="deleteItem(this)">删除</div>
                                <div class="cancle button" onclick="cancleItem(this)">取消</div>
                            </div>
                        </li>
                        <li>
                            <a>2</a>
                            <div class="btn-menu">
                                <div class="delete button" onclick="deleteItem(this)">删除</div>
                                <div class="cancle button" onclick="cancleItem(this)">取消</div>
                            </div>
                        </li>
                        <li>
                            <a>3</a>
                            <div class="btn-menu">
                                <div class="delete button" onclick="deleteItem(this)">删除</div>
                                <div class="cancle button" onclick="cancleItem(this)">取消</div>
                            </div>
                        </li>
                        <li>
                            <a style="transform:translate3d(-116px, 0px, 0px)">4</a>
                            <div class="btn-menu">
                                <div class="delete button" onclick="deleteItem(this)">删除</div>
                                <div class="cancle button" onclick="cancleItem(this)">取消</div>
                            </div>
                        </li>
                        <li>
                            <a>5</a>
                            <div class="btn-menu">
                                <div class="delete button" onclick="deleteItem(this)">删除</div>
                                <div class="cancle button" onclick="cancleItem(this)">取消</div>
                            </div>
                        </li>
                        <li>
                            <a>6</a>
                            <div class="btn-menu">
                                <div class="delete button" onclick="deleteItem(this)">删除</div>
                                <div class="cancle button" onclick="cancleItem(this)">取消</div>
                            </div>
                        </li>
                    </ul>
                </div>
            </div>
        </div>
    </body>
    </html>
    <script src="http://cdn.bootcss.com/zepto/1.1.6/zepto.js"></script>
    <script>
        //手势操作切换(支持触摸)
        var touchDevice = "ontouchstart" in window;
        var startEvt,moveEvt,endEvt;
        //选择不同事件
        if(touchDevice){
            startEvt="touchstart";
            moveEvt="touchmove";
            endEvt="touchend";
        }else{
            startEvt="mousedown";
            moveEvt="mousemove";
            endEvt="mouseup";            
        }
    
        $("ul>li").forEach(function(item,index){
            item.addEventListener(startEvt, startEvtHandler, false);
            item.addEventListener(moveEvt, moveEvtHandler, false);
            item.addEventListener(endEvt, endEvtHandler, false);
        });
    
        //按下之后移动30px之后就认为swipe开始
        var SWIPE_DISTANCE = 30;
        //swipe最大经历时间
        var SWIPE_TIME = 500;
        var pt_pos;
        var ct_pos;
        var pt_time;
        var pt_up_time;
        var pt_up_pos;
        //获取swipe的方向
        var getSwipeDirection = function(p2,p1){
            var dx = p2.x - p1.x;
            var dy = -p2.y + p1.y;    
            var angle = Math.atan2(dy , dx) * 180 / Math.PI;
    
            if(angle < 45 && angle > -45) return "right";
            if(angle >= 45 && angle < 135) return "top";
            if(angle >= 135 || angle < -135) return "left";
            if(angle >= -135 && angle <= -45) return "bottom";
        }
    
        function getTouchPos(e){
            var t = e.touches;
            if(t && t[0]) {
                return { x : t[0].clientX , y : t[0].clientY };
            }
            return { x : e.clientX , y: e.clientY };
        }
    
        function startEvtHandler(e){
            // e.stopPropagation();
            var touches = e.touches;
            if(!touches || touches.length == 1){//鼠标点击或者单指点击
                pt_pos = ct_pos = getTouchPos(e);
                pt_time = Date.now();
            }
        }
    
        function moveEvtHandler(e){
            // e.stopPropagation();
            e.preventDefault();
            ct_pos = getTouchPos(e);
        }
        function endEvtHandler(e){
            // e.stopPropagation();
            var dir;
            pt_up_pos = ct_pos;
            pt_up_time = Date.now();
            if(getDist(pt_pos,pt_up_pos) > SWIPE_DISTANCE && pt_up_time - pt_time < SWIPE_TIME){
                dir = getSwipeDirection(pt_up_pos,pt_pos);
                var li=$(this).closest("li");
                var cur=li.find("a");
                li.siblings().each(function(){
                    $(this).find("a").css("transform",null);
                })
                if(dir==="left"){
                    cur.css("transform","translate3d(-116px, 0px, 0px)");
                }else if(dir==="right"){
                    cur.css("transform",null);
                }
            }
        }
    
        //计算两点之间距离
        var getDist = function(p1 , p2){
            if(!p1 || !p2) return 0;
            return Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
        }
    
    
    
        /////点击事件
        function deleteItem(e){
            var cur=$(e).closest("li").find("a");
            alert(cur.html());
        }
    
        function cancleItem(e){
            $(e).closest("li").find("a").css("transform",null);
        }
    </script>
  • 相关阅读:
    mysql配置时,提示:Failed to start service MYSQL80
    修改NUGET包默认存放位置
    非Hive Metastore Server节点执行load命令时出现“cannot recognize input near '<EOF>' '<EOF>' '<EOF>' in switch database statement”
    微信小程序登录授权及手机号获取
    后台获取 HttpServletResponse 中的值
    Request Payload 后台拦截器读取入参方式
    答题活动小程序
    答题小程序V5.0
    考研刷题小程序V2.0
    答题小程序优化
  • 原文地址:https://www.cnblogs.com/xuhang/p/4870672.html
Copyright © 2011-2022 走看看