工作需要写的一个js拖拽组件

时间:2024-04-08 10:53:20 


/*
*使用方法:
* var d = new Drag({id:'dragPannel',maxLeft:500,maxTop:200});
* d.ready();
*请注意:
* 拖动对象的left和top样式必须写在其style属性里边
*
*/
//矫正调用者。将 fn 作为 newObj 的方法调用
function repairCaller(newObj, fn){
return function(){
return fn.apply(newObj, arguments);
}
}
function Drag( config ){
this.moveTarget = T.dom.get( config.id );
this.startLeft = parseInt(this.moveTarget.style.left); //每次拖动开始时被拖动对象的 left,top
this.startTop = parseInt(this.moveTarget.style.top);
this.startClientX = this.startLeft; //保存拖动开始时事件的 clientX, clientY
this.startClientY = this.startTop;
this.MAX_LEFT = config.maxLeft||document.documentElement.clientWidth - this.moveTarget.offsetWidth; //元素可以移动的最大范围
this.MAX_TOP = config.maxTop||document.documentElement.clientHeight - this.moveTarget.offsetHeight;
this.lock = true;
}
Drag.prototype.ready = function(){
//绑定事件
T.bind(document, "mousedown", repairCaller(this,this.down));
T.bind(document, "mousemove", repairCaller(this,this.move));
T.bind(document, "mouseup", repairCaller(this,this.stop));
}
Drag.prototype.down = function(){
//取得事件对象
var event = T.event.getEvent(arguments[0]),
target = T.event.getTarget(event);
if (target == this.moveTarget){
this.lock = false;
//在事件开始时保存各种坐标位置
this.startLeft = parseInt(this.moveTarget.style.left);
this.startTop = parseInt(this.moveTarget.style.top);
this.startClientX = event.clientX;
this.startClientY = event.clientY;
}
};
Drag.prototype.move = function(){
if(!this.lock ){
//取得事件对象
var event = T.event.getEvent(arguments[0]),
target = T.event.getTarget(event);
if(target == this.moveTarget){
//如有选择内容,清除之
//window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
//凑数拖动范围有没超过最大限制
var realLeft = this.startLeft + event.clientX - this.startClientX, //实际的移动范围
realTop = this.startTop + event.clientY - this.startClientY,
rightLeft , rightTop; //正确的 left, top 取值
rightLeft = realLeft > this.MAX_LEFT ? this.MAX_LEFT : ( realLeft > 0 ? realLeft : 0 );
rightTop = realTop > this.MAX_TOP ? this.MAX_TOP : ( realTop > 0 ? realTop : 0 );
this.moveTarget.style.left = rightLeft + "px";
this.moveTarget.style.top = rightTop + "px";
}
else{
this.lock = true;
}
}
};
Drag.prototype.stop = function(){
this.lock = true
};


后记:
在写的过程中非常需要注意的几点是:
1、拖动层的 position、left 和 top 必须写在 style 里
2、移动过程中设置 left 和 top 要带单位,否则不起作用
3、多级 div 嵌套时需要给父 div 加 over-flow:hidden 样式
完毕!

标签:拖拽组件
0
投稿

猜你喜欢

  • 以PHP代码为实例详解RabbitMQ消息队列中间件的6种模式

    2023-06-08 12:15:53
  • Python实现优先级队列结构的方法详解

    2022-06-15 20:59:33
  • sql server创建复合主键的2种方法

    2024-01-26 11:10:38
  • JS FormData对象使用方法实例详解

    2024-02-25 04:54:46
  • Go语言基础设计模式之策略模式示例详解

    2024-05-25 15:11:01
  • MySQL中从库延迟状况排查的一则案例

    2024-01-21 01:32:53
  • 解析JavaScript中 querySelector 与 getElementById 方法的区别

    2024-04-19 09:57:32
  • 在微信小程序里使用watch和computed的方法

    2024-04-10 16:16:40
  • js中eval详解

    2024-04-19 10:01:30
  • python读取和保存视频文件

    2023-11-14 06:10:20
  • 使用sqlplus连接Oracle数据库问题

    2024-01-13 09:25:16
  • 微信小程序学习笔记之文件上传、下载操作图文详解

    2023-09-07 21:13:21
  • pytorch和numpy默认浮点类型位数详解

    2021-11-10 10:19:49
  • Layer UI表格列日期格式化及取消自动填充日期的实现方法

    2024-04-22 13:02:22
  • MySQL Workbench的使用方法(图文)

    2024-01-26 18:47:12
  • php传值和传引用的区别点总结

    2024-03-18 11:26:39
  • PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】

    2023-07-23 02:36:20
  • Python数据结构与算法之完全树与最小堆实例

    2021-01-10 06:58:47
  • 基于 Serverless +企业微信打造 nCoV 疫情监控小助手

    2023-11-20 21:42:02
  • MYSQL的存储过程和函数简单写法

    2024-01-21 20:16:34
  • asp之家 网络编程 m.aspxhome.com