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实现单继承和多继承的简单方法
Mar 29 Javascript
JS Loading功能的简单实现
Nov 29 Javascript
查找Oracle高消耗语句的方法
Mar 22 Javascript
一个Action如何调用两个不同的方法
May 22 Javascript
AngularJs上传前预览图片的实例代码
Jan 20 Javascript
js生成word中图片处理方法
Jan 06 Javascript
利用js给datalist或select动态添加option选项的方法
Jan 25 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
Jul 26 Javascript
详解如何制作并发布一个vue的组件的npm包
Nov 10 Javascript
详解如何使用router-link对象方式传递参数?
May 02 Javascript
vue中对象数组去重的实现
Feb 06 Javascript
vue flex 布局实现div均分自动换行的示例代码
Aug 05 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
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
php xml实例 留言本
2009/03/20 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
因str_replace导致的注入问题总结
2019/08/08 PHP
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
2017/04/22 Javascript
Vue制作Todo List网页
2017/04/26 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
JavaScript 严格模式(use strict)用法实例分析
2020/03/04 Javascript
Python简单日志处理类分享
2015/02/14 Python
python 第三方库的安装及pip的使用详解
2017/05/11 Python
详解Python pygame安装过程笔记
2017/06/05 Python
python通过百度地图API获取某地址的经纬度详解
2018/01/28 Python
python组合无重复三位数的实例
2018/11/13 Python
实例讲解Python3中abs()函数
2019/02/19 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
pygame实现五子棋游戏
2019/10/29 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
MySQL面试题
2014/01/12 面试题
挖掘机司机岗位职责
2014/02/12 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
保密承诺书
2014/03/27 职场文书
社会治安综合治理管理责任书
2014/04/16 职场文书
创文明城市标语
2014/06/16 职场文书
Python实现8种常用抽样方法
2021/06/27 Python