首页 > 其他分享 >div 拖动例子

div 拖动例子

时间:2023-09-20 12:06:58浏览次数:36  
标签:style 拖动 divClone 例子 var div event parseInt


第一个是简单的例子:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
	<title>dragTest</title>
	<meta http-equiv="content-type" content="text/html; charset=UTF-8">

	<script type="text/javascript">

	var isDrag=0;//是否可拖动标志,可拖动为1,不可拖动为2
	var divAndMouseX;//鼠标落点距离div左上角x坐标的差距
	var divAndMouseY;//鼠标落点距离div左上角y坐标的差距
	var divMove;
	//鼠标按下时
	function down(div){//鼠标按下
		isDrag=1;//将div设置为可拖动
		divMove=div;//用于下边拖动时的定位(新的位置的坐标)
		//首先计算鼠标与拖动对象左上角的坐标差,然后在下边拖动方法中,用鼠标的坐标减坐标差就是新位置的坐标了
		divAndMouseX=event.clientX-parseInt(div.style.left);
		divAndMouseY=event.clientY-parseInt(div.style.top);
	}
	function move(){//拖动过程计算div坐标
		if(isDrag==1){
			divMove.style.left=event.clientX-divAndMouseX;
			divMove.style.top=event.clientY-divAndMouseY;
		}
	}

	function up(){//放开鼠标将div设置为不可拖动
		isDrag=0;
	}
</script>
	</head>

	<body>
		<div id="divtest" οnmοusedοwn="down(this)" οnmοusemοve="move()"
			οnmοuseup="up()"
			style="cursor: move; border: 1px dashed blue; background-color: lightblue; width: 50px; height: 50px; position: absolute; left: 100px; top: 50px;">
			<table width="100%" height="100%">
				<tr>
					<td>
						test
					</td>
				</tr>
			</table>
		</div>
	</body>
</html>

 

第二个是进阶例子:

<html> 
<head> 
<title>Div拖动/调整大小实例</title> 
</head> 
<script type="text/javascript"> 
//保留的位置 
var saveLeft,saveTop,saveWidth,saveHeight; 
var theBody; 
var eventType;     //事件种类, "move"、"resize" 
var div;

//创建并设定div的参数 
function setDiv() 
{ 
   //防止重复打开 
   if (div) 
   { 
   return; 
   } 
   var newLeft,newTop,newWidth,newHeight; 
   theBody = document.body; 
   
   div = document.createElement("div"); 
   div.id = "panelDiv"; 
   div.style.position = "absolute"; 
   div.style.backgroundColor = "#E5E5E5" 
   div.style.padding = "2px 5px 5px 2px"; 
   div.style.overflow = "hidden"; 
   div.style.zIndex = 1; 
   
   //设定打开的大小和位置 
   Function() 
   { 
   var openType = document.getElementById("radio1").checked ? 0 : 1; 
   if (openType == 0)   //默认大小默认位置居中打开 
   { 
     newWidth = "300px"; 
     newHeight = "300px"; 
     newLeft = (theBody.clientWidth - parseInt(newWidth)) / 2 + "px"; 
     newTop = (theBody.clientHeight - parseInt(newHeight)) / 2 + "px"; 
   } 
   else //存储的位置与大小 
   { 
     newWidth = saveWidth ? saveWidth : "300px"; 
     newHeight = saveHeight ? saveHeight : "300px"; 
     newLeft = saveLeft ? saveLeft : (theBody.clientWidth - parseInt(newWidth)) / 2 + "px"; 
     newTop = saveTop ? saveTop : (theBody.clientHeight - parseInt(newHeight)) / 2 + "px"; 
   } 
   div.style.width = newWidth; 
   div.style.height = newHeight; 
   div.style.left = newLeft; 
   div.style.top = newTop; 
   } 
   div = setChild(div); 
   theBody.appendChild(div); 
   
   var ipt = document.getElementsByTagName("input"); 
   for(var i = 0; i < ipt.length; i++) 
   { 
   ipt[i].disabled = true; 
   } 
}

