自己封装的一个原生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打造支持汉字,拼音,英文快速定位查询的超级select插件
Jun 18 Javascript
js离开或刷新页面检测(且兼容FF,IE,Chrome)
Mar 05 Javascript
带你了解session和cookie作用原理区别和用法
Aug 14 Javascript
微信小程序使用request网络请求操作实例
Dec 15 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
Jan 13 Javascript
webpack 单独打包指定JS文件的方法
Feb 22 Javascript
JavaScript学习笔记之数组基本操作示例
Jan 09 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
Jan 14 Javascript
Layui 解决表格异步调用后台分页的问题
Oct 26 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
Mar 25 Javascript
three.js欧拉角和四元数的使用方法
Jul 26 Javascript
详解JSON.parse和JSON.stringify用法
Feb 18 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比较两个绝对时间的大小
2014/01/31 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
php实现等比例不失真缩放上传图片的方法
2016/11/14 PHP
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
使用控制台破解百小度一个月只准改一次名字
2015/08/13 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
jQuery实现的浮动层div浏览器居中显示效果
2017/02/03 Javascript
Bootstrap笔记之缩略图、警告框实例详解
2017/03/09 Javascript
详解AngularJS 过滤器的使用
2018/06/02 Javascript
JavaScript中变量、指针和引用功能与操作示例
2018/08/04 Javascript
js根据json数据中的某一个属性来给数据分组的方法
2018/10/08 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
Node 搭建一个静态资源服务器的实现
2019/05/20 Javascript
使用vue实现各类弹出框组件
2019/07/03 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
2019/10/24 Javascript
基于Vant UI框架实现时间段选择器
2020/12/24 Javascript
python正则表达式修复网站文章字体不统一的解决方法
2013/02/21 Python
python网络编程学习笔记(四):域名系统
2014/06/09 Python
Python正则表达式完全指南
2017/05/25 Python
Python优先队列实现方法示例
2017/09/21 Python
python可视化篇之流式数据监控的实现
2019/08/07 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
Python使用OpenPyXL处理Excel表格
2020/07/02 Python
Python全局变量与global关键字常见错误解决方案
2020/10/05 Python
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
购房意向书范本
2014/04/01 职场文书
乡镇个人对照检查材料
2014/08/22 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
Python多线程 Queue 模块常见用法
2021/07/04 Python