jQuery 拖动层(在可视区域范围内)


Posted in Javascript onMay 24, 2012
(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

Javascript 相关文章推荐
javascript replace方法与正则表达式
Feb 19 Javascript
Google的跟踪代码 动态加载js代码方法应用
Nov 12 Javascript
window.open以post方式将内容提交到新窗口
Dec 26 Javascript
js获取指定日期前后的日期代码
Aug 20 Javascript
jquery常用函数与方法汇总
Sep 01 Javascript
js实现打地鼠小游戏
Feb 13 Javascript
js如何编写简单的ajax方法库
Aug 02 Javascript
详解SPA中前端路由基本原理与实现方式
Sep 12 Javascript
Next.js实现react服务器端渲染的方法示例
Jan 06 Javascript
vue中多个倒计时实现代码实例
Mar 27 Javascript
vue proxy 的优势与使用场景实现
Jun 15 Javascript
DWR内存兼容及无法调用问题解决方案
Oct 16 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
May 24 #Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
May 24 #Javascript
js动态在form上插入enctype=multipart/form-data的问题
May 24 #Javascript
javascript中关于break,continue的特殊用法与介绍
May 24 #Javascript
网页编辑器ckeditor和ckfinder配置步骤分享
May 24 #Javascript
JavaScript之编码规范 推荐
May 23 #Javascript
javascript的数据类型、字面量、变量介绍
May 23 #Javascript
You might like
PHP&amp;MYSQL服务器配置说明
2006/10/09 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
php基于单例模式封装mysql类完整实例
2016/10/18 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
php文件管理基本功能简单操作
2017/01/16 PHP
TP5多入口设置实例讲解
2020/12/15 PHP
jQuery的Ajax时无响应数据的解决方法
2010/05/25 Javascript
js实现翻页后保持checkbox选中状态的实现方法
2012/11/03 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
jQuery简单实现日历的方法
2015/05/04 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
小程序实现上下移动切换位置
2019/09/23 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
Python的另外几种语言实现
2015/01/29 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
Python依赖包整体迁移方法详解
2019/08/15 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
英国快时尚女装购物网站:PrettyLittleThing
2018/08/15 全球购物
医学专业毕业生推荐信
2013/11/14 职场文书
初三物理教学反思
2014/01/21 职场文书
亲属关系公证书样本
2015/01/23 职场文书
2016新年问候语大全
2015/11/11 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python