前端特技——滑动出现菜单编辑

效果图:

代码:

<!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>
时间: 2024-10-12 17:56:27

前端特技——滑动出现菜单编辑的相关文章

【前端】css自适应宽度滑动门菜单

html     css    width  自适应 什么是CSS自适应宽度滑动门菜单? CSS自适应宽度菜单指菜单的宽度可以随着内容的增加而变宽,就拿下边的实例来说,是按4个字的宽度来设计的,如果其中一项为5个字或更多,就放不下了.那么我们就需要让它的宽度可以随着内容的增减而变化,这就是css自适应宽度菜单.         自适应宽度按钮的效果是怎样的呢? 那么,自适应宽度按钮,是怎么实现的呢? 要想实现自适应宽度,需要在文字上增加一个辅助标签,如span,分别在a上和span上设置背景,一

制作滑动门菜单

在之前的工作中有一次遇到了一种菜单,要随菜单名称的长短而伸展和缩短,后来查了相关资料才知道这种菜单的被称为“滑动门菜单”…… 样子就像下面的图片这样: 做法: 把菜单分成三部分:左边.中间.右边.菜单的左边和右边各用一张背景图片(不平铺),中间用一张背景图片,这张背景图是要平铺的,因为中间部分会随着菜单字数的增多而伸展开来,切图如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http

菜单编辑

菜单编辑 菜单登记查询界面 [ReloadMenu]:刷新菜单 字段说明: 代码:菜单代码,菜单唯一编码 名称:菜单名称,菜单显示文本 顺序:菜单顺序,菜单靠左的放置次序 说明:菜单说明,鼠标在菜单停靠时的提示文本 目录:菜单页签的分组 页面:菜单的页签 分组:菜单在其页面的分组 图标:菜单图标 大小:显示方式,大小 过程:是否是过程 过程名称:过程名称 窗体:窗体代码编号 窗体名称:窗体名称 报表:是否为报表 打开:是否打开 返回:加载页面完成后是否返回主页 管理:是否为管理员可用菜单 来自为

Android自定义组件——四个方向滑动的菜单实现

今天无意中实现了一个四个方向滑动的菜单,感觉挺好玩,滑动起来很顺手,既然已经做出来了就贴出来让大家也玩弄一下. 一.效果演示 (说明:目前没有安装Android模拟器,制作的动态图片太卡了,就贴一下静态图片吧,实际效果可以下载源代码查看) (向上滑动) (向下滑动) (向左滑动) (向右滑动) 二.实现过程介绍 1.放置5个View (分别是上下左右中) @Override protected void onLayout(boolean changed, int l, int t, int r,

Android自定义组件系列【15】——四个方向滑动的菜单实现

今天无意中实现了一个四个方向滑动的菜单,感觉挺好玩,滑动起来很顺手,目前还没有见过这样的应用,以后能不能在应用中出现或者说有没有实用价值就不好说了,既然已经做出来了就贴出来让大家也玩弄一下,说不定对你有所启发. 一.效果演示 (说明:目前没有安装Android模拟器,制作的动态图片太卡了,就贴一下静态图片吧,实际效果可以下载源代码查看) (向上滑动) (向下滑动) (向左滑动) (向右滑动) 二.实现过程介绍 1.放置5个View (分别是上下左右中) @Override protected v

jQuery滑动导航菜单

<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8" /> <meta name="author" content="abangsir" /> <title>jQuery弹性滑动导航菜单</title> <style type="text/css"> body{ font-famil

移动端 触屏滑动条菜单(完善版 转)

移动端 触屏滑动条菜单(完善版) 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 8

使用asp.net mvc,boostrap及knockout.js开发微信自定义菜单编辑工具

前言 微信的接口调试工具可以编辑自定义菜单,不过是提交json格式数据创建菜单,非常的不方便还容易出错.网上的工具不好用,所以就自己写了一个. 正文 先用bootstrap排个页面框架出来,调用自定义菜单接口需要用到AccessToken,放个输入框输入AccessToken.也不排除想直接输入AppId和AppSecret来获取AccessToken的用户,所以还需要下拉菜单来选择是输入AccessToken还是直接获取AccessToken.为了兼顾微信企业号应用创建菜单还需要AgentId

MyERP WinForm 快速开发框架——菜单编辑

菜单编辑: 设置菜单相关信息,动态加载模块功能 来自为知笔记(Wiz)