【原创】js实现一个可随意拖拽排序的菜单导航栏

1.想做这个效果的原因主要是用在UC上看新闻发现他们的导航菜单很有趣。无聊的时候在哪划着玩了很久。所以就干脆自己写一个。原效果如下

2.整体效果如下,在已推荐和未添加里面每个小方块可以触摸移动位置互换。未添加和已添加里面的小方块位置可以拖放。

3.结构分析。整体结构用红线框标出。可以分为三个部分。关注底部拖拽部分。一个div里面嵌套两个div.定位关系如图。本次教程之作一个拖拽框

1.好了,基本情况已经分析清楚先实现页面样式。

         <div class="wrap">
            <div class="menu ">财经</div>
            <div class="menu ">时尚</div>
            <div class="menu ">国际</div>
            <div class="menu ">娱乐</div>
            <div class="menu ">军事</div>
            <div class="menu ">搞笑</div>
            <div class="menu ">科技</div>
            <div class="menu ">游戏</div>
            <div class="menu ">体育</div>
            <div class="menu ">美图</div>
            <div class="menu ">推荐</div>
            <div class="menu ">社会</div>
            <div class="menu ">微信</div>
            <div class="menu ">健康</div>
            <div class="menu ">军事</div>
            <div class="clear"></div>
        </div>

css

