自己封装的一个原生JS拖动方法(推荐)


Posted in Javascript onNovember 22, 2016

代码:

function drag(t,p){

  var point = p || null,
    target = t || null,
    resultX = 0,
    resultY = 0;

  (!point)? point = target : ''; //如果没有拖动点,则拖动点默认为整个别拖动元素

  function getPos(t){
    var offsetLeft = 0,
      offsetTop = 0,
      offsetParent = t;

    while(offsetParent){
      offsetLeft+=offsetParent.offsetLeft;
      offsetTop+=offsetParent.offsetTop;
      offsetParent = offsetParent.offsetParent;
    }

    return {'top':offsetTop,'left':offsetLeft};
  }

  function core(){

    var width = document.body.clientWidth || document.documentElement.clientWidth,
      height = document.body.clientHeight || document.documentElement.clientHeight; 
      maxWidth = width - target.offsetWidth,
      maxHeight = height - target.offsetHeight;

    (resultX >= maxWidth)? target.style.left = maxWidth+'px' : (resultX > 0)?target.style.left = resultX +'px': ''; //重置默认位置。
    (resultY >= maxHeight)?  target.style.top = maxHeight +'px' : (resultY > 0)?target.style.top = resultY +'px':''; //重置默认位置。

    point.onmousedown=function(e){  
      var e = e || window.event,
        coordX = e.clientX,
        coordY = e.clientY,
        posX = getPos(target).left,
        posY = getPos(target).top;

      point.setCapture && point.setCapture();  //将Mouse事件锁定到指定元素上。
      document.onmousemove=function(e){

        var ev = e || window.event,
          moveX = ev.clientX,
          moveY = ev.clientY;

        resultX = moveX - (coordX - posX); //结果值是坐标点减去被拖动元素距离浏览器左侧的边距
        resultY = moveY - (coordY - posY);

        (resultX > 0 )?((resultX < maxWidth)?target.style.left = resultX+'px' : target.style.left = maxWidth+'px') : target.style.left = '0px'; 
        (resultY > 0 )?((resultY < maxHeight)?target.style.top = resultY+'px' : target.style.top = maxHeight+'px') : target.style.top = '0px'; 

        ev.stopPropagation && ev.stopPropagation(); 
        ev.preventDefault;
        ev.returnValue = false;
        ev.cancelBubble = true;
      };
    };
    document.onmouseup=function(){  // 解决拖动时,当鼠标指向的DOM对象非拖动点元素时,无法触发拖动点的onmousedown的BUG。
      document.onmousemove = null;  
      point.releaseCapture && point.releaseCapture();  // 将Mouse事件从指定元素上移除。
    };
    point.onmouseup=function(e){
      var e = e || window.event;
      document.onmousemove = null;
      point.releaseCapture && point.releaseCapture();
    };
  }
  core();
  window.onresize = core;  
}

使用方式:

drag(t,p)
/* 
 * 说明 
 * t 表示被拖动的元素
 * p 表示拖动点
*/

// 注意:如果省略拖动点,默认可拖动的区域是整个被拖动元素

以上就是小编为大家带来的自己封装的一个原生JS拖动方法(推荐)全部内容了,希望大家多多支持三水点靠木~

Javascript 相关文章推荐
JS防止用户多次提交的简单代码
Aug 01 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
Dec 09 Javascript
Three.js学习之文字形状及自定义形状
Aug 01 Javascript
Angular的模块化(代码分享)
Dec 26 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
Dec 27 Javascript
详解webpack解惑:require的五种用法
Jun 09 Javascript
详解vue2父组件传递props异步数据到子组件的问题
Jun 29 Javascript
vue安装和使用scss及sass与scss的区别详解
Oct 15 Javascript
关于Vue源码vm.$watch()内部原理详解
Apr 26 Javascript
vue transition 在子组件中失效的解决
Nov 12 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
Aug 31 Javascript
Javascript数组及类数组相关原理详解
Oct 29 Javascript
SelecT下拉框选中和取值的解决方法
Nov 22 #Javascript
javascript入门之window对象【新手必看】
Nov 22 #Javascript
AngularJS实现DOM元素的显示与隐藏功能
Nov 22 #Javascript
JavaScript ES6中CLASS的使用详解
Nov 22 #Javascript
AngularJS实现ajax请求的方法
Nov 22 #Javascript
js数组操作方法总结(必看篇)
Nov 22 #Javascript
jQ处理xml文件和xml字符串的方法(详解)
Nov 22 #Javascript
You might like
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
Javascript 模式实例 观察者模式
2009/10/24 Javascript
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
纯js分页代码(简洁实用)
2013/11/05 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
2016/08/10 Javascript
JS调用Android、Ios原生控件
2017/01/06 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
BootStrap Fileinput上传插件使用实例代码
2017/07/28 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
javascript实现固定侧边栏
2021/02/09 Javascript
跟老齐学Python之用Python计算
2014/09/12 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
python实现Dijkstra静态寻路算法
2019/01/17 Python
Python 移动光标位置的方法
2019/01/20 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
浅谈利用缓存来优化HTML5 Canvas程序的性能
2015/05/12 HTML / CSS
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
大学生应聘自荐信
2013/10/11 职场文书
财务出纳员岗位职责
2013/11/26 职场文书
大家检讨书5000字
2014/02/03 职场文书
年级组长自我鉴定
2014/02/22 职场文书
服装采购员岗位职责
2014/03/15 职场文书
暑期社会实践先进个人主要事迹
2014/05/22 职场文书
大学生应聘求职信
2014/05/26 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书