而很多页面效果都要用到这些位置。不得已,得练练,得记记。

下面就来说说这个基于 JQuery的简易拖拽插件吧。

按惯例,先说说拖拽的原理,以及搞这么一个东东的步骤:

那什么是拖拽呢? 看名字就知道了:就是把一个东东拖来拽去的。 放到我们的DOM上,就是改变它的位置。

它只有两个难点:1、如何知道是在拖? 2、如何知道从哪拖,拖到哪?

其实,这也算不上难点,毕竟两者都是基础的东西,关键在于熟练。

换到js 中,我们搞一个拖拽效果,大致有如下步骤:

1、让元素捕获事件(一般情况下,无非就是mousedown、mousemove、mouseup)

2、在mousedown时,标记开始拖拽,并获取元素及鼠标的位置。

3、在mousemove时,不断的获取鼠标的新位置,并通过相应的位置算法,来重新定位元素位置。

4、在mouseup时,结束拖拽。。。然后周而复始。

这中间,个需要注意的地方:被拖拽的元素,至少需要相对或绝对定位,否则拖拽不会有效果。

OK,不多说,无代码,无真相。相应的解释都在其中了:

下载:

Jeremy - DragDrop Test !

(function($)

{

$.extend({

//获取鼠标当前坐标

mouseCoords:function(ev){

if(ev.pageX || ev.pageY){

return {x:ev.pageX, y:ev.pageY};

}

return {

x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,

y:ev.clientY + document.body.scrollTop - document.body.clientTop

};

},

//获取样式值

getStyle:function(obj,styleName)

{

return obj.currentStyle ? obj.currentStyle[styleName] : document.defaultView.getComputedStyle(obj,null)[styleName];

// return obj.currentStyle ? obj.currentStyle[styleName] : document.defaultView.getComputedStyle(obj,null).getPropertyValue(styleName);

}

});

// 元素拖拽插件

$.fn.dragDrop = function(options)

{

var opts = $.extend({},$.fn.dragDrop.defaults,options);

return this.each(function(){

//是否正在拖动

var bDraging = false;

//移动的元素

var moveEle = $(this);

//点击哪个元素,以触发移动。

//该元素需要是被移动元素的子元素(比如标题等)

var focuEle = opts.focuEle ? $(opts.focuEle,moveEle) : moveEle ;

if(!focuEle || focuEle.length<=0)

{

alert('focuEle is not found! the element must be a child of '+this.id);

return false;

}

// initDiffX|Y : 初始时,鼠标与被移动元素原点的距离

// moveX|Y : 移动时,被移动元素定位位置 (新鼠标位置与initDiffX|Y的差值)

// 如果定义了移动中的回调函数,该对象将以参数传入回调函数。

var dragParams = {initDiffX:'',initDiffY:'',moveX:'',moveY:''};

//被移动元素,需要设置定位样式,否则拖拽效果将无效。

moveEle.css({'position':'absolute','left':'0','top':'0'});

//点击时,记录鼠标位置

//DOM写法: getElementById('***').οnmοusedοwn= function(event);

focuEle.bind('mousedown',function(e){

//标记开始移动

bDraging = true;

//改变鼠标形状

moveEle.css({'cursor':'move'});

//捕获事件。(该用法,还有个好处,就是防止移动太快导致鼠标跑出被移动元素之外)

if(moveEle.get(0).setCapture)

{

moveEle.get(0).setCapture();

}

//(实际上是鼠标当前位置相对于被移动元素原点的距离)

// DOM写法:(ev.clientX + document.body.scrollLeft - document.body.clientLeft) - document.getElementById('***').style.left;

dragParams.initDiffX = $.mouseCoords(e).x - moveEle.position().left;

dragParams.initDiffY = $.mouseCoords(e).y - moveEle.position().top;

});

//移动过程

focuEle.bind('mousemove',function(e){

if(bDraging)

{

//被移动元素的新位置,实际上鼠标当前位置与原位置之差

//实际上,被移动元素的新位置,也可以直接是鼠标位置,这也能体现拖拽,但是元素的位置就不会精确。

dragParams.moveX = $.mouseCoords(e).x - dragParams.initDiffX;

dragParams.moveY = $.mouseCoords(e).y - dragParams.initDiffY;

//是否限定在某个区域中移动.

//fixarea格式: [x轴最小值,x轴最大值,y轴最小值,y轴最大值]

if(opts.fixarea)

{

if(dragParams.moveX

{

dragParams.moveX=opts.fixarea[0]

}

if(dragParams.moveX>opts.fixarea[1])

{

dragParams.moveX=opts.fixarea[1]

}

if(dragParams.moveY

{

dragParams.moveY=opts.fixarea[2]

}

if(dragParams.moveY>opts.fixarea[3])

{

dragParams.moveY=opts.fixarea[3]

}

}

//移动方向:可以是不限定、垂直、水平。

if(opts.dragDirection=='all')

{

//DOM写法: document.getElementById('***').style.left = '***px';

moveEle.css({'left':dragParams.moveX,'top':dragParams.moveY});

}

else if (opts.dragDirection=='vertical')

{

moveEle.css({'top':dragParams.moveY});

}

else if(opts.dragDirection=='horizontal')

{

moveEle.css({'left':dragParams.moveX});

}

//如果有回调

if(opts.callback)

{

//将dragParams作为参数传递

opts.callback.call(opts.callback,dragParams);

}

}

});

//鼠标弹起时,标记为取消移动

focuEle.bind('mouseup',function(e){

bDraging=false;

moveEle.css({'cursor':'default'});

if(moveEle.get(0).releaseCapture)

{

moveEle.get(0).releaseCapture();

}

});

});

};

//默认配置

$.fn.dragDrop.defaults =

{

focuEle:null, //点击哪个元素开始拖动,可为空。不为空时,需要为被拖动元素的子元素。

callback:null, //拖动时触发的回调。

dragDirection:'all', //拖动方向:['all','vertical','horizontal']

fixarea:null //限制在哪个区域拖动,以数组形式提供[minX,maxX,minY,maxY]

};

})(jQuery);

// test

$(function(){

//限定区域,有回调函数。

$('#dragDiv').dragDrop({fixarea:[0,$('#dragContainer').width()-50,0,$('#dragContainer').height()-50],callback:function(params){

$('#span1').text('X:'+params.moveX+' Y:'+params.moveY);

}});

//默认设置

$('#dragDiv1').dragDrop();

});

java se拖动插件_JQuery之拖拽插件实现代码相关推荐

  1. java se拖动插件_JQuery之拖拽插件

    Jeremy - DragDrop Test !(function($) { $.extend({//获取鼠标当前坐标mouseCoords:function(ev){if(ev.pageX||ev. ...

  2. java实现拖动框排序_拖拽排序后端设计与实现

    背景 最近在做课程后台开发时,遇到一个很有意思的问题.问题是这样的,有多节课程,运营人员可以根据需要调整课程的先后顺序,从而更改课程的展示顺序. 接到这个需求,立刻就想到了以前做首页banner轮播图 ...

  3. sortable 拖拽时互换目标的位置_双端通用型JS拖拽插件的封装与应用

    最近工作中遇到一个需求,需要将一个元素从某位置拖动到另一固定位置后执行某一交互行为,具体效果如下: 这个看似简单的需求,然而实现起来却并不那么顺利.我首先想到的是如何通过哪个现有的插件来快速解决这个问 ...

  4. 【组件】前端js拖拽插件 VUE

    [组件]前端js拖拽插件 VUE Vue Draggable - Vue 拖拽组件王者 Vue drag resize - 轻量级,无依赖,可缩放 Vue smooth dnd - 简单动效,上下拖拽 ...

  5. vue3TS+Jsplumb+vuedraggable拖拽插件使用记录

    安装拖拽插件 vue3需下载-@next此版本,否则会出现错误 npm i -S vuedraggable@next npm install sortablejs --save //拖拽组件依赖sor ...

  6. js 拖拽生成html,js拖拽插件 js 拖拽控件生成自定义表单 怎么实现

    想请教一个js的问题,拖拽控件 js 拖拽控件生成自定义表单 怎么实现 说说步骤吧 监听mousedown事件 - 获取鼠标点击元素,判断是否可拖拽 - 设置flag做标记 - 建一个tempDOM, ...

  7. 拖拽插件jquery.dad.js

    带删除功能: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...

  8. php实现拖拽排序,H5实现拖拽排序的代码

    本篇文章给大家带来的内容是关于H5实现拖拽排序的代码 ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.需求 豆果食谱系统,sku列表实现拖拽排序,如图: 二.HTML5拖放API ...

  9. php 元素 拖拉,Draggable Elements 元素拖拽功能实现代码_javascript技巧

    当然我们可以研究js库的源码, 也可以自己去发明轮子试试看, 其过程还是挺有趣的...下面我就来实现下页面元素的拖拽功能 现在就开始着手实现, 让我们从最顶层的方法讲起, 它用于初始化一个drag o ...

最新文章

  1. Java程序员应该知道的10个调试技巧
  2. Android JNI入门第一篇——HelloJni
  3. recv 和 send 阻塞和非阻塞的区别
  4. boost::utility::string_ref相关的测试程序
  5. 计划继续深化学习物联网系统的相关知识 目前的WiFi模块基于ESP8266
  6. H264码流打包分析
  7. boost::function的用法(二)
  8. java 混淆 js_Vue javascript和css混淆
  9. 算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)
  10. 基于android鲜花销售app,基于Android的鲜花APP设计任务书
  11. bootstrap学习笔记-(1-初识bootstrap)
  12. java 二叉树详解 + 实现代码
  13. UE4编辑器语言设置-中英对照
  14. 家庭整理-《家庭断舍离》书中的精髓:如何通过家庭断舍离,来消除家居环境和家庭关系间的堆积物,从而拥有自由舒适的家庭关系。
  15. vue 之手机号验证、正则验证手机号是否正确、手机号验证码信息弹窗
  16. tensorflow函数学习
  17. 什么是进程? 为什么使用进程? 如何运用进程?
  18. CSS设置下划线与文字间距距离
  19. 3.7V锂电池使用中电量与电压关系
  20. windows删除证书

热门文章

  1. 画动漫女孩的方法,教你好看的动漫女孩怎么画
  2. 〖产品思维训练白宝书 - 产品思维认知篇③〗- 产品思维 VS 技术思维
  3. DSPTMS320F28335_SCI详解
  4. 如何在App过审之后进入解决方案中心
  5. 绩效管理三原则,让你做好绩效
  6. matlab画转体_如何用MATLAB画五角星围绕其一对称轴旋转的旋转体?
  7. 解决docker的Get https://registry-1.docker.io/v2/: net/http: request canceled 报错
  8. 火狐浏览器打开b站默认静音解决办法
  9. 【计算机网络 (谢希仁) 习题题解】第4章 网络层 (1)
  10. JEET W1S运动蓝牙耳机简评