function setChild(div) 
{ 
   //可否移动、调整 
   var isMove = document.getElementById("isMove").checked; 
   var isResize = document.getElementById("isResize").checked; 
   
   //底色 
   var cDiv = document.createElement; 
   var backDiv = cDiv("div"); 
   backDiv.style.cssText = "left: 0px; top: 0px; width: 100%; height: 100%; background-color: #F5F5F5;"; 
   div.appendChild(backDiv); 
   
   //标题 
   var topDiv = cDiv("div"); 
   topDiv.style.cssText = "left: 2px; top: 2px; width: 100%; height: 30px; position: absolute; background-color: #78ABFF; vertical-align: middle; z-index: 5"; 
   if (isMove) 
   { 
   topDiv.style.cursor = "move"; 
   topDiv.setAttribute("onmousedown", function(){setMove(this)}); 
   } 
   else 
   { 
   topDiv.style.cursor = "default"; 
   } 
   topDiv.innerHTML = "<span style='top: 5px; left:5px; font-size: 20px; font-weight: bold; color: #102548; position: relative;' onselectstart='return false'>标题栏</span>"; 
   div.appendChild(topDiv); 
   
   //关闭按钮 
   var closeDiv = cDiv("div"); 
   closeDiv.style.cssText = "right: 8px; top : 5px; width: 24px; height: 24px; position: absolute; background-color: #E4EEFF; border: #2D66C4 1px solid; text-align: center; vertical-align: middle; cursor: pointer; z-index: 10"; 
   closeDiv.setAttribute("onclick", function() {eCloseDiv()}); 
   closeDiv.innerHTML = "<span style='font-size: 20px; font-weight: bold; color: #0E377A;' title='Esc快捷键'>×</span>"; 
   div.appendChild(closeDiv); 
   
   //内容 
   var contentDiv = cDiv("div"); 
   contentDiv.style.cssText = "left: 2px; top: 35px; width: 100%; position: absolute; overflow: auto"; 
   contentDiv.style.height = (parseInt(div.style.height) - 40) + "px"; 
   contentDiv.innerHTML = "<table style='width: 100%; height: 100%; text-align: center; vertical-align: hidden'><tr><td><p>这里是内容区!</p><a href='javascript:saveDiv()'>保留这个位置和大小</a></td></tr></table>"; 
   div.appendChild(contentDiv); 
   
   //调整大小 
   var reDiv = cDiv("div"); 
   reDiv.style.cssText = "right: 0px; bottom: 0px; width: 5px; height: 5px; position: absolute;"; 
   if (isResize) 
   { 
   reDiv.style.cursor = "se-resize"; 
   reDiv.setAttribute("onmousedown", function(){setResize(this)}); 
   } 
   else 
   { 
   reDiv.style.cursor = "default"; 
   } 
   div.appendChild(reDiv); 
   
   return div; 
}

var oX, oY, oLeft, oTop, oWidth, oHeight; //存储原始移动前的位置 
var divClone, oDiv;   //克隆的节点和原始节点 
var oTime; 
//clone拖移的节点 
function setMove(obj) 
{ 
   if (event.button == 1) 
   { 
   if (oTime) 
   { 
     clearTimeout(oTime); 
     divClone.parentNode.removeChild(divClone); 
   } 
   oDiv = obj.parentNode; 
   divClone = oDiv.cloneNode(true); 
   divClone.style.filter = "Alpha(opacity=50)"; 
   divClone.childNodes[1].setAttribute("onmousemove", function(){startMove(this)}); 
   divClone.childNodes[1].setAttribute("onmouseup", function(){endMove()}); 
   oX = parseInt(event.clientX); 
   oY = parseInt(event.clientY); 
   oLeft = parseInt(divClone.style.left); 
   oTop = parseInt(divClone.style.top); 
   document.body.appendChild(divClone); 
   divClone.childNodes[1].setCapture(); 
   eventType = "move"; 
   } 
}

//拖移 
function startMove(obj) 
{ 
   if (eventType == "move" && event.button == 1) 
   { 
   var moveDiv = obj.parentNode; 
   moveDiv.style.left = (oLeft + event.clientX - oX) + "px"; 
   moveDiv.style.top = (oTop + event.clientY - oY) + "px"; 
   } 
}

//拖移结束调用动画 
function endMove() 
{ 
   if (eventType == "move") 
   { 
   divClone.childNodes[1].releaseCapture(); 
             move(parseInt(divClone.style.left), parseInt(divClone.style.top)); 
   eventType = ""; 
   } 
}

