javascript实现dom元素可拖动


Posted in Javascript onMarch 21, 2016

摘要:

最近在项目中要做一个图片预览的功能,这时候会遇到用户上传很大的图片,已经超出视图界面。最终决定做一个在固定宽和高的位置,用户可以拖动图片查看。所以自己就写了一个支持ie5+,chrome,Firefox,opera等浏览器的可拖动dom元素的插件。

实现这个功能所需要的知识点不多,如下:

1、js中element.style.left

style.left返回的变量是个字符串,是个可改变量

      js中element.offsetLeft

offsetLeft返回的是个int类型,不可改变量(意思就是说,改这个变量是不会影响布局的)

2、js 中event.clientX

clientX 事件属性返回当事件被触发时鼠标指针向对于浏览器页面(或客户区)的水平坐标。

3、js中element.className

改变样式的类的方法

以上三点都是些比较熟的知识了,想说的是以下这点:

4、js中为对象添加事件监控

element.addEventListener("event","fun","boolen");

event:表示事件

fun:指的是事件触发后执行的函数

项目地址:https://github.com/baixuexiyang/drag

实例:

var drag = new Drag("test", {
      onStart: function(){

      },
      onMove: function(){
        document.getElementById('position').innerHTML = '距离左边:' + drag.getPositions().left + ';距离顶部:' + drag.getPositions().top;
      },
      onStop: function(){

      }
    });

我们再开看一个实例中遇到的问题,这个问题我弄了好久都找不出很好的解决方法

我们来看个例子:(方便测试,我把代码写在一个文件里面 )

drag.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
  <title>鼠标拖拽</title> 
  <style type="text/css"> 
    <!-- 
    #dragdiv{ 
      background-color:#0A0909; 
      height:200px; 
      width:157px; 
     
      position:absolute; 
    } 
    .ondrag{ 
      filter:alpha(opacity=200); 
      cursor:move; 
    } 
    .enddrag{ 
      filter:alpha(opacity=100); 
      cursor:default; 
    } 
    #father{ 
      width:600px; 
      height:700px; 
      background:#C63535; 
    } 
    --> 
  </style> 
</head> 
<body> 
  <div id="father"> 
  <div id="dragdiv"></div> 
  </div> 
  <script language="JavaScript"> 
    var dragdiv=document.getElementById("dragdiv"); 
    var father=document.getElementById("father"); 
    var offsetx=0; 
    var offsety=0; 
    var draging=false; 
    function beforeDrag(ev){ 
       
        if (!draging) { 
          draging = true; 
          var l = dragdiv.offsetLeft; 
          var t = dragdiv.offsetTop; 
          offsetx = ev.clientX - l; 
          offsety = ev.clientY - t; 
           
        } 
        else { 
          dragdiv.className = "enddrag"; 
          dragdiv.removeEventListener("mousemove",onDrag); 
          draging = false; 
          return; 
        } 
       
    } 
    function endDrag(){ 
      draging=false; 
      dragdiv.className="enddrag"; 
    } 
    function onDrag(ev){ 
      if (!draging) { 
        dragdiv.className = "enddrag"; 
        return; 
      } 
      else { 
        dragdiv.className = "ondrag"; 
       
        dragdiv.style.left = (ev.clientX - offsetx) + "px"; 
        dragdiv.style.top = (ev.clientY - offsety) + "px"; 
         
      } 
    } 
      dragdiv.addEventListener("mousedown",beforeDrag,true); 
      dragdiv.addEventListener("mousemove",onDrag,false); 
      dragdiv.addEventListener("mouseup",endDrag,true); 
 
  </script> 
 
</body> 
 
</html>

代码很简单,肯用一点点心看的话,都能看懂了

第一次拖拽很成功,按住鼠标进行拖。第二次就不正常了,要想第二次正常,必须鼠标点一下其他地方(就是非拖拽部分)

上面的鼠标事件

"mousedown”是指按下鼠标时触发此事件,(上面触发了beforeDrag函数)

"mousemove"指鼠标移动时触发此事件,(上面触发了onDrag函数)

"mouseup"指鼠标按下后松开鼠标时触发此事件。(上面触发了endDrag函数)

ps:网上查的鼠标时间是"onmousedown",笔者实验"onmousedown"没有事件响应,"mousedowm"才正常

上面所说的问题,尝试了很多实验,考虑到了addEventListener的顺序问题,第三个参数true/false的事件流问题,还是没有找到完美的解决方法

"mouseup"事件在第二次监控就失败了,重新获取焦点才正常(就是鼠标点一下其他地方)

Javascript 相关文章推荐
JavaScript版代码高亮
Jun 26 Javascript
jquery下json数组的操作实现代码
Aug 09 Javascript
解析页面加载与js函数的执行 onload or ready
Dec 12 Javascript
js使用eval解析json实例与注意事项分享
Jan 18 Javascript
js 左右悬浮对联广告代码示例
Dec 12 Javascript
jQuery动画效果图片轮播特效
Jan 12 Javascript
JavaScript中的ajax功能的概念和示例详解
Oct 17 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
Oct 30 Javascript
vue下载excel的实现代码后台用post方法
May 10 Javascript
vue iview多张图片大图预览、缩放翻转
Jul 13 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
Feb 24 Javascript
JavaScript组合模式---引入案例分析
May 23 Javascript
AngularJS 中的指令实践开发指南(一)
Mar 20 #Javascript
浅析AngularJS中的指令
Mar 20 #Javascript
简述Matlab中size()函数的用法
Mar 20 #Javascript
详解Matlab中 sort 函数用法
Mar 20 #Javascript
Sort()函数的多种用法
Mar 20 #Javascript
简单理解JavaScript中的封装与继承特性
Mar 19 #Javascript
JavaScript的函数式编程基础指南
Mar 19 #Javascript
You might like
合作指挥官:孟斯克
2020/03/16 星际争霸
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
PHP中比较时间大小实例
2014/08/21 PHP
PHP中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
2013/08/05 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
详解vue-router和vue-cli以及组件之间的传值
2017/07/04 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
2018/10/19 Javascript
VUE搭建手机商城心得和遇到的坑
2019/02/21 Javascript
微信公众号平台接口开发 菜单管理的实现
2019/08/14 Javascript
python使用win32com在百度空间插入html元素示例
2014/02/20 Python
python访问类中docstring注释的实现方法
2015/05/04 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
python中map的基本用法示例
2018/09/10 Python
python 同时运行多个程序的实例
2019/01/07 Python
将python文件打包成EXE应用程序的方法
2019/05/22 Python
Python中调用其他程序的方式详解
2019/08/06 Python
python怎么判断模块安装完成
2020/06/19 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
西班牙著名的珠宝首饰品牌:P D PAOLA
2018/09/15 全球购物
市场营销专业个人自荐信格式
2013/09/21 职场文书
物流管理专业大学生自荐信
2013/10/04 职场文书
银行开业庆典方案
2014/02/06 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
音乐教师个人总结
2015/02/06 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
婚礼嘉宾致辞
2015/07/28 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android