工作中的一个项目ui界面比较传统(chou),就想着把前端重构一下。内容之一是把导航栏从上方固定高度改为了右侧伸缩的边栏,好处是边栏可伸缩,占用面积小。不完美的地方是有时候会遮挡页面上最右边的按钮,作为一个喜欢追求美的人,是可忍孰不可忍,于是决心改掉这个导航栏,让它可拖拽,如果挡住了就拖一下换个地方,岂不美哉 ?!
  本例实际是只上下拖动,全局自由拖动的话将x坐标一起加入计算即可。
  说干就干,想了下,觉得处理逻辑很清晰:
  1、鼠标放到div上,图标变成可移动的,最好变成五个小指头乱抓的小手形;
  2、mousedown的时候,触发事件,记录div当前位置,鼠标位置;
  3、鼠标开始移动,mousemove触发事件,随时根据鼠标位置的移动距离修改div的位置;注意mousemove要区分鼠标左键是否按下。
  4、到达目的地,mouseup,结束。
  注意第三四两步,第三步的实现有两种方式:
  1、鼠标按下,div绑定mousemove事件,鼠标mouseup的时候移除绑定。
  2、鼠标按下,将全局变量move修改为true,mouseup的时候改为false,mousemove的时候判断move是否为true,true则进行拖动,否则不作任何动作。  
  个人认为第一种方式实现较好,第二种虽然为true直接过了,但仍进行了判断逻辑,相对来说有了多余操作,总是不好的。
  第一版代码,aside边栏div的class:
$(".aside").mousedown(function(e){
$(this).find("li").css("cursor","move");
$(this).find("div").css("cursor","move");
ready2Move = true;
startValue = e.clientY -$(this).offset().top;
return false;
}).mouseup(function(e){
$(this).find("li").css("cursor","pointer");
$(this).find("div").css("cursor","pointer");
ready2Move = false;
startValue = e.clientY -$(this).offset().top;
}).mouseout(function(e){ //这里是为了防止鼠标脱出后仍然控制div移动的情况
$(this).find("li").css("cursor","pointer");
$(this).find("div").css("cursor","pointer");
ready2Move = false;
startValue = e.clientY -$(this).offset().top;
}).mousemove(function (e) {
if(ready2Move){//鼠标按下,并移动
var currentValue = e.clientY;
var distance = currentValue - startValue;
$(".aside").css("top",distance+"px");
}
return false;
});
  return false是为了阻止事件冒泡,防止拖动的时候对外边的文本进行了“选中”操作;
  该版本基本实现了拖动功能,但有个比较严重的问题是div移动的有些卡顿,鼠标拖快了容易跑出div,导致后续的拖动无效。
  经查找资料后,比较一致的说法是事件冒泡导致的,mousemove要一层层冒泡,而且由于是持续触发导致页面渲染速度跟不上鼠标移动速度(这里理论上是即使每移动一个像素触发一次?实际观察发现更像是隔一段时间触发,这个触发的细节没查到相关资料),也就产生了鼠标脱出div的情况。加上return false阻止冒泡,仍然无效,速度很慢。后来无意翻到大神的文章,http://www.cnblogs.com/rubylouvre/archive/2009/09/09/1563342.html,发现大神的做法是将mousemove绑定到window对象上,避免了冒泡。赶紧来试一下:
$(".aside").mousedown(function(e){
$(this).find("li").css("cursor","move");
$(this).find("div").css("cursor","move");
ready2Move = true;
startValue = e.clientY -$(this).offset().top;
return false;
})
$(document).mouseup(function(e){
$(".aside").find("li").css("cursor","pointer");
$(".aside").find("div").css("cursor","pointer");
ready2Move = false;
startValue = e.clientY -$(".aside").offset().top;
}).mousemove(function (e) {
if(ready2Move){//鼠标按下,并移动
var currentValue = e.clientY;
var distance = currentValue - startValue;
$(".aside").css("top",distance+"px");
}
return false;
});
  修改过后,果然拖动效果如丝般顺滑。
  说明:该部分代码是我本地版本,采用的都是全局变量判断是否需要移动的做法,可改为mouseup取消事件的方式,但页面效果差别甚微,暂未改动。更清晰的逻辑请查看http://www.cnblogs.com/rubylouvre/archive/2009/09/09/1563342.html,文中不但有思路,而且有多种写法,还有优化以及一些使用场景的考虑,写的非常好。

