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关于页面焦点的定位(文本框获取焦点时改变样式 )
Sep 10 Javascript
js怎么终止程序return不行换jfslk
May 30 Javascript
深入领悟JavaScript中的面向对象
Nov 18 Javascript
jquery中的查找parents与closest方法之间的区别
Dec 02 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
Dec 19 Javascript
jquery中使用循环下拉菜单示例代码
Sep 24 Javascript
JS查找英文文章中出现频率最高的单词
Mar 20 Javascript
js实现自动图片轮播代码
Mar 22 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
Jun 08 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
Sep 08 Javascript
JS操作JSON常用方法(10w阅读)
Dec 06 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 Vue.js
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
php 文件缓存函数
2011/10/08 PHP
探讨如何在php168_cms中提取验证码
2013/06/08 PHP
php缓冲 output_buffering的使用详解
2013/06/13 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
PHP简单实现断点续传下载的方法
2015/09/25 PHP
url 特殊字符 传递参数解决方法
2010/01/01 Javascript
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
JS俄罗斯方块,包含完整的设计理念
2010/12/11 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
浅谈javascript事件取消和阻止冒泡
2015/05/26 Javascript
AngularJS控制器之间的数据共享及通信详解
2016/08/01 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
2017/05/09 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
angular2模块和共享模块详解
2018/04/08 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
2019/11/01 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
Python日志模块logging简介
2015/04/13 Python
Python 含参构造函数实例详解
2017/05/25 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
HTML5实现应用程序缓存(Application Cache)
2020/06/16 HTML / CSS
康拓普公司Java笔面试
2016/09/23 面试题
税务干部鉴定材料
2014/02/11 职场文书
工地安全质量标语
2014/06/07 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
教师远程研修感悟
2015/11/18 职场文书