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 Tabs插件宿主IFRAMES
Jan 01 Javascript
Jquery ui css framework
Jun 28 Javascript
JavaScript 函数replace深入了解
Mar 14 Javascript
手机端转盘抽奖代码分享
Sep 10 Javascript
jQuery滑动到底部加载下一页数据的实例代码
May 22 jQuery
JS获取当前地理位置的方法
Oct 25 Javascript
详解vue的diff算法原理
May 20 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
Aug 22 Javascript
ajax跨域访问遇到的问题及解决方案
May 23 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
Jun 22 Javascript
JS实现的碰撞检测与周期移动完整示例
Sep 02 Javascript
Vue3.0中的monorepo管理模式的实现
Oct 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
GD输出汉字的函数的分析
2006/10/09 PHP
discuz Passport 通行证 整合笔记
2008/06/30 PHP
超级好用的一个php上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
PHP生成图片验证码、点击切换实例
2014/06/25 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
数组方法解决JS字符串连接性能问题有争议
2011/01/12 Javascript
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
node.js中的fs.read方法使用说明
2014/12/17 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
2016/11/03 Javascript
基于Vuejs框架实现翻页组件
2020/06/29 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
详解jQuery中的事件
2016/12/14 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
2017/03/09 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
分析在Python中何种情况下需要使用断言
2015/04/01 Python
从Python程序中访问Java类的简单示例
2015/04/20 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
简述Python中的进程、线程、协程
2016/03/18 Python
Python如何生成树形图案
2018/01/03 Python
Python操作mongodb的9个步骤
2018/06/04 Python
python-opencv颜色提取分割方法
2018/12/08 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
python实现AdaBoost算法的示例
2020/10/03 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
创建文明城市倡议书
2015/04/28 职场文书
自荐信大全
2019/03/21 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书