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:;padding:;}
.clear{clear: both;}
.wrap{width: 380px;height: auto;zoom:;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

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

  1. html5 Sortable.js 拖拽排序源码分析

    最近公司项目经常用到一个拖拽 Sortable.js插件,所以有空的时候看了 Sortable.js 源码,总共1300多行这样,写的挺完美的.   本帖属于原创,转载请出名出处. 官网http:// ...

  2. JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)

    转自<JS实现漂亮的窗口拖拽效果(可改变大小.最大化.最小化.关闭)>:http://www.jb51.net/article/73157.htm   这篇文章主要介绍了JS实现漂亮的窗口 ...

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

    接着上一篇拖拽系列一.JavaScript实现简单的拖拽效果这一篇博客将接着对上一节实现代码利用JS面向对象(OOP)思维对上一节代码进行封装; 使其模块化.避免全局函数污染.方便后期维护和调用:写到 ...

  4. 基于svg.js实现对图形的拖拽、选择和编辑操作

    本文主要记录如何使用 svg.js 实现对图形的拖拽,选择,图像渲染及各类形状的绘制操作. 1.关于SVG SVG 是可缩放的矢量图形,使用XML格式定义图像,可以生成对应的DOM节点,便于对单个图形 ...

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

    Android高级控件(六)--自定义ListView高仿一个QQ可拖拽列表的实现 我们做一些好友列表或者商品列表的时候,居多的需求可能就是需要列表拖拽了,而我们选择了ListView,也是因为使用L ...

  6. sortable.js 拖拽排序及配置项说明

    // 拖动排序 $(function() { /*排序*/ //排序 // Simple list ]; new Sortable(list, { group: "name", a ...

  7. js 实现拖拽排序

    <!DOCTYPE> <html lang="zh-cn"> <head> <meta http-equiv="Content- ...

  8. jquery拖拽排序,针对后台列表table进行拖拽排序(超实用!)

    现在很多后台列表为了方便均使用拖拽排序的功能,对列表进行随意的排序. 话不多说 ,我在网上找了一些demo,经过对比,现在把方便实用的一个demo列出来,基于jqueryUI.js 先上html代码, ...

  9. dragsort html拖拽排序

    一.Jquery List DragSort 对于有些页面,如首页的定制,需要进行动态的拖拽排序.由于自己实现比较困难,我们一般会使用一些js插件来实现.dragsort 就是帮助我们完成这一需求.通 ...

随机推荐

  1. 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

    前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考 ...

  2. 关于StrangeIOC框架

    在Unity上进行开发,请先看对其开发模式应用的讨论: http://www.reddit.com/r/Unity3D/comments/1nb06h/unity_design_patterns_an ...

  3. 简单所以不要忽视,关于\r\n和\n程序员应了解的实际应用

    众所周知,\r叫回车符,\n叫换行符. 由于历史原因,windows环境下的换行符是\r\n;(文章最后会稍微解释这个历史原因) linux和html等开源或公开标准中的换行符是\n. 记录这篇笔记的 ...

  4. Ubuntu 14 設定 遠端連線,讓別台電腦可以連線進來

    Ubuntu 14 需 disable 加密,方可 遠端連線 此台電腦 xxx@xxx-ThinkPad-T460p:~$ gsettings set org.gnome.Vino require-e ...

  5. MyBatis的foreach标签与SUM函数同时使用

    最近在项目中遇到一个,需要根据传入的存有id的list,计算值,再起别名 <if test="channelList != null and channelList.size()> ...

  6. 【POJ 1390】Blocks

    http://poj.org/problem?id=1390 黑书上的例题,感觉我这辈子是想不到这样的dp了QAQ \(f(i,j,k)\)表示将\(i\)到\(j\)合并,并且假设未来会有\(k\) ...

  7. Ubuntu 14.04 无线网卡驱动安装

    安装了Ubuntu最新版本 14.04 之后,发现无线网卡不能使用,偿试安装驱动后,问题解决. 首先确定无线网卡类型: lspci -vnn -d 14e4: 比如我的网卡类型为 06:00.0 Ne ...

  8. python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决

    python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'的解决方法: 1.原因是官网的是python2语法写的,看官手动把官 ...

  9. 【poj3875】 Lights

    http://poj.org/problem?id=3875 (题目链接) 题意 有M个N位的不同的二进制数,他们异或起来前v位等于1,求这m个数的不同组合方式(同一组数不同顺序不算). Soluti ...

  10. USB Keyboard Recorder

    catalogue . 引言 . Device Class Definition for Human Interface Devices (HID) . USB HID Report Descript ...