原文地址为: 纯js操作div移动

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
 <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>&nbsp;&nbsp;&nbsp;
 <input type="checkbox" id="isResize" /><label for="isResize">可调整大小</label>&nbsp;&nbsp;&nbsp;
</p>
 
<p>
 <input type="radio" name="radio" id="radio1" checked /><label for="radio1">默认居中打开</label>&nbsp;&nbsp;&nbsp;
 <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>

转载请注明本文地址: 纯js操作div移动

纯js操作div移动相关推荐

  1. js纯ajax,自动完成JS类(纯JS, Ajax模式)

    自动完成JS类(纯JS, Ajax模式) 更新时间:2009年03月12日 23:51:15   作者: 自动完成JS类,用户体验较好.封装成类,方便使用.本站 一. 封装的JS文件 //****** ...

  2. 纯js实现瀑布流布局及ajax动态新增数据

    本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax ...

  3. 纯js封装一个多功能弹出框

    不借助其它的css代码和图片资源,可直接调用. 原创内容,请勿转载. 注意,不要直接复制文章里的封装代码,因为编辑器的原因,无论怎么编辑,它还是给修改了代码.文末提供了封装代码的下载地址(无需积分) ...

  4. 【转载】常备JS操作

    常备JS操作 转自:http://www.cfcodes.com/?ID=221 //事件源对象 event.srcElement.tagName event.srcElement.type //捕获 ...

  5. vuejs项目纯js导出word、在线下载富文本内容或者网页另存为word文件

    所有前端导入导出方法集合: 前端必备技能知识:JS导出Blob流文件为Excel表格.Vue.js使用Blob的方式实现excel表格的下载(流文件下载)_勤动手多动脑少说多做厚积薄发-CSDN博客_ ...

  6. js 操作元素属性、操作元素样式、display(none、block)

    js操作元素属性 <!DOCTYPE html> <html lang="en"> <head><meta charset="U ...

  7. vuejs项目前端纯js在线下载网页内容保存为自定义格式的word文件、另存为word文件

    所有前端导入导出方法集合: 前端必备技能知识:JS导出Blob流文件为Excel表格.Vue.js使用Blob的方式实现excel表格的下载(流文件下载)_勤动手多动脑少说多做厚积薄发-CSDN博客_ ...

  8. Electron中使用sql.js操作SQLite数据库

    推荐sql.js--一款纯js的sqlite工具. 一.关于sql.js sql.js(https://github.com/kripken/sql.js)通过使用Emscripten编译SQLite ...

  9. html5网页怎么实现内容追加,纯js实现网页内容复制后自动追加自定义内容

    网页操作内容复制内容后纯js实现监听自动追加自定义内容 不少网站技术或者博客上有这样的处理,当我们复制代码的时候,会自动加上一段本信息版权为XXXX,这是怎么实现的呢? 其实实现的方式很简单,可以在我 ...

最新文章

  1. Android Studio 的安装笔记
  2. 网站图片如何优化才对排名有所提升呢?
  3. Flowable节点跳转
  4. WPF 中使用附加属性,将任意 UI 元素或控件裁剪成圆形(椭圆)
  5. [机器学习] LightGBM on Spark (MMLSpark) 使用完全手册
  6. IE8采用IE7模式
  7. LCS-最大公共子序列(DP问题)
  8. Server Transport model
  9. android gradle时间长,Android Studio gradle需要很长时间才能构建
  10. SPI 机制-插件化扩展功能
  11. 机床数控改造控制系统设计(微型计算机),简易数控车床的微机控制系统软件
  12. 竞品分析 | 荔枝VS喜马拉雅FM:有声音频APP的发展与社交
  13. Git 删除提交\commit的log记录、修改历史提交消息、删除历史提交、修改所有提交的邮箱地址、从所有提交中删除一个文件
  14. word 分栏后转html,word分栏后怎么到另一栏
  15. 【电商界的屠龙者-拼多多】——“拼多多”竞品分析
  16. 安卓之父带来一款超长“带鱼”手机
  17. 联发科p60和骁龙710哪个好_骁龙670、联发科P60和麒麟710哪个好 详细对比介绍
  18. substance painter学习2——新建项目
  19. [转] volatile关键字解析
  20. 鸿蒙音响怎么调,专业音响师必知的EQ调整小技巧

热门文章

  1. 基于IOS平台的游戏之打地鼠
  2. DNS查找域名的过程
  3. 全球《开眼设计周刊》· 2020 第二期
  4. 利用.frm、.ibd恢复数据
  5. 21天好习惯 第9天
  6. 乐彼多语言网上商城系统 0day
  7. 打印word文档时遇到标记区如何取消
  8. 怎么用c语言画出坐标曲线,c语言曲线的画法-c语言每天进步一点点(2)
  9. MCU普通GPIO与高速GPIO的差异
  10. 如何借助 AI ,生成专属图标? #iconify AI