自己封装的一个原生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 相关文章推荐
jQuery新闻滚动插件 jquery.roller.js
Jun 27 Javascript
javascript:history.go()和History.back()的区别及应用
Nov 25 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
Feb 22 Javascript
js关于精确计算和数值格式化以及直接引js文件
Jan 28 Javascript
简单的JavaScript互斥锁分享
Feb 02 Javascript
javascript实现动态改变层大小的方法
May 14 Javascript
原生js实现class的添加和删除简单代码
Jul 12 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
Feb 12 Javascript
vue-router路由简单案例介绍
Feb 21 Javascript
JavaScript数组_动力节点Java学院整理
Jun 26 Javascript
JavaScript数组去重算法实例小结
May 07 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
Jun 11 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
php实现产品加入购物车功能(1)
2020/07/23 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
javascript AutoScroller 函数类
2009/05/29 Javascript
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
JS将秒换成时分秒实现代码
2013/09/03 Javascript
基于jquery实现图片上传本地预览功能
2016/01/08 Javascript
jQuery右下角悬浮广告实例
2016/10/17 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
简单实现bootstrap选项卡效果
2017/02/08 Javascript
详解Node.js项目APM监控之New Relic
2017/05/12 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
2017/07/20 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
spark: RDD与DataFrame之间的相互转换方法
2018/06/07 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
python中复数的共轭复数知识点总结
2020/12/06 Python
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
《一株紫丁香》教学反思
2014/02/19 职场文书
财产公证书
2014/04/10 职场文书
机关党建工作汇报材料
2014/08/20 职场文书
面试复试通知单
2015/04/24 职场文书
《倍数和因数》教学反思
2016/02/23 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
mysql部分操作
2021/04/05 MySQL
Python字符串常规操作小结
2022/04/03 Python
vue 给数组添加新对象并赋值
2022/04/20 Vue.js