(function($){$.fn.extend({mydrag:function(){var boxX = 0;        //元素在页面中的横坐标var boxY = 0;        //元素在页面中的纵坐标var dMouseX = 0;    //按下鼠标时的鼠标所在位置的横坐标var dMouseY = 0;    //按下鼠标时的鼠标所在位置的纵坐标var mMouseX = 0;    //移动鼠标时的鼠标所在位置的横坐标var mMouseY = 0;    //移动鼠标时的鼠标所在位置的纵坐标var moveLenX = 0;    //存放鼠标移动的距离,横向var moveLenY = 0;    //存放鼠标移动的距离,纵向var isMove = false;    //是否拖动层的一个输助"开关"var movingX = 0;    //移动中元素的LEFT值var movingY = 0;    //移动中元素的TOP值//可视区域最右边的值var rightest = document.documentElement.clientWidth - $(".top").parent().outerWidth();//可视区域最右边的值var bottomest = document.documentElement.clientHeight - $(".top").parent().outerHeight();//获得移动鼠标时的鼠标所在位置的坐标var getMoveMouse = function(move){mMouseX = move.pageX;mMouseY = move.pageY;}//获得元素在页面中的当前的位置var getbox = function(m){boxX = $(".box").offset().left;boxY = $(".box").offset().top;}//获得鼠标按下时的坐标var getDownMouse = function(m){dMouseX = m.pageX;dMouseY = m.pageY;}//获得鼠标移动的距离值var getMoveLen = function(){moveLenX = mMouseX - dMouseX;moveLenY = mMouseY - dMouseY;}//鼠标UP时,关闭移动,即鼠标移动也不会让元素移动;$(document).mouseup(function(){isMove = false;})//给元素的TOP绑定事件$(this).//按下时获得元素的坐标和当前鼠标的坐档;mousedown(function(e){getbox(e);getDownMouse(e)isMove = true;}).//移动时获得移动的距离,设置元素的TOP和LEFT值;mousemove(function(e){var $this = $(this);getMoveMouse(e);getMoveLen();if(isMove){//防止元素移出可视区域//可视区域浏览器最左边if(movingX<0){$this.css({"left":0});if(movingY<0){$this.css({"top":0});}else if(movingY > bottomest){$this.css({"top":bottomest});}else{$this.css({"top":boxY+moveLenY});}}//可视区域浏览器最上面else if(movingY<0){$this.css({"top":0});if(movingX>rightest){$this.css({"left":rightest});    }else{$this.css({"left":boxX+moveLenX});    }}//可视区域浏览器最右边else if(movingX > rightest){$this.css({"left":rightest});if(movingY > bottomest){$this.css({"top":bottomest});    }else{$this.css({"top":boxY+moveLenY});}}//可视区域浏览器最下边else if(movingY > bottomest){$this.css({"top":bottomest});    if(movingX<0){$this.css({"left":0});    }else{$this.css({"left":boxX+moveLenX});    }    }//其它情况,即在可视区域中间else{$this.css({"left":boxX+moveLenX,"top":boxY+moveLenY});    }movingX = boxX+moveLenX;movingY = boxY+moveLenY;}})    }    })
})(jQuery)

主要思路:

  1.鼠标移动多少距离,元素就同时移动多少距离,所以要获取到鼠标移动的距离;

  2.鼠标按下,并且移动,才拖动层。所以需要一个“开关”,在移动按下时打开,如果鼠标这里移动了,那么就移动层,如果这个“关闭”,那么鼠标移动时,层也不会一起移动。

  3.获取层元素,在浏览器可视区域的最左、最边,最上、最下的值。并且在拖动层的过程中,把当前层的坐标值,去和这几个值,做比较,如果超过这些值。那么就不能再拖动这个方向,即把值设为最小或最大。

感觉我这些判断有点复杂,有高手指点下,怎么简化下吗?

下载DEMO

jQuery-拖动层(在可视区域范围内)相关推荐

  1. cocos2d中,设置层的可视区域

    http://www.cocoachina.com/bbs/read.php?tid=97164 cocos2d中,设置层的可视区域在真机上不管用 -(void) visit{     glEnabl ...

  2. php开发是可视的吗,javascript,html_Jquery判断页面元素是否在浏览器的可视区域内,javascript,html,css,html5 - phpStudy...

    Jquery判断页面元素是否在浏览器的可视区域内 前端开发中,有时需要判断某个元素是否在浏览器的可视区域内,或者是否已经滚动出了可视区域.首先想到的便是javascript操作,原生方法自然可以,不过 ...

  3. 编写一个Applet,随机选择矩形、圆形、椭圆、直线等形状,在可视区域内绘制20个图形,同一种图形使用同一种颜色,不需要填充。

    编写一个Applet,随机选择矩形.圆形.椭圆.直线等形状,在可视区域内绘制20个图形,同一种图形使用同一种颜色,不需要填充. package p2;import java.applet.Applet ...

  4. 编写一个Applet,画出20条水平的、随机颜色的平行线。要求线的长度相同,整条线段都要在可视区域内

    编写一个Applet,画出20条水平的.随机颜色的平行线.要求线的长度相同,整条线段都要在可视区域内. ` package p2; import java.applet.Applet; import ...

  5. 百度地图高级实例2-如何利用自己的数据制作社交地图?只显示可视区域内的标注

    摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内的标注. ----------------------------------- ...

  6. 如何利用自己的数据制作社交地图?只显示可视区域内的标注

    地址:http://www.cnblogs.com/milkmap/archive/2012/02/02/2335989.html [百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的 ...

  7. 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注...

    原文:[百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的标注 摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内 ...

  8. 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注

    [百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的标注 摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内的标注 ...

  9. 控制元素到达可视区域内触发动效

    控制元素到达可视区域内触发动效,代码参考了别人的,有修改,时间久了,出处想不起来.后面遇到了会补充源码地址.<!DOCTYPE html> <html> <head> ...

最新文章

  1. 120xa正反转参数_RFID的软件SOPAS参数设置
  2. Java日期相关类:Date、SimpleDateFormat和Calendar类常用API代码示例
  3. 事理图谱概念辨析及其与风险标签分类结合的应用探讨
  4. linux 文件大小总和,linux磁盘占用跟每个文件夹大小总和不符?
  5. java 读取文件第一行代码,java文件读取。(单字节读取和按行读取读取)
  6. leetcode Valid Palindrome
  7. PDF 报告生成器:用 reportlab 和 pdfrw 生成自定义 PDF 报告
  8. lisp型材库_基于Visual Lisp的面向对象零件库的开发
  9. UVC之MJPEG流
  10. Arduino火焰传感器(红外线接收器)的使用
  11. 采购招标系统源码 一站式全流程采购招标系统
  12. 前端进化史——The Evolution of Front End Development
  13. 基于C/C++获取电脑网卡的IP地址信息
  14. 网校搭建完成,课程还需要设计吗?
  15. redis3.0.7 cluster 集群部署
  16. 男孩,请用几分钟看这篇文章(女孩别看,会哭 )
  17. 微信商城小程序 带java后台源码
  18. JS维护nginx反向代理,妈妈再也不用担心我跨域了!
  19. Python学习记录-实战三、模拟12306火车票订票流程
  20. PTA 多项式A除以B (25 分)

热门文章

  1. 挑战 Intel 和英伟达,高通发布 Cloud AI 100 边缘推理芯片
  2. Spring Cloud Stream Binder 实现
  3. Angular系列学习二:基本的组件说明、自定义组件和部分细节说明
  4. 注册中心 Eureka 源码解析 —— 应用实例注册发现(五)之过期
  5. 鸡蛋该放在哪些篮子里?多少合适?
  6. 现在企业会要求JAVA人员会怎样的技术呢?
  7. MWeb for iOS 测试版介绍
  8. CentOS7之新建用户与SSH登陆
  9. 接入新浪、腾讯微博和人人网的Android客户端实例 接入新浪、腾讯微博和人人网的Android客户端实例...
  10. MySQLRPM安装