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 相关文章推荐
麻雀虽小五脏俱全 Dojo自定义控件应用
Sep 04 Javascript
js中typeof的用法汇总
Dec 12 Javascript
js鼠标及对象坐标控制属性详细解析
Dec 14 Javascript
ie8本地图片上传预览示例代码
Jan 12 Javascript
jquery ajax,ashx,json的用法总结
Feb 12 Javascript
基于javascript实现泡泡大冒险网页版小游戏
Mar 23 Javascript
JS采用绝对定位实现回到顶部效果完整实例
Jun 20 Javascript
同步文本框内容JS代码实现
Aug 04 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
Sep 09 Javascript
详解express与koa中间件模式对比
Aug 07 Javascript
使用element-ui table expand展开行实现手风琴效果
Mar 15 Javascript
今天,小程序正式支持 SVG
Apr 20 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
古巴咖啡 Cubita琥爵咖啡 独特的加勒比海风味咖啡
2021/03/06 新手入门
关于PHP文件的自动运行方法分析
2016/05/13 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
showModelessDialog()使用详解
2006/09/07 Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
2012/07/21 Javascript
nodejs的require模块(文件模块/核心模块)及路径介绍
2013/01/14 NodeJs
js设置function参数默认值(适合没有传参情况)
2014/02/24 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
jquery实现模拟百分比进度条渐变效果代码
2015/10/29 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
常用python数据类型转换函数总结
2014/03/11 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
2016/06/16 Python
Python subprocess模块详细解读
2018/01/29 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
Django中间件实现拦截器的方法
2018/06/01 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
美国糖果店:Sugarfina
2019/02/21 全球购物
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
优秀学生自我鉴定范例
2013/12/18 职场文书
中学自我评价
2014/01/31 职场文书
法律进社区实施方案
2014/03/21 职场文书
优秀员工推荐信
2014/05/10 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
远程教育学习心得体会
2016/01/23 职场文书
详解pytorch创建tensor函数
2022/03/22 Python