jQuery-拖动层(在可视区域范围内)
(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-拖动层(在可视区域范围内)相关推荐
- cocos2d中,设置层的可视区域
http://www.cocoachina.com/bbs/read.php?tid=97164 cocos2d中,设置层的可视区域在真机上不管用 -(void) visit{ glEnabl ...
- php开发是可视的吗,javascript,html_Jquery判断页面元素是否在浏览器的可视区域内,javascript,html,css,html5 - phpStudy...
Jquery判断页面元素是否在浏览器的可视区域内 前端开发中,有时需要判断某个元素是否在浏览器的可视区域内,或者是否已经滚动出了可视区域.首先想到的便是javascript操作,原生方法自然可以,不过 ...
- 编写一个Applet,随机选择矩形、圆形、椭圆、直线等形状,在可视区域内绘制20个图形,同一种图形使用同一种颜色,不需要填充。
编写一个Applet,随机选择矩形.圆形.椭圆.直线等形状,在可视区域内绘制20个图形,同一种图形使用同一种颜色,不需要填充. package p2;import java.applet.Applet ...
- 编写一个Applet,画出20条水平的、随机颜色的平行线。要求线的长度相同,整条线段都要在可视区域内
编写一个Applet,画出20条水平的.随机颜色的平行线.要求线的长度相同,整条线段都要在可视区域内. ` package p2; import java.applet.Applet; import ...
- 百度地图高级实例2-如何利用自己的数据制作社交地图?只显示可视区域内的标注
摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内的标注. ----------------------------------- ...
- 如何利用自己的数据制作社交地图?只显示可视区域内的标注
地址:http://www.cnblogs.com/milkmap/archive/2012/02/02/2335989.html [百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的 ...
- 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注...
原文:[百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的标注 摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内 ...
- 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注
[百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的标注 摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内的标注 ...
- 控制元素到达可视区域内触发动效
控制元素到达可视区域内触发动效,代码参考了别人的,有修改,时间久了,出处想不起来.后面遇到了会补充源码地址.<!DOCTYPE html> <html> <head> ...
最新文章
- 120xa正反转参数_RFID的软件SOPAS参数设置
- Java日期相关类:Date、SimpleDateFormat和Calendar类常用API代码示例
- 事理图谱概念辨析及其与风险标签分类结合的应用探讨
- linux 文件大小总和,linux磁盘占用跟每个文件夹大小总和不符?
- java 读取文件第一行代码,java文件读取。(单字节读取和按行读取读取)
- leetcode Valid Palindrome
- PDF 报告生成器:用 reportlab 和 pdfrw 生成自定义 PDF 报告
- lisp型材库_基于Visual Lisp的面向对象零件库的开发
- UVC之MJPEG流
- Arduino火焰传感器(红外线接收器)的使用
- 采购招标系统源码 一站式全流程采购招标系统
- 前端进化史——The Evolution of Front End Development
- 基于C/C++获取电脑网卡的IP地址信息
- 网校搭建完成,课程还需要设计吗?
- redis3.0.7 cluster 集群部署
- 男孩,请用几分钟看这篇文章(女孩别看,会哭 )
- 微信商城小程序 带java后台源码
- JS维护nginx反向代理,妈妈再也不用担心我跨域了!
- Python学习记录-实战三、模拟12306火车票订票流程
- PTA 多项式A除以B (25 分)
热门文章
- 挑战 Intel 和英伟达,高通发布 Cloud AI 100 边缘推理芯片
- Spring Cloud Stream Binder 实现
- Angular系列学习二:基本的组件说明、自定义组件和部分细节说明
- 注册中心 Eureka 源码解析 —— 应用实例注册发现(五)之过期
- 鸡蛋该放在哪些篮子里?多少合适?
- 现在企业会要求JAVA人员会怎样的技术呢?
- MWeb for iOS 测试版介绍
- CentOS7之新建用户与SSH登陆
- 接入新浪、腾讯微博和人人网的Android客户端实例 接入新浪、腾讯微博和人人网的Android客户端实例...
- MySQLRPM安装