//移动的动画 
function move(aimLeft, aimTop) 
{ 
   var nowLeft = parseInt(oDiv.style.left); 
   var nowTop = parseInt(oDiv.style.top); 
   var moveSize = 30; 
   if (nowLeft > aimLeft + moveSize || nowLeft < aimLeft - moveSize || nowTop > aimTop + moveSize || nowTop < aimTop - moveSize) 
   { 
   oDiv.style.left = aimLeft > nowLeft + moveSize ? (nowLeft + moveSize) + "px" : aimLeft < nowLeft - moveSize ? (nowLeft - moveSize) + "px" : nowLeft + "px"; 
   oDiv.style.top = aimTop > nowTop + moveSize ? (nowTop + moveSize) + "px" : aimTop < nowTop - moveSize ? (nowTop - moveSize) + "px" : nowTop + "px"; 
   oTime = setTimeout("move(" + aimLeft + ", " + aimTop + ")", 1); 
   } 
   else 
   { 
   oDiv.style.left = divClone.style.left; 
   oDiv.style.top = divClone.style.top; 
   divClone.parentNode.removeChild(divClone); 
   divClone == null; 
   } 
}

//clone调整大小的节点 
function setResize(obj) 
{ 
   if (event.button == 1) 
   { 
   if (oTime) 
   { 
     clearTimeout(oTime); 
     divClone.parentNode.removeChild(divClone); 
   } 
   oDiv = obj.parentNode; 
   divClone = oDiv.cloneNode(true); 
   divClone.style.filter = "Alpha(opacity=50)"; 
   divClone.childNodes[4].setAttribute("onmousemove", function(){startResize(this)}); 
   divClone.childNodes[4].setAttribute("onmouseup", function(){endResize()}); 
   oX = parseInt(event.clientX); 
   oY = parseInt(event.clientY); 
   oWidth = parseInt(divClone.style.width); 
   oHeight = parseInt(divClone.style.height); 
   document.body.appendChild(divClone); 
   divClone.childNodes[4].setCapture(); 
   eventType = "resize"; 
   } 
}

//拖动调整大小 
function startResize(obj) 
{ 
   if (eventType == "resize" && event.button == 1) 
   { 
   var nX = event.clientX; 
   var nY = event.clientY; 
   if (nX > oX - oWidth && nY > oY - oHeight + 40) 
   { 
     var resizeDiv = obj.parentNode; 
     resizeDiv.style.width = (oWidth + event.clientX - oX) + "px"; 
     resizeDiv.style.height = (oHeight + event.clientY - oY) + "px"; 
     resizeDiv.childNodes[3].style.height = (parseInt(resizeDiv.style.height) - 40) + "px"; 
   } 
   } 
}

//调整大小结束 
function endResize() 
{ 
   if (eventType == "resize") 
   { 
   divClone.childNodes[4].releaseCapture(); 
             resize(parseInt(divClone.style.width), parseInt(divClone.style.height)); 
   eventType = ""; 
   } 
}

//调整大小的动画 
function resize(aimWidth, aimHeight) 
{ 
   var nowWidth = parseInt(oDiv.style.width); 
   var nowHeight = parseInt(oDiv.style.height); 
   var resizeSize = 30; 
   if (nowWidth > aimWidth + resizeSize || nowWidth < aimWidth - resizeSize || nowHeight > aimHeight + resizeSize || nowHeight < aimHeight - resizeSize) 
   { 
   oDiv.style.width = aimWidth > nowWidth + resizeSize ? (nowWidth + resizeSize) + "px" : aimWidth < nowWidth - resizeSize ? (nowWidth - resizeSize) + "px" : nowWidth + "px"; 
   oDiv.style.height = aimHeight > nowHeight + resizeSize ? (nowHeight + resizeSize) + "px" : aimHeight < nowHeight - resizeSize ? (nowHeight - resizeSize) + "px" : nowHeight + "px"; 
   oDiv.childNodes[3].style.height = (parseInt(oDiv.style.height) - 40) + "px"; 
   oTime = setTimeout("resize(" + aimWidth + ", " + aimHeight + ")", 1); 
   } 
   else 
   { 
   oDiv.style.width = divClone.style.width; 
   oDiv.style.height = divClone.style.height; 
   oDiv.childNodes[3].style.height = (parseInt(oDiv.style.height) - 40) + "px"; 
   divClone.parentNode.removeChild(divClone); 
   divClone == null; 
   } 
}

//关闭DIV 
function eCloseDiv() 
{ 
   if (div) 
   { 
   div.parentNode.removeChild(div); 
   var ipt = document.getElementsByTagName("input"); 
   for(var i = 0; i < ipt.length; i++) 
   { 
     ipt[i].disabled = false; 
   } 
   div = null; 
   } 
}

