基本拖拽

new Dragdrop({target 拖拽元素 HTMLElemnt 必选bridge 指定鼠标按下哪个元素时开始拖拽,实现模态对话框时用到 dragable 是否可拖拽 (true)默认dragX true/false false水平方向不可拖拽 (true)默认dragY true/false false垂直方向不可拖拽 (true)默认area [minX,maxX,minY,maxY] 指定拖拽范围 默认任意拖动callback 拖拽过程中的回调函数
});

jQuery插件

/*** jQuery拖拽插件** 简单使用* $(xx).dragable()* * 配置对象 option* $(xx).dargable({*    handle:  // @string   鼠标按下开始拖动的元素*    canDrag: // @boolean  默认: true*    axis:    // @string   拖拽方向,默认: "xy"。x: 仅水平方向,y: 仅垂直方向*    area:    // @array    [minX,maxX,minY,maxY] 拖拽范围 默认任意拖动*    inwin:   // @boolean  仅在浏览器窗口内拖动*    cursor:  // @string   鼠标状态*    zIndex:  // @number   拖拽时zIndex值*    fixed:   // @boolean  出现滚动条时保持fixed 默认true* })* * 方法 method* $(xx).dragable('disable') // 停止拖拽* $(xx).dragable('enable')  // 开启拖拽* $(xx).dragable('reset')   // 重置配置对象option** 事件 event [start:开始拖拽, drag:拖拽中, end:拖拽结束]* $(xx).dragable({*     start: function() {*   *     },*     drag: function() {*   *     },*     end: function() {*   *     }* })*/
~function(win, doc, $) {var $win = $(win)
var $doc = $(doc)
var doc  = $doc[0]/** 获取视窗的宽高*/
function getViewSize() {return {width: $win.width(),height: $win.height()}
}
/** @private initilize 初始化拖拽* @param {Object} option* @param {Object} jqObject*/
function initilize(option, jqObject) {option = option || {}var axisReg = /^xy$/var option = $.extend({handle: '',canDrag: option.canDrag !== false,axis: option.axis || 'xy',area: option.area || [],inwin: option.inwin,cursor: 'move',zIndex: ''}, option)jqObject.each(function(i, elem) {var handle   = option.handlevar dragObj  = $(elem)var downObj  = handle ? dragObj.find(handle) : dragObjvar dargElem = dragObj[0]// 暂存配置对象dragObj.data('optionData', option)dragObj.data('originData', $.extend({}, option))// 设置鼠标状态downObj.css('cursor', option.cursor)// 需要使用的一些状态变量var diffX, diffY, viewSizevar dragElemWidth, dragElemHeight, dragElemMarginTop, dragElemMarginLeft// 鼠标mousedowndownObj.mousedown(function(ev) {// 模拟拖拽,需要设置为绝对定位dragObj.css('position', 'absolute')// 鼠标按下的时候计算下window的宽高,拖拽元素尺寸. // 不要再mousemove内计算viewSize = getViewSize()dragElemWidth = Math.max(dargElem.offsetWidth, dargElem.clientWidth)dragElemHeight = Math.max(dargElem.offsetHeight, dargElem.clientHeight)dragElemMarginTop = parseInt(dargElem.style.marginTop, 10) || 0dragElemMarginLeft = parseInt(dargElem.style.marginLeft, 10) || 0// 仅在窗口可视范围内移动if (option.inwin) {var winX = viewSize.width - dragElemWidthvar winY = viewSize.height - dragElemHeightoption.area = [0, winX, 0, winY]}if (win.captureEvents) { //标准DOMev.stopPropagation()ev.preventDefault()$win.blur(mouseup)} else if(dargElem.setCapture) { //IEdargElem.setCapture()ev.cancelBubble = truedragObj.bind('losecapture', mouseup)}diffX = ev.clientX - dargElem.offsetLeftdiffY = ev.clientY - dargElem.offsetTop$doc.mousemove(mousemove)$doc.mouseup(mouseup)// drag start eventif (option.start) {option.start.call(dragObj)}})function mousemove(ev) {var minX, maxX, minY, maxYvar moveX = ev.clientX - diffXvar moveY = ev.clientY - diffY// 设置拖拽范围if (option.area) {minX = option.area[0]maxX = option.area[1]minY = option.area[2]maxY = option.area[3]moveX < minX && (moveX = minX) // left 最小值moveX > maxX && (moveX = maxX) // left 最大值moveY < minY && (moveY = minY) // top 最小值moveY > maxY && (moveY = maxY) // top 最大值}// 设置是否可拖拽,有时可能有取消元素拖拽行为的需求if (option.canDrag) {var axis = option.axis//设置位置,并修正marginmoveX = moveX - dragElemMarginTopmoveY = moveY - dragElemMarginLeftif (axis === 'x' || axisReg.test(axis)) {dargElem.style.left = moveX + 'px'}if (axis === 'y' || axisReg.test(axis)) {dargElem.style.top =  moveY + 'px'}}// drag eventif (option.drag) {option.drag.call(dragObj, moveX, moveY)}}function mouseup(ev) {// 删除事件注册$doc.unbind('mousemove', mousemove)$doc.unbind('mouseup', mouseup)if (win.releaseEvents) { //标准DOM$win.unbind('blur', mouseup)} else if(dargElem.releaseCapture) { //IEdragObj.unbind('losecapture', mouseup)dargElem.releaseCapture()}// drag end evnetif (option.end) {option.end.call(dragObj)}}})
}/** @method dragable jQuery拖拽插件* @param {Object} option* @param {String} key* @param {String} value*/
$.fn.dragable = function(option, key, value) {return this.each(function() {var $self = $(this)if (typeof option === 'string') {var oldOption = $self.data('optionData')switch (option) {case 'destroy':breakcase 'disable':oldOption.canDrag = falsebreakcase 'enable':oldOption.canDrag = truebreakcase 'reset':var originOption = $self.data('originData')$.extend(true, oldOption, originOption)breakcase 'option':if (key && value === undefined) {return oldOption[key]}switch (key) {case 'axis':oldOption.axis = valuebreakcase 'cursor':oldOption.cursor = valuebreakcase 'zIndex':oldOption.zIndex = valuebreak}breakdefault:;}} else {initilize(option, $self)}})
}}(this, document, jQuery);

效果

拖拽状态:x:0, y:0
Drag me.
任意方向 水平方向 垂直方向 停止拖拽 开启拖拽 恢复初始状态

dragdrop.zip

Javascript自由拖拽类相关推荐

  1. jquery.ui.draggable中文文档jquery 自由拖拽类~study~

    为什么80%的码农都做不了架构师?>>>    JQuery UI Draggable插件用来使选中的元素可以通过鼠标拖动. Draggable的元素受影响css: ui-dragg ...

  2. winform窗体自由拖拽控件

    源码地址:https://download.csdn.net/download/horseroll/10906640 以上链接是用积分下载的,如果没有积分,可以用以下链接付费下载:https://do ...

  3. html列表拖拽排序插件,可对列表自由拖拽排序的jQuery插件

    dragslot.js是一款可以对列表自由拖拽排序的jQuery插件.该插件主要的功能是实现了列表项可以在各个列表中相互拖拽. 对于像todo list, 分配任务列表都可以应用这个效果. 使用方法 ...

  4. javascript鼠标拖拽的那些事情

    <html> <head> <title>javascript鼠标拖拽的那些事情</title> <meta http-equiv="C ...

  5. Qt5.14_MinGW/MSVC下实现VS2019面板自由拖拽组合功能

    文章目录 前言 一.src源码获取 二.lib_MinGW/lib_MSVC获取 三.库的添加 四.代码测试 总结 前言 最近在项目中需要实现几个窗口可以自由拖拽等需求,一开始使用Qt原生控件QDoc ...

  6. Vue 实现弹框自由拖拽(不出可视范围、解决快速拖动问题)

    Vue 实现弹框自由拖拽(不出可视范围.解决快速拖动问题) 由于页面中弹框很多,往往会挡住想要查看的内容.从而,有了自由移动拖拽弹框的需求:但在使用的过程中发现,一开始编写的drag.js文件会移出可 ...

  7. vue实现指定区域自由拖拽、打印功能

    先看下效果图,实现指定区域内内容自由拖拽,不超出.动态设置字体颜色及字号:设置完成实现打印指定区域内容,样式不丢失. 1.运行命令npm i vue-draggable-resizable -S, 安 ...

  8. Taro项目 实现一个在页面内自由拖拽的滑块,仿苹果手机的辅助按钮

    效果:自由拖拽,松手会自动吸附到边上 组件代码: import { EventProps, ITouchEvent, View } from '@tarojs/components' import { ...

  9. 怎么用javascript进行拖拽(转摘)

    本文译自:http://www.webreference.com/programming/javascript/mk/column2/index.html 所有版权归原文所有 由sohotx.com雪 ...

最新文章

  1. 字节跳动总结的设计模式 PDF 火了,完整版开放下载!
  2. 《jQuery与JavaScript入门经典》——第 1 章 动态Web编程简介 1.1理解Web服务器浏览器范式...
  3. HTML5做手机站页面字体显示很小的解决方法
  4. 通过DLL使两个工程公用部分代码
  5. Spring 2.5:Spring MVC中的新特性
  6. When allowCredentials is true, allowedOrigins cannot contain the special value “*“ that cannot be
  7. 树莓派和微信和服务器,用树莓派搭建微信公共平台
  8. Qt工作笔记-使用QCustomplot实现鼠标拖动数据点画曲线
  9. python发动机悬置解耦计算-按重心处整车坐标系解耦
  10. 世界坐标与像素坐标的相互转换
  11. 【数据结构笔记40】哈希表冲突处理方法:开放地址法(线性探测、平方探测、双散列、再散列),分离链接法
  12. Chrome浏览器如何完美实现截长屏幕
  13. Android手机证书安装
  14. 双控是指控制理论与控制工程,是二级学科,控制科学与工程是一级学科。
  15. 基于opengl的3d漫游游戏 - 古堡危机之丧尸围城
  16. 表或视图不存在的解决方法
  17. 聊一下关于面试的话题,只谈共性,不谈个例,一家之言,仅供求职者参考:)
  18. 嵌入式开发常用到的在线工具
  19. css3 烟 蚊香_HTML5前端特效库 css3 按钮粒子烟花特效源码
  20. 餐饮业数字化提速,OceanBase助海底捞变身“云上捞”

热门文章

  1. [SAP ABAP开发技术总结]CLEAR、REFRESH、FREE内表清理区别
  2. Hibernate4实战 之 第四部分:关系映射
  3. c语言常用的字符串处理函数
  4. SQL SERVER中直接循环写入数据
  5. 2019年平面设计趋势
  6. SD卡格式化怎么恢复?只需要五个步骤
  7. mac下chrome浏览器的标签页、进程和内存分配
  8. 嵌入式处理器分类现状
  9. java实现-两个栈实现一个队列和两个队列实现一个栈
  10. TortoiseGit清除账号密码