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 指南/入门基础
Nov 30 Javascript
javascript 跳转代码集合
Dec 03 Javascript
jquery 列表双向选择器之改进版
Aug 09 Javascript
js实现仿京东2级菜单效果(带延时功能)
Aug 27 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
Dec 29 Javascript
JS组件Form表单验证神器BootstrapValidator
Jan 26 Javascript
微信小程序request出现400的问题解决办法
May 23 Javascript
浅析node.js的模块加载机制
May 25 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
Sep 08 Javascript
微信小程序实现登录遮罩效果
Nov 01 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
Jun 05 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
Nov 06 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
最小化数据传输――在客户端存储数据
2006/10/09 PHP
php中的观察者模式
2010/03/24 PHP
php抓取页面的几种方法详解
2013/06/17 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
浅析PHP微信支付通知的处理方式
2014/05/25 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
2011/04/12 Javascript
jquery click([data],fn)使用方法实例介绍
2013/07/08 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
2016/12/26 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
jquery登录的异步验证操作示例
2019/05/09 jQuery
koa router 多文件引入的方法示例
2019/05/22 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
详解微信小程序中var、let、const用法与区别
2020/01/11 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
python解析xml文件操作实例
2014/10/05 Python
Python异常学习笔记
2015/02/03 Python
Python全局变量操作详解
2015/04/14 Python
python实现全盘扫描搜索功能的方法
2019/02/14 Python
python中删除某个元素的方法解析
2019/11/05 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
我的五年职业生涯规划
2014/01/23 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
授权收款委托书范本
2014/10/10 职场文书
2016自主招生校长推荐信范文
2015/03/23 职场文书
元旦联欢晚会主持词
2015/07/01 职场文书
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技