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 相关文章推荐
jQuery 性能优化指南(3)
May 21 Javascript
用js做一个小游戏平台 (一)
Dec 29 Javascript
Position属性之relative用法
Dec 14 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
Mar 21 jQuery
jQuery实现页码跳转式动态数据分页
Dec 31 jQuery
详解vue-meta如何让你更优雅的管理头部标签
Jan 18 Javascript
vue.js动画中的js钩子函数的实现
Jul 06 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
Mar 06 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
May 27 jQuery
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
Sep 10 Javascript
vscode+gulp轻松开发小程序的完整步骤
Oct 18 Javascript
React更新渲染原理深入分析
Dec 24 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路由类
2016/05/29 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
微信支付扫码支付php版
2016/07/22 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
js 通过html()及text()方法获取并设置p标签的显示值
2014/05/14 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
JS实现将链接生成二维码并转为图片的方法
2018/03/17 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
vue实现全匹配搜索列表内容
2019/09/26 Javascript
js实现3D旋转相册
2020/08/02 Javascript
[03:06]V社市场总监Dota2项目负责人Erik专访:希望更多中国玩家加入DOTA2
2014/07/11 DOTA
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
bat和python批量重命名文件的实现代码
2016/05/19 Python
实例讲解Python爬取网页数据
2018/07/08 Python
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
2020/06/02 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
医院护理人员的自我评价分享
2013/10/04 职场文书
银行行长竞聘演讲稿
2014/04/23 职场文书
2014年药品销售工作总结
2014/12/16 职场文书
颐和园英文导游词
2015/01/30 职场文书
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
2021/04/01 PHP
动画「半妖的夜叉姬」新BD特典图公开
2022/03/22 日漫
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python