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 offset函数应用实例
Nov 14 Javascript
js实现在页面上弹出蒙板技巧简单实用
Apr 16 Javascript
jQuery中extend函数的实现原理详解
Feb 03 Javascript
Angularjs 滚动加载更多数据
Mar 17 Javascript
thinkjs之页面跳转同步异步操作
Feb 05 Javascript
es7学习教程之Decorators(修饰器)详解
Jul 21 Javascript
vue教程之toast弹框全局调用示例详解
Aug 24 Javascript
详解angularjs 学习之 scope作用域
Jan 15 Javascript
webpack vue项目开发环境局域网访问方法
Mar 20 Javascript
vue如何通过id从列表页跳转到对应的详情页
May 01 Javascript
通过实例了解Javascript柯里化流程
Mar 03 Javascript
javascript的hashCode函数实现代码小结
Aug 11 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
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
解析PHP中empty is_null和isset的测试
2013/06/29 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
Laravel 之url参数,获取路由参数的例子
2019/10/21 PHP
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
2017/12/21 Javascript
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
在Django的通用视图中处理Context的方法
2015/07/21 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
python笔记:mysql、redis操作方法
2017/06/28 Python
Django如何自定义分页
2018/09/25 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
2019/01/30 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
python mysql中in参数化说明
2020/06/05 Python
基于DOM+CSS3实现OrgChart组织结构图插件
2016/03/02 HTML / CSS
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
美国综合购物商城:UnbeatableSale.com
2018/11/28 全球购物
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
奢华时尚的创新平台:Baltini
2020/10/03 全球购物
经典c++面试题三
2015/07/08 面试题
会计自我鉴定
2013/11/02 职场文书
婚礼父母答谢词
2015/01/04 职场文书
公司宣传语大全
2015/07/13 职场文书
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL