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 相关文章推荐
js弹窗代码 可以指定弹出间隔
Jul 03 Javascript
javascript parseInt() 函数的进制转换注意细节
Jan 08 Javascript
详解JavaScript中Date.UTC()方法的使用
Jun 12 Javascript
JavaScript代码判断点击第几个按钮
Dec 13 Javascript
盘点javascript 正则表达式中 中括号的【坑】
Mar 16 Javascript
JavaScript:Array类型全面解析
May 19 Javascript
详解Javascript函数声明与递归调用
Oct 22 Javascript
详解a++和++a的区别
Aug 30 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
Aug 18 Javascript
Vue项目自动转换 px 为 rem的实现方法
Oct 29 Javascript
vue项目打包之后背景样式丢失的解决方案
Jan 17 Javascript
JavaScript canvas实现跟随鼠标事件
Feb 10 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和ACCESS写聊天室(二)
2006/10/09 PHP
php调用mysql数据 dbclass类
2011/05/07 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
纯js实现背景图片切换效果代码
2010/11/14 Javascript
jQuery Tools tab使用介绍
2012/07/14 Javascript
js倒计时小程序
2013/11/05 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
通过node-mysql搭建Windows+Node.js+MySQL环境的教程
2016/03/01 Javascript
javascript中不易分清的slice,splice和split三个函数
2016/03/29 Javascript
分分钟玩转Vue.js组件
2016/10/25 Javascript
Vue中fragment.js使用方法详解
2017/03/09 Javascript
JS实现的简单四则运算计算器功能示例
2017/09/27 Javascript
使用ECharts实现状态区间图
2018/10/25 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
[01:04:05]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python语言描述KNN算法与Kd树
2017/12/13 Python
Numpy数组的保存与读取方法
2018/04/04 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
Python TestSuite生成测试报告过程解析
2020/07/23 Python
盛大笔试题
2016/11/05 面试题
写好自荐信的几个要点
2013/12/26 职场文书
未婚证明书模板
2014/10/08 职场文书
教师个人工作总结范文2014
2014/11/10 职场文书
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers