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 Prototype对象
Jan 07 Javascript
JavaScript 大数据相加的问题
Aug 03 Javascript
通过正则格式化url查询字符串实现代码
Dec 28 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
Feb 08 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
Dec 12 Javascript
JS日程管理插件FullCalendar简单实例
Feb 07 Javascript
详解Vue使用 vue-cli 搭建项目
Apr 20 Javascript
Javascript循环删除数组中元素的几种方法示例
May 18 Javascript
AngularJS 支付倒计时功能实现思路
Jun 05 Javascript
angular2系列之路由转场动画的示例代码
Nov 09 Javascript
vue中子组件传递数据给父组件的讲解
Jan 27 Javascript
Js图片点击切换轮播实现代码
Jul 27 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
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
Linux下php5.4启动脚本
2014/08/03 PHP
cnblogs TagCloud基于jquery的实现代码
2010/06/11 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
JS实现在状态栏显示打字效果完整实例
2015/11/02 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
js实现随机抽选效果、随机抽选红色球效果
2017/01/13 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
VUE实现移动端列表筛选功能
2019/08/23 Javascript
vue递归获取父元素的元素实例
2020/08/07 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
名片管理系统python版
2018/01/11 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
Python Django Cookie 简单用法解析
2019/08/13 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
html5的新增的标签和废除的标签简要概述
2013/02/20 HTML / CSS
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
狼和鹿教学反思
2014/02/05 职场文书
一年级班主任感言
2014/03/08 职场文书
银行贷款承诺书
2014/03/29 职场文书
2015年人事专员工作总结
2015/04/29 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
销区经理年终述职报告模板
2019/11/28 职场文书
浅谈Python响应式类库RxPy
2021/06/14 Python