基于jquery 移动插件的实现
引用谢灿勇 地址 http://www.cnblogs.com/st-leslie/p/6002148.html
一个思路分析:大致上实现的思路有以下两种。
一、判断块是否被按下(mousedown),然后在点击事件中嵌套移动事件(mousemove),同时在里面放置一个松开的事件(mouseup)
二、跟第一种方法类似,都是分成三个事件来触发,但是不同的是:事件与事件之间没有互相嵌套,而是分成三个独立的事件,通过一个控制器(变量)来达到事件之间的交互
第一种方法是不推荐的,因为这种方法虽然直观,符合整个思考的逻辑,但是这个方法的做法相对比较复杂,而且如果有什么要改动的话也不方便。这个我们可以理解为耦合性较高。第二种方法事件逻辑简单,而且所有的事件都是分开来执行的,没有依赖关系,后期维护性较好。
以第二种方法为例我们来分析:

这里我就来讲解最为核心的计算公式的推导:
图例如下所示:

以左上角的坐标为例,假设左上角的坐标为(X0,Y0),同时我们可以计算第一次点击的位置到最终释放的位置的坐标,相对的移动距离(以X轴为例,Y轴同理):(MousedownX1-MousedownX0),所以最终的结果相对于初始化的移动距离是:(MousedownX1-MousedownX0)+X0
其他的也没有什么好讲的,并且这个插件的思路也十分的容易实现,我相信读者都可以按照上面的分析自己实现
这里就提供我自己制作的一款拖拽插件,这款拖拽插件用法简单,而且提供了一些配置,可以在多种场景下面很方便的使用
github地址(如果觉得不错的话,请点个赞)
1、首先我们在使用的时候要引入jDrag.js文件并且确保jquery.js已经在之前被引用
2、具体使用的方法参照现在附件中的DEMO1和DEMO2
3、这款插件除了实现对点击的对象的移动功能,增加了一个功能,可以点击某个对象,但是控制其父节点移动,这个在实际业务中主要是用在如;触发弹出窗口标题,然后可以把整个 窗口拖动的效果
jDrag 插件文档
这款插件主要是为了解决日常开发上面的拖拽问题,插件的配置较为简单,也可以作为新手的插件入门案例
插件相关文章:
自己动手写插件底层篇—基于jquery移动插件实现
配置说明: drag:true, //用来指定作用的块是否可以移动
moveObject:this //默认移动的对象和点击的对象相同,但是如果是特殊情况则需要触发的对象和移动的对象不相同
上面参数的值为默认值,在使用的时候可以直接调用默认值,不需要传递参数
用法:
1. 引入jDrag.js,注意在引入的时候确保jquery.js已经加载进来
2. 初始化移动对象,例如:
$("#test").jDrag({drag:true});
上面的{drag:true},我们也可以省略不写,但是传入其中必须为JSON数据
demo1
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>jDrag使用案例</title> | |
| </head> | |
| <body> | |
| <div style="margin-top: 100px;margin-left: 1000px;position: fixed;" class="button_group"> | |
| <button onclick="run()">运动</button> | |
| <button onclick="stop()">停止</button> | |
| </div> | |
| <div id="test" style="margin-left: 100px;background:pink;width:80px;height:80px"></div> | |
| <div id="test2" style="margin-left:200px;border:lightblue;width:150px;height:100px;"> | |
| < | |
| </div> | |
| </body> | |
| <script type="text/javascript" src="http://cdn.bootcss.com/jquery/3.1.1/jquery.js"></script> | |
| <script type="text/javascript" src="jDrag.js"></script> | |
| <script type="text/javascript"> | |
| function run(){ | |
| $("#test").jDrag({drag:true}); | |
| } | |
| function stop(){ | |
| $("#test").jDrag({drag:false}); | |
| } | |
| </script> | |
| </html> |
demo2
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>Document</title> | |
| </head> | |
| <body> | |
| <div class="model" style="margin-top: 100px;margin-left: 100px;background: lightblue;width:200px;height:100px"> | |
| <div id="test" style="width:100%;height:30px;background:pink"></div> | |
| </div> | |
| </body> | |
| <script type="text/javascript" src="http://cdn.bootcss.com/jquery/3.1.1/jquery.js"></script> | |
| <script type="text/javascript" src="jDrag.js"></script> | |
| <script type="text/javascript"> | |
| $("#test").jDrag({drag:true,moveObject:".model"}) | |
| </script> | |
| </html> |
js代码如下
| $.fn.jDrag=function(options){ | |
| var default_options={ | |
| drag:true, | |
| moveObject:this | |
| }; | |
| var status=''; | |
| $(this).off(); | |
| var mouseX=0; | |
| var mouseY=0; | |
| var ElementX=0; | |
| var ElementY=0; | |
| var thisObj=document.getElementById(this); | |
| var settings=$.extend({},default_options,options); | |
| var that=settings.moveObject; | |
| if(settings.drag==false){ | |
| $(this).css("cursor","default"); | |
| }else{ | |
| $(this).css("cursor","move"); | |
| } | |
| $(this).on("mousedown",function(e){ | |
| var e=e||window.event; | |
| mouseX=e.clientX; | |
| mouseY=e.clientY; | |
| ElementX=$(this).position().left; | |
| ElementY=$(this).position().top; | |
| if(settings.drag==true){ | |
| status=true; | |
| } | |
| if(settings.drag==false){ | |
| status=false; | |
| } | |
| }); | |
| $(document).on("mousemove",function(e){ | |
| if(status==true){ | |
| var x=e.clientX-mouseX+ElementX; | |
| var y=e.clientY-mouseY+ElementY; | |
| $(that).css("margin-left",x+"px"); | |
| $(that).css("margin-top",y+"px"); | |
| } | |
| }); | |
| $(document).on("mouseup",function(e){ | |
| status=false; | |
| }) | |
| } |
基于jquery 移动插件的实现的更多相关文章
- 基于jquery fly插件实现加入购物车抛物线动画效果,jquery.fly.js
在购物网站中,加入购物车的功能是必须的功能,有的网站在用户点击加入购物车按钮时,就会出现该商品从点击出以抛物线的动画相似加入购物车,这个功能看起来非常炫,对用户体验也有一定的提高.下面介绍基于jque ...
- 基于JQuery.timer插件实现一个计时器
基于JQuery.timer插件实现一个计时器,需要的朋友可以参考下. 先去官网下载jQuery Timers插件 ,然后引用到html中.这里是1.2 version 复制代码代码如下: < ...
- 基于 jQuery Jcrop 插件的功能模块:头像剪裁
/** Jcrop version: 0.9.12 jQuery version: 1.9.0 Author: 小dee Date: 2014.10.30 */ 先看看他山之石:博客园的头像模块也是使 ...
- 基于jquery的插件turn.js学习笔记
基于jquery的插件turn.js学习笔记 简介 turn.js是一个可以实现3d书籍展示效果的jq插件,使用html5和css3来执行效果.可以很好的适应于ios和安卓等触摸设备. How it ...
- 基于jQuery日历插件制作日历
这篇文章主要介绍了基于jQuery日历插件制作日历的相关资料,需要的朋友可以参考下 来看下最终效果图吧: 是长得丑了一点,不要吐槽我-.- 首先来说说这个日历主要的制作逻辑吧: ·一个月份最多有31天 ...
- 编写基于jQuery的插件的方法
注意:jQuery中有一个extend的方法,这个方法是添加js对象字段的,下面会多次用到 1:添加全局类的方法 常用的ajax就是该类插件,下面要编写一个简单的加法和减法的基于jQuery的方法 $ ...
- 基于jquery分页插件
今天终于完成了基于jquery的分页插件的代码编写,也通过了功能测试,实现了分页功能:由于刚开始写jquery的插件,所以梳理逻辑的时间也很长,整个过程整整一周时间,今天终于搞完了,先将整个分页插件的 ...
- 基于jQuery的插件
jQuery Validation 验证框架 jQuery Form Ajax表单插件 jQuery UI插件 Easy UI
- 一款基于jQuery日历插件的开发过程
这个插件的设置选项,所有样式都设置成自定义,提供回调函数,方便在外部进行扩展 css设置是可变的 也就是说 日历的样式是定制的: /******************************** ...
随机推荐
- jQuery--百度百科
JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Oper ...
- 重新 java 对象的 equals 和 hashCode 方法的建议和示例代码
equals 方法 equals 方法需要满足的规范: 自反性: 对于任意非空引用 x, x.equals(x) 应该返回 true; 对称性: 对于任意引用, 当且仅当 x.equals(y) == ...
- 程序员取悦女票的正确姿势---Tip1(iOS美容篇)
代码地址如下:http://www.demodashi.com/demo/11695.html 前言 女孩子都喜欢用美图工具进行图片美容,近来无事时,特意为某人写了个自定义图片滤镜生成器,安装到手机即 ...
- iOS开发-Object-C学习之结构体使用
前言:定义结构体并不是定义一个变量,而是定义了种数据类型. 结构体作用: 结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型.以方便日后的使用. 在实 ...
- 改变Fragment的默认动画
FragmentTransaction ft = getFragmentManager().beginTransaction(); //设置进入退出动画 ft.setCustomAnimations( ...
- tcpdump抓包(转)
Linux 环境下,通常通过 tcpdump 来进行抓包和分析.它是几乎所有 Linux 发行版本预装的数据包抓取和分析工具. tcpdump 工具的获取和安装可以参阅相应操作系统的官方文档,本文不再 ...
- C#微信公众号学习 - (一)测试账号申请
主要分为两部分: 1.创建C#的项目,并发布, 2.微信填写发布的地址进行开发者验证. 一. VS环境为VS2017,创建项目时,自带的一些东西发布会导致各种错误,无奈,创建了空项目aspx窗体,如下 ...
- InputArray和OutputArray
源码路径:~/opencv-2.4.9/modules/core/include/opencv2/core/core.hpp where _InputArray is a class that can ...
- pthread_cleanup_push和pthread_cleanup_pop清除函数是否执行的说明
示例1: #include <stdio.h> #include <pthread.h> void* clean(void* arg) { printf("clean ...
- nodejs学习之简单服务器的编写
不废话了!直接上代码: var http = require('http'); //导入模块http http.createServer(function(request,response){ res ...