div拖动实现及优化的更多相关文章

  1. js实现一个可以兼容PC端和移动端的div拖动效果

    前段时间写了一个简单的div拖动效果,不料昨天项目上正好需要一个相差不多的需求,就正好用上了,但是在移动端的时候却碰到了问题,拖动时候用到的三个事件:mousedown.mousemove.mouse ...

  2. jquery div拖动效果示例代码

    div拖动效果想必大家都有见到过吧,实现的方法也是有很多的,下面为大家将介绍使用jquery是如何实现的,感兴趣的朋友不要错过 复制代码代码如下: <%@ page language=" ...

  3. 让一个div拖动和让一个panel拖动加拉大拉小

    一.让一个div拖动 <!doctype html> <html xmlns="http://www.w3.org/1999/xhtml"> <hea ...

  4. jquery实现很简单的DIV拖动

    今天用jquery实现了一个很简单的拖动...实现思路很简单  如下: 在thickbox 弹出层内实现拖拽DIV,那么得进行一下相对宽高的运算:必须加上相对于可见窗口宽高和弹出层宽高之间的差:    ...

  5. 实现DIV拖动

    Ajax的到来让B/S中的客户端中开发有火了一把,网上出现了很多优秀的开源框架和UI,比较著名了有prototype,YUI,GWT等,但很多时候发现这些东西很难用到你的系统之中,有时候你的系统仅仅需 ...

  6. jQuery实现DIV拖动

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  7. 探讨把一个元素从它所在的div 拖动到另一个div内的实现方法

    故事背景: 接到一个新需求,要求用vue搞,主要是拖动实现布局,关键点有:单个组件拖动,一行多列里面的组件拖动,  单个组件可以拖入一行多列里, 单个组件的拖动好实现,关键是把一个组件拖动到另一个类似 ...

  8. 手机版 div拖动

    <!doctype html> <html> <head> <title></title> <script type="te ...

  9. 自定义div 拖动。键盘上下左右键移动,ctrl+Q控制是否可以移动,ctrl+回车,返回初始状态

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

随机推荐

  1. [译]Javascript中的递归函数

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  2. docker初探

    1.什么是docker: 可以理解为一个可移植的集装箱容器,开发者可以打包他们的应用以及依赖包到一个可移植的容器中. 2.docker安装及使用(ubuntu16.04) (1)首先通过apt-get ...

  3. 基于pythpn的深度学习 - 记录

    [基于pythpn的深度学习] 环境:    windows/linux-ubuntu    Tensorflow (基于anaconda)        *安装 (python3.5以上不支持)   ...

  4. AI-Info-Micron-Insight:工业 5.0,伟大的思想将殊途同归

    ylbtech-AI-Info-Micron-Insight:工业 5.0,伟大的思想将殊途同归 1.返回顶部 1. 工业 5.0,伟大的思想将殊途同归 两个头脑比一个好吗?似乎如此,尤其是当其中一个 ...

  5. [BZOJ3337] ORZJRY I --块状链表大毒瘤

    link 题目大意:维护一个序列 支持: 1.单点插入 2.单点删除 3.区间翻转 4.区间旋转 5.区间加 6.区间赋值 7.询问区间和 8.询问区间极差 9.询问区间与给定某个数差值绝对值的最小值 ...

  6. luogu1999 高维正方体

    神仙题 分析法是个好方法 反正xjb分析就分析出来了 首先,i维立方体的点数(0维元素数)为\(2^i\) 首先0维肯定是1(不就是一个点吗) 你想想你是怎么用点拼成线段的 你把两个点往地上一扔 然后 ...

  7. USACO 1.1.1 YOUR RIDE IS HERE

    众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走.他们为每 ...

  8. 洛谷 P2982 [USACO10FEB]慢下来Slowing down

    题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) cows conveniently numbered 1..N mov ...

  9. C#学习之按钮点击事件

    描述:asp.net中服务器控件Button的点击事件OnClientClick和OnClick的区别? 解答:http://www.cnblogs.com/ypfnet/archive/2012/1 ...

  10. Codeforces - 625B 贪心

    求最小不重复匹配次数 改最后一个字符最划算 我当时怎么就没看出来.. #include<bits/stdc++.h> using namespace std; string S,T; in ...