拖动控件 javascript原生,兼容IE6-11、chrome、firefox、Opera、Safari
鼠标拖动元素,对于初学者来说,是一个很难的话题,其实只要应用好事件,就能很好的控制拖动的对象,其主要事件是 mousedown,mousemove,mouseup,其原理是在鼠标点击元素时,在给定鼠标的移动事件和鼠标弹起的事件,很多人都习惯,在元素中添加鼠标按下、鼠标移动和鼠标弹起事件,这样多数会造成鼠标拖动过快,元素反而跟不上鼠标,出现脱离鼠标,鼠标弹起也不能定位到指定位置。这样就需要在鼠标按下事件中添加鼠标移动和鼠标弹起事件,(这是我做这个拖动时遇到的问题,如果有什么不对请大家指出!!!)
下面是拖动组件的源码:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>darg</title>
</head>
<body>
<script type="text/javascript">
;var Drag = (function(window){
return {
init: function(options) {
var defaults=new Object();
for(elements in this.defaults){
defaults[elements]=this.defaults[elements]
}
defaults.tDarg=document.getElementById(options.tDarg);
defaults.bDarg=document.getElementById(options.bDarg);
defaults.opacity=options.opacity;
defaults.flag = options.flag;
Drag.setCss.call(defaults.tDarg,{"position":"absolute","cursor":"move"});
Drag.setCss.call(defaults.bDarg,{"position":"absolute"});
var lib = this;
if(!!defaults.tDarg.addEventListener){
defaults.tDarg.addEventListener("mousedown",function(e){
lib.beforeDrag.call(defaults.bDarg,e,defaults);
window.addEventListener("mousemove",function(e){lib.onDrag.call(defaults.tDarg,e,defaults)},false);
window.addEventListener("mouseup",function(e){lib.endDrag.call(defaults.tDarg,e,defaults)},false);
},false);
}else{
defaults.tDarg.attachEvent("onmousedown",function(e){
lib.beforeDrag.call(defaults.bDarg,e,defaults);
document.attachEvent("onmousemove",function(e){lib.onDrag.call(defaults.tDarg,e,defaults)});
document.attachEvent("onmouseup",function(e){lib.endDrag.call(defaults.tDarg,e,defaults)});
});
}
},
defaults:{
tDarg:null,
bDarg:null,
opacity: 100,
flag: true,
elem:[],
dowOrUp:false
},
setCss: function(cObj){
for(var c in cObj){
this.style[c]=cObj[c];
}
},
setOpacity: function(opacity){
if(window.addEventListener){
this.style.opacity = opacity / 100;
}else{
this.filters.alpha.opacity = opacity;
}
},
beforeDrag: function(e,objdefaule){
var e = e || window.event;
if(objdefaule.elem.length>1) return ;
if((window.addEventListener && e.button==0) || (!window.addEventListener && e.button==1)){
if (e.preventDefault) {
e.preventDefault();
e.stopPropagation();
}
objdefaule.dowOrUp=true;
var clone=this.cloneNode(true);
clone.style.zIndex=Drag.getZIndex();
this.style.zIndex=Drag.getZIndex()+1;
clone.removeAttribute("id");
this.parentNode.appendChild(clone);
Drag.setOpacity.call(this,objdefaule.opacity);
objdefaule.elem.push({lib:this,obj:clone,startX:e.clientX,startY:e.clientY,startLeft:this.offsetLeft,startTop:this.offsetTop});
}
},
onDrag: function(e,objdefaule){
var e = e || window.event;
if(!window.addEventListener){
e.returnValue = false;
}
if(objdefaule.dowOrUp){
for(var i=0; i<objdefaule.elem.length; i++){
objdefaule.elem[i].lib.style.left=e.clientX-objdefaule.elem[i].startX+objdefaule.elem[i].startLeft+ "px";
objdefaule.elem[i].lib.style.top =e.clientY-objdefaule.elem[i].startY+objdefaule.elem[i].startTop +"px";
}
}
},
endDrag: function(e,objdefaule){
if(objdefaule.dowOrUp){
var i=0;
while(objdefaule.elem.length>0){
objdefaule.elem[i].obj.style.left=objdefaule.elem[i].lib.style.left;
objdefaule.elem[i].obj.style.top =objdefaule.elem[i].lib.style.top;
Drag.setOpacity.call(Drag.defaults.elem[i].lib,100)
objdefaule.elem[i].obj.parentNode.removeChild(objdefaule.elem[i].obj)
objdefaule.elem.shift();
}
Drag.defaults.dowOrUp=false;
}
},
getZIndex: function(){
var zindex = 1;
var div = document.getElementsByTagName("DIV");
for(var i = 0 ;i < div.length; i++){
if(parseInt(zindex)<parseInt(div[i].style.zIndex)){
zindex=parseInt(div[i].style.zIndex);
}
}
return parseInt(zindex);
}
}
})(window);
window.onload=function(){
Drag.init({tDarg:"objtitle2",bDarg:"objbody2",opacity: 50, flag: true});
Drag.init({tDarg:"objtitle3",bDarg:"objbody3",opacity: 50, flag: true});
Drag.init({tDarg:"objtitle",bDarg:"objbody",opacity: 50, flag: true});
Drag.init({tDarg:"objtitle4",bDarg:"objbody4",opacity: 50, flag: true});
}
</script>
<div id="objbody4" style="filter:alpha(opacity=100);opacity:1;width:200px;height:150px; border:1px solid #f00;background:#020200; float:left; margin-left:-10px">
<div id="objtitle4" style="background-color:#f00;width:200px; height:30px;background:#f0f">biaoti1</div>
</div>
<div id="objbody" style="filter:alpha(opacity=100);opacity:1;width:198px; height:150px; border:1px solid #06C; border-top:0;position:fixed;left:600px;">
<div id="objtitle" style="background-color:#06C;width:200px; height:30px;position:fixed; ">biaoti2</div>
</div>
<div id="objbody3" style="filter:alpha(opacity=100);opacity:1;width:198px; height:150px; border:1px solid #00f; border-top:0; position:relative;left:200px;">
<div id="objtitle3" style="background-color:#00f;width:200px; height:30px;position:relative;">biaoti3</div>
</div>
<div id="objbody2" style="filter:alpha(opacity=100);opacity:1;width:198px; height:150px; border:1px solid #f00; border-top:0; position:absolute;left:400px">
<div id="objtitle2" style="background-color:#f00;width:200px; height:30px;position:absolute;">biaoti4</div>
</div>
<div style="position:absolute">
</div>
</body>
</html>
拖动控件 javascript原生,兼容IE6-11、chrome、firefox、Opera、Safari的更多相关文章
- [完美]原生JS获取浏览器版本判断--支持Edge,IE,Chrome,Firefox,Opera,Safari,以及各种使用Chrome和IE混合内核的浏览器
截至自2017-08-11,支持现世已出的几乎所有PC端浏览器版本判断. 受支持的PC端浏览器列表: Edge IE Chrome Firefox Opera Safari QQ浏览器 360系列浏览 ...
- JavaScript日历控件!JS兼容IE6.7.FF.可挡住下拉控件
原文发布时间为:2009-08-22 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...
- wxpython 中 用鼠标拖动控件 总结
#encoding: utf-8 import wx import os import noname class Frame( noname.MyFrame1 ): def __init__(self ...
- win10 uwp 拖动控件
我们会使用控件拖动,可以让我们做出好看的动画,那么我们如何移动控件,我将会告诉大家多个方法.其中第一个是最差的,最后的才是我希望大神你去用. Margin 移动 我们可以使用Margin移动,但这是w ...
- atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較
atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較 例如以下列举了server控件生命周期所要经历的11个阶段. (1)初始 ...
- 兼容IE6/IE7/IE8/FireFox的css hack
兼容IE6/IE7/IE8/FireFox的css hack .color{ background-color: #CC00FF; background-color: #FF00009; *backg ...
- javascript 框架、根基技巧、布局、CSS、控件 JavaScript 类库
预筹备之 JavaScript 今朝支流的 JavaScript 框架排名中,jQuery 和 Ext 可算是佼佼者,得到了用户的普遍好评.海内的一些框架许多也是模仿 jQuery 对 JavaScr ...
- Microsoft ReportViewer 控件类型版本兼容问题及解决方法
错误 Parser Error Message: The base class includes the field 'rvEquipment', but its type (Microsoft.Re ...
- 通过setMouseTracking实现用鼠标拖动控件
1 import sys 2 from PyQt5.Qt import * 3 4 class Mwindow(QWidget): 5 leftclick = False 6 7 def __init ...
随机推荐
- 使用Mysqldump 备份数据库
使用Mysqldump 备份数据库 1.备份一个数据库 mysqldump --user [user name] --password=[password] [database name] > ...
- 关于VS中更改栈和堆空间的大小
编号:1008时间:2016年4月12日17:01:38功能:关于VS中更改栈和堆空间的大小 URL:http://blog.csdn.net/icerock2000/article/details/ ...
- JS操作DOM常用API总结
<JS高程>中的DOM部分写的有些繁琐,还没勇气整理,直到看到了这篇博文 Javascript操作DOM常用API总结,顿时有了一种居高临下,一览全局的感觉.不过有时间还是得自己把书里面的 ...
- 文件系统层次标准FHS的详细介绍
Filesystem Hierarchy Standard (文件系统层次标准,FHS)标准依据文件系统使用的频繁与否与是否允讲使用者随意更动, 而将目录定义成四种交互作用的形态,具体如下: 可分享的 ...
- 让Grub 2来拯救你的 bootloader
没有什么事情比 bootloader 坏掉更气人的了,充分发挥 Grub 2 的作用,让 bootloader 安分工作吧.为什么这么说? Grub 2 是最受欢迎的 bootloader ,几乎用在 ...
- [转载]新手入门:Spring的一些学习方法及意见
原文地址:新手入门:Spring的一些学习方法及意见作者:飞扬飞扬xyz Spring简介: 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您 ...
- Linux 安装rar解压工具
下载RAR安装包: http://www.rarsoft.com/download.htm 我的是CentOS 64位: wget http://www.rarsoft.com/rar/rarlinu ...
- 【NOIP2013】火柴排队
如果没有这道题的话我连逆序对是啥都不知道QAQ 原题: 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: ...
- Android度量单位说明(DIP,DP,PX,SP)
本文转载于:http://blog.sina.com.cn/s/blog_6b26569e0100xw6d.html (一)概念 dip: device independent pixels(设备独立 ...
- android:id="@+id/button1" 与 android:id="@id/button1" 区别 @string
一.android:id="@+id/button1" 与 android:id="@id/button1" 区别 android:id="@+id/ ...