//保留位置和大小 
function saveDiv() 
{ 
   if (div) 
   { 
   saveLeft = div.style.left; 
   saveTop = div.style.top; 
   saveWidth = div.style.width; 
   saveHeight = div.style.height; 
   alert("保留成功!"); 
   } 
}

//快捷键 
document.onkeydown = function() 
{ 
   event.keyCode == 27 ? eCloseDiv() : null;   //Esc快捷键 
   event.ctrlKey && (event.keyCode == 83 || event.keyCode == 115) ? saveDiv() : null; //ctrl+s保存位置 
   event.ctrlKey && event.keyCode == 13 ? setDiv() : null //ctrl+enter打开Div 
   !event.ctrlKey && (event.keyCode == 37 || event.keyCode == 38 || event.keyCode == 39 || event.keyCode == 40) ? arrowMove(event.keyCode) : null; 
   event.ctrlKey && (event.keyCode == 37   || event.keyCode == 38 || event.keyCode == 39 || event.keyCode == 40) ? arrowResize(event.keyCode) : null; 
}

//上下左右箭头移动div 
function arrowMove(eKeyCode) 
{ 
   if (div) 
   { 
   var isMove = document.getElementById("isMove").checked; 
   if (isMove) 
   { 
     switch(eKeyCode) 
     { 
     case 37: 
       div.style.left = (parseInt(div.style.left) - 1) + "px"; //left 
       break 
     case 38: 
       div.style.top = (parseInt(div.style.top) - 1) + "px"; //up 
       break 
     case 39: 
       div.style.left = (parseInt(div.style.left) + 1) + "px"; //right 
       break 
     case 40: 
       div.style.top = (parseInt(div.style.top) + 1) + "px"; //down 
       break 
     } 
   } 
   } 
}

//ctrl+上下左右箭头调整div大小 
function arrowResize(eKeyCode) 
{ 
   if (div) 
   { 
   var isResize = document.getElementById("isResize").checked; 
   if (isResize) 
   { 
     switch(eKeyCode) 
     { 
     case 37: 
       div.style.width = (parseInt(div.style.width) - 1) + "px"; //left 
       break 
     case 38: 
       div.style.height = (parseInt(div.style.height) - 1) + "px"; //up 
       break 
     case 39: 
       div.style.width = (parseInt(div.style.width) + 1) + "px"; //right 
       break 
     case 40: 
       div.style.height = (parseInt(div.style.height) + 1) + "px"; //down 
       break 
     } 
   } 
   } 
} 
</script> 
<body> 
<p> 
<input type="checkbox" id="isMove" /><label for="isMove">可移动</label>     
<input type="checkbox" id="isResize" /><label for="isResize">可调整大小</label>     
</p> 
   
<p> 
<input type="radio" name="radio" id="radio1" checked /><label for="radio1">默认居中打开</label>     
<input type="radio" name="radio" id="radio2" /><label for="radio2">保留位置上打开</label> 
</p> 
<p><a href="javascript:setDiv()">打开DIV</a></p> 
<p style="font-weight: bold">操作说明:</p> 
<ol> 
<li> 
   选中复选框(可移动、可调整大小)后,打开的DIV具有移动/调整大小的功能(此时移动/调整大小快捷键可使用);<br> 
   反之,不可移动/调整大小(此时移动/调整大小快捷键无效) 
</li> 
<li> 
   单选框默认居中打开选中,无论有无保存DIV位置和大小均以默认位置及大小打开DIV 
</li> 
<li> 
   单选框保留位置上打开选中,如果未发现保存记录以默认方式打开,否则以保存的位置及大小打开 
</li> 
<li> 
   如果选中可移动后,鼠标经过标题位置(蓝色背景)处会变成移动的图标,此时按住鼠标左键会产生一个半透明的DIV,按住鼠标不动拉动此半透明DIV会跟随移动,释放鼠标左键后会产生一段原始位置移动至半透明位置的动画,当动画重叠时,半透明的DIV将回收。 
</li> 
<li> 
   如果选中可调整大小后,鼠标经过整个DIV的最右下角处会变成伸缩的图标,此时按住鼠标左键会产生一个半透明的DIV,按住鼠标不动拉动此半透明DIV会随着移动而调整大小,释放鼠标左键后会产生一段原始大小伸缩至半透明大小的动画,当动画重叠时,半透明的DIV将回收。 
