自己封装的一个原生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 实现Tab效果 思路是js思路
Mar 02 Javascript
基于Jquery与WebMethod投票功能实现代码
Jan 19 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
Feb 02 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
Nov 03 Javascript
jquery toolbar与网页浮动工具条具体实现代码
Jan 12 Javascript
jquery新的绑定事件机制on方法的使用方法
Apr 15 Javascript
利用css+原生js制作简单的钟表
Apr 07 Javascript
javascript判断回文数详解及实现代码
Feb 03 Javascript
微信小程序 sha1 实现密码加密实例详解
Jul 06 Javascript
浅谈关于axios和session的一些事
Jul 13 Javascript
Angular表格神器ui-grid应用详解
Sep 29 Javascript
jQuery实现放大镜案例
Oct 19 jQuery
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教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
php编写的抽奖程序中奖概率算法
2015/05/14 PHP
PHP+MySQL实现模糊查询员工信息功能示例
2018/06/01 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
js 遍历对象的属性的代码
2011/12/29 Javascript
通过JS来动态的修改url,实现对url的增删查改
2014/09/01 Javascript
js判断滚动条是否已到页面最底部或顶部实例
2014/11/20 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
2015/03/24 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
vue组件传递对象中实现单向绑定的示例
2018/02/28 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
在vue中使用console.log无效的解决
2020/08/09 Javascript
如何构建一个Vue插件并生成npm包
2020/10/26 Javascript
Python中%r和%s的详解及区别
2017/03/16 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
详解Python requests 超时和重试的方法
2018/12/18 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
Python 读取xml数据,cv2裁剪图片实例
2020/03/10 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
Django crontab定时任务模块操作方法解析
2020/09/10 Python
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
HTML实现代码雨源码及效果示例
2020/02/25 HTML / CSS
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
英国团购网站:Groupon英国
2017/11/28 全球购物
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
自荐信格式技巧有哪些呢
2013/11/19 职场文书
秋季婚礼证婚词
2014/01/11 职场文书
2014年标准化工作总结
2014/12/17 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
走进科学观后感
2015/06/18 职场文书
英文投诉信格式
2015/07/03 职场文书
python plt.plot bar 如何设置绘图尺寸大小
2021/06/01 Python