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 相关文章推荐
jQuery 页面 Mask实现代码
Jan 09 Javascript
JQuery each()函数如何优化循环DOM结构的性能
Dec 10 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
Mar 05 Javascript
Javascript中的几种URL编码方法比较
Jan 23 Javascript
JQuery动画与特效实例分析
Feb 02 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
Oct 15 Javascript
JavaScript 中 avalon绑定属性总结
Oct 19 Javascript
详解Vue.js搭建路由报错 router.map is not a function
Jun 27 Javascript
使用InstantClick.js让页面提前加载200ms
Sep 12 Javascript
JS动态插入脚本和插入引用外部链接脚本的方法
May 21 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
Aug 08 jQuery
jquery实现上传文件进度条
Mar 26 jQuery
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
将数组写入txt文件 var_export
2009/04/21 PHP
PHP实现时间轴函数代码
2011/10/08 PHP
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
PHP程序员的技术成长规划
2016/03/25 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
jQuery filter函数使用方法
2014/05/19 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
Vuejs第十篇之vuejs父子组件通信
2016/09/06 Javascript
原生js实现addclass,removeclass,toggleclasss实例
2016/11/24 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
从0到1构建vueSSR项目之路由的构建
2019/03/07 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
2019/05/21 Javascript
Vue侦测相关api的实现方法
2019/05/22 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
JavaScript实现网页下拉菜单效果
2020/11/20 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
Python struct模块解析
2014/06/12 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
django用户登录和注销的实现方法
2018/07/16 Python
浅析PEP572: 海象运算符
2019/10/15 Python
python的pyecharts绘制各种图表详细(附代码)
2019/11/11 Python
浅谈Python type的使用
2019/11/19 Python
Python操作Jira库常用方法解析
2020/04/10 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
中学生勤俭节约倡议书
2015/04/29 职场文书
工作后的感想
2015/08/07 职场文书
2016年度创先争优活动总结
2016/04/05 职场文书