</li> 
<li> 
   DIV的右上角有关闭按钮,按下后DIV将remove 
</li> 
</ol> 
<p style="font-weight: bold"> 
快捷键说明: 
<ol> 
<li> 
   Ctrl + Enter : 打开div 
</li> 
<li> 
   Ctrl + s(大小写均可) : 保存div的大小和位置 
</li> 
<li> 
   上下左右箭头 : 轻移div位置 
</li> 
<li> 
   Ctrl + 上下左右箭头 : 轻调div大小 
</li> 
<li> 
   Esc : 关闭Div 
</li> 
</ol> 
</p> 
</body> 
</html>

 

 

标签:style,拖动,divClone,例子,var,div,event,parseInt
From: https://blog.51cto.com/u_16255870/7535802

相关文章

  • Educational Codeforces Round 154 (Rated for Div. 2) A-D
    传送门:edu154/div2A.PrimeDeletion题意:给定一个0-9的排列,要求一个长度>=2的子序列,使得该子序列是质数做法:考虑31或者13即可。不过当时没有立刻想到,感觉1000以内的质数必有答案,打了暴力。用时就多了点。Code#include<bits/stdc++.h>usingnamespacestd;intpri[10......
  • CF1870 div1+div2做题记录
    A题面挺蠢的,无解条件为\(n<k\)或\(x<k-1\),即\(\mathop{\mathrm{mex}}\not=k\)。先选\(0\simk-1\),再选能选的最大值,当\(x=k\),选\(x-1\),否则选\(x\)。点击查看代码#include<bits/stdc++.h>#defineullunsignedlonglong#definelllonglong#definepiipai......
  • 类型转换及例子
    publicclassDome04{publicstaticvoidmain(String[]args){inti=128;//byteb=(byte)i;//内存溢出doubleb=i;//强制转换(类型)变量名高到低需要强制转换//自动转换低到高System.out.println(i);......
  • CodeTON Round 6 (Div. 1 + Div. 2)( A-D )
    A.MEXanizedArray下次还得得签快一点,嘉心糖4分就过了思路一个简单的讨论nkx之间关系就行完整代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglonginlineintread(){ints=0,w=1;charg=getchar();while(g>'9'||g<'0'){if(g=......
  • 两个例子带你入门 Disruptor
    Disruptor是英国外汇交易公司LMAX开发的一个高性能队列。很多知名开源项目里,比如canal、log4j2、storm都是用了Disruptor以提升系统性能。这篇文章,我们通过两个例子一步一个脚印帮助同学们入门Disruptor。1环形缓冲区下图展示了Disruptor的流程图。和线程池......
  • CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!)(A-D)
    CodeTONRound6(Div.1+Div.2,Rated,Prizes!)A.让你找mex为k的n个数,这n个数从0-x,问n个数的和最大值是多少先判断不行的。然后行的肯定有0-k-1,剩下还有就选x就行。查看代码#include<iostream>usingnamespacestd;typedeflonglongll;voidsolve(){ intn,k,x;......
  • cf1869 div.1,div.2做题记录
    赛时总结div.2A题面对于任意一个区间,我们可以通过一次操作将区间内的数变得全部相同。如果区间内的全部数都相同,那么我们再做一遍区间操作,当这个区间长度为偶数时,区间异或和为\(0\),会清空区间;当区间长度为奇数时,区间内的数不会发生改变。但我们可以将一个长度为奇数的区间拆成......
  • Go比Python快多少倍?请看一个简单的例子
    需求两个0-10000的数组,循环遍历两个数组,获取两个元素,打印出乘积为56213的所有元素Python实现importdatetimes=datetime.datetime.now()foriinrange(10000):forjinrange(10000):ifi*j==56213:print(f"{i}*{......
  • ALV data_change事件例子2
    programztest_bcalv_edit_03.*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&a......
  • Codeforces Round 897 (Div. 2) A-E
    A.green_gold_dog,arrayandpermutation题意:给出一个长为\(n\)的数组\(a\),找到一个长为\(n\)的排列\(b\),使得\(a\)与\(b\)对应位置上的元素的差尽可能大Solution将数组\(a\)排序,然后令排列\(n,n-1,...,2,1\)对应到对应的元素即可structnode{intx,id;boolope......