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 $(document).ready() 与window.onload的区别
Dec 28 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
Feb 12 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
Sep 19 Javascript
jQuery响应enter键的实现思路
Apr 18 Javascript
js实现星星打分效果的方法
Jul 05 Javascript
jquery中添加属性和删除属性
Jun 03 Javascript
vue+vux实现移动端文件上传样式
Jul 28 Javascript
深入理解requireJS-实现一个简单的模块加载器
Jan 15 Javascript
微信小程序实现倒计时补零功能
Jul 09 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
Aug 08 Javascript
Vuex 使用及简单实例(计数器)
Aug 29 Javascript
浅谈JavaScript 声明提升
Sep 14 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防盗链代码实例
2014/08/27 PHP
一款简单实用的php操作mysql数据库类
2014/12/08 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
javascript小数计算出现近似值的解决办法
2010/02/06 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
webpack dll打包重复问题优化的解决
2018/10/10 Javascript
vue最简单的前后端交互示例详解
2018/10/11 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
javascript实现前端input密码输入强度验证
2020/06/24 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
vue实现购物车的小练习
2020/12/21 Vue.js
使用python实现生成用户信息
2017/03/20 Python
python制作mysql数据迁移脚本
2019/01/01 Python
解决Django migrate不能发现app.models的表问题
2019/08/31 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
Django自带的加密算法及加密模块详解
2019/12/03 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
2021/03/03 Python
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
Java提供了哪些企业应用编程接口
2015/02/13 面试题
迟到检讨书1000字
2014/01/15 职场文书
检举信的格式及范文
2014/04/04 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
投资合作意向书范本
2015/05/08 职场文书
加班费申请报告
2015/05/15 职场文书
学习雷锋主题班会
2015/08/14 职场文书
mybatis使用oracle进行添加数据的方法
2021/04/27 Oracle