<style type="text/css">
            *{margin: 0;padding: 0;}
            .clear{clear: both;}
            .wrap{width: 380px;height: auto;zoom: 1;overflow: hidden;border: 1px solid #8E8E8E;margin-top:100px ;margin-left: 400px;padding-bottom: 20px;position: relative;}
            .menu{width: 70px;height: 30px;background-color: cornflowerblue;color: #FFFFFF;font-size: 16px;text-align: center;line-height: 30px;float: left;margin-left: 20px;margin-top: 10px;}
            .active{height: 28px;width: 68px;border: 1px dashed #8E8E8E;float: left;margin-left: 20px;margin-top: 10px;}
            .onclick{transform: scale(1.2);position: absolute;background-color:cornflowerblue ;line-height: 30px;height: 30px;width: 70px;text-align: center;color: #FFFFFF;}
        </style>

界面如下

样式完成了现在开始写js。

1.主要为鼠标事件

鼠标按下-鼠标移动-鼠标弹起

鼠标按下时 menu的定位变为absolute。获取其在内部的坐标值

鼠标移动分两种。鼠标按下时移动,所选菜单跟随鼠标移动移动,鼠标移动到新的menu 上在其之前创建一个活动的空DIV

鼠标弹起 menu菜单位置改变,插入到新位置

<script type="text/javascript">
            $(function(){
                var action=false;     //定义一个全局变量来判断鼠标动作,默认为false
                $(document).on("mousedown",".menu",function(){         //鼠标按下事件
                    action=true;
                    if($(".onclick").length<1){
                        var left=$(this).offset().left-$(".wrap").offset().left;      //获取在wrap内的偏移量
                        var top=$(this).offset().top-$(".wrap").offset().top;
                        console.log(left,top);
                        $(this).before("<div class=‘active‘ id=‘old‘></div>");        //鼠标按下时在原位置创建一个活动的空div
                        $(this).removeClass("menu").addClass("onclick").css({"left":left,"top":top});
                    }
//                    console.log(action);

                })
//                console.log(action);
                $(document).on("mousemove",".wrap",function(event){                //wrap上的鼠标移动事件,menu 移动
                    if(action==true){
                        var x=event.pageX-$(".wrap").offset().left;                //获取鼠标在wrap的偏移量
                        var y=event.pageY-$(".wrap").offset().top;
//                        console.log(x,y)
                        $(".onclick").css({"left":x+10,"top":y+10});               //补充内边距
                        console.log(action)
                    }
                })
                $(document).on("mouseenter",".menu",function(){                   //鼠标移动到新的menu 上在其之前插入一个接受的div
                    if(action==true){
                        $(this).before("<div class=‘active‘ id=‘new‘></div>")
                    }
                })
                $(document).on("mouseleave",".menu",function(){                   //鼠标离开,接受的div移除
                    if(action==true){
                        $("#new").remove();
                    }
                })
                $(document).on("mouseup",function(){                           //鼠标弹起时将移动的menu 放入新的接受div里,并移除原div位置上的空div
                    if($("#new").length>=1){
                        console.log($(".onclick").text());
                        $("#new").before("<div class=‘menu‘>"+$(".onclick").text()+"</div>");
                        $("#new").remove();
                        $(".onclick").remove();
                        $("#old").remove();
                    }
                    else
                    {
                        console.log($(".onclick").text());
                        $("#old").before("<div class=‘menu‘>"+$(".onclick").text()+"</div>");
                        $(".onclick").remove()
                        $("#old").remove();
                    }
                    action=false;
                })
            })
        </script>

一个粗糙的拖拉就出来了

http://htmlpreview.github.io/?https://github.com/zimuqi/drap/blob/master/home.html

时间: 2024-10-15 10:07:48

【原创】js实现一个可随意拖拽排序的菜单导航栏的相关文章

js可以随意拖拽的div的实现

最近花了点时间用纯JS写了一个扫雷程序,写出来效果很差,自己长时间使用面向过程的方式编写代码,写的程序到后面都乱了,有必要找时间好好的深入理解一下OOP了.有时间会把写的东西拿上来.就当是留个纪念吧.打算用OOP重新写个扫雷程序,希望令自己满意. ——————————————碎碎念 记录一个实现随意拖拽div的实现方法,当作备忘吧,指不定什么时候用到了呢. <!DOCTYPE html> <html lang="en"> <head> <met

ztree使用系列四(ztree实现同级拖拽排序并将排序结果保存数据库)

ztree这个系列的最后一篇,也是ztree功能强大的体现之一--排序功能.ztree可以实现所有节点之间随意的拖拽排序功能,我这里根据需要实现了只允许同级之间随意拖拽排序,其实原理都一样,只是范围缩小了一些,多了一些判断而已.下面是每一层的代码,还是采取只贴出功能代码,因为这个拖拽排序功能我感觉很不错,所以单独拿出一篇博客来展示,也方便理解. Jsp页面实现功能的js代码如下: //拖拽前执行 var dragId; function beforeDrag(treeId, treeNodes)

拖拽系列二、利用JS面向对象OOP思想实现拖拽封装

接着上一篇拖拽系列一.JavaScript实现简单的拖拽效果这一篇博客将接着对上一节实现代码利用JS面向对象(OOP)思维对上一节代码进行封装; 使其模块化.避免全局函数污染.方便后期维护和调用:写到这里突然想起一句话“没有任何一个题目是彻底完成的.总还会有很多事情可做......” 我想这句话程序开发大概也适用吧,前端开发人员总是可以结合自己之前学到“拖拽”相关知识,不断扩展.完善.无穷无尽.......     利用匿名函数自执行实现封装 ;(function(){ //do somethi

Android高级控件(六)——自定义ListView高仿一个QQ可拖拽列表的实现

Android高级控件(六)--自定义ListView高仿一个QQ可拖拽列表的实现 我们做一些好友列表或者商品列表的时候,居多的需求可能就是需要列表拖拽了,而我们选择了ListView,也是因为使用ListView太久远了,导致对他已经有浓厚的感情了,我们之前也是写过几篇关于ListView的博文 Android实训案例(三)--实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果! Android高级控件(一)--ListView绑定CheckBox实现全选,增加和删除等功能 A

63.实现一个拖拽排序

//为了方便借助vue和jquery <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-C

最近写的一个控件——Well Swipe 拖拽排序实现

如图: >删除过渡动画 >拖拽排序

jquery -- 拖拽排序分析

今天应一个朋友的委托,研究一下拖拽排序,我记得我上次写拖拽排序,因为方法太死板,效果我一直不是很满意,一直想再从写一个,一直没机会(懒),这次因为公司部门变动所以有了一些时间(无聊)来写,本来准备使用Vue写,奈何功夫不到家在自定义指令的时候,问题卡住了,研究了一段时间之后,还是决定放弃,研究一下Vue再来写过,所以本次还是用了Jquery来写. 直接上代码 这是CSS部分 1 *{/*Css*/ 2 margin: 0px; 3 padding: 0px; 4 list-style: none

zTree的拖拽排序

ztree本身是可以支持拖拽的,但是却没有找到明确的支持拖拽的排序,也就是说,在拖拽过程中,需要自定义维护拖拽后的顺序并保存至后台. 在这样一个比较常规的需求情况下,网上也有朋友给出了一些解决方案,比如自定义一个tree传入ztree, 不使用ztree的识别字段,而是使用自定义字段,然后当ztree的节点发生变化时,维护这些自定义字段,从而使得整个tree是有序的,并支持拖拽. 上边的这个解决方案,有一个问题,就是使用javascript构造的tree,传入ztree之后,会发生堆栈溢出,初步

ListView列表拖拽排序

ListView列表拖拽排序可以参考Android源代码下的Music播放列表,他是可以拖拽的,源码在[packages/apps/Music下的TouchInterceptor.java下]. 首先是搭建框架,此处的ListView列表类似于QQ消息列表,当然数据只是模拟,为了简单起见,没有把ListView的条目的所有的属性全部写上.首先是消息的实体类Msg.java: package me.chenfuduo.mymsgdrag; public class Msg { private in