美国人有一句常用的俗语—“Re-inventing the Wheel”,从字面上来解释就是“重新发明轮子”。可是轮子早已问世,再要去发明岂非劳而无功?

  产品经理发下需求,实施者再到网上搜索代码,也许很快就搜到对应的代码。简单的交互和提交常用的交互,很容易的网上找到相应的代码。一些复杂的交互、定制行比较强的交互,网上找代码就有些困难的。所有复杂交互都是简单交互的组成,所以搜索别人的代码是以学习为主,把别人的基础方法掌握了。拿到需求就不必要到网上搜代码,这样永远也不能提升自己的能力。

  业余时间写的一个,简单拖拽框架代码,但比较容易扩展。

  源码下载:http://yunpan.cn/QGYBju4vcRxZz

例子:

源码:

 1 /**

 2  * jQuery拖拽

 3  * @author: heshimeng1987@qq.com

 4  */

 5 ~function($, window, undefined){

 6     var win = $(window),

 7         doc = $(document),

 8 

 9     drag = function(target, options){

         return new drag.fn.init(target, options);

     };

 

     drag.fn = drag.prototype = {

         init: function(target, options){

 

             var that = this;

             this.target = $(target);

             options = options || {};

             this.root   = options.root ? $(options.root) : this.target;

             this.min    = options.min;

             this.max    = options.max;

             this.start  = options.start;

             this.move   = options.move;

             this.end    = options.end;

             // this.fixed  = options.fixed === undefined ? true : options.fixed;

             this.startPosition = {};

             this.movePosition  = {};

             var _down = function(e){

                     that.startPosition = {x: e.clientX-parseInt(that.root.css('left')),

                                           y: e.clientY-parseInt(that.root.css('top'))};

                     that.start&&that.start(that.startPosition);

                     doc.bind('mousemove', _move)

                     .bind('mouseup', _end);

                     return false;

                 },

                 _move = function(e){

                     that.movePosition = {x: e.clientX - that.startPosition.x,

                                          y: e.clientY - that.startPosition.y};

                     that.limit();

                     that.root.css({

                         left: that.movePosition.x,

                         top: that.movePosition.y

                     });

                     that.move&&that.move(that.movePosition);

                     return false;

                 },

                 _end = function(){

                     doc.unbind('mousemove', _move)

                     .unbind('mouseup', _end);

                     that.end&&that.end(that.movePosition);

                     return false;

                 };

 

             this.target.bind('mousedown',_down);

         },

         /**

          * 移动的位置限制

          */

         limit: function(){

             if(this.min !== undefined){

                 this.movePosition = {

                     x: Math.max( this.min.x, this.movePosition.x ),

                     y: Math.max( this.min.y, this.movePosition.y )

                 };

             }

             if(this.max !== undefined ){

                 this.movePosition = {

                     x: Math.min( this.max.x, this.movePosition.x ),

                     y: Math.min( this.max.y, this.movePosition.y )

                 };

             }

         }

     };

     drag.fn.init.prototype = drag.fn;

     $.drag = drag;

 

 

 }(jQuery, this);

后续将制作一个完善的对话框功能,
当然也可以扩展一些小功能。比如,我工作中编写了一个身高拖拽表单,提供一个效果,这里就不提供源码了:

转载请注明出处:http://www.cnblogs.com/dreamback

如有任何建议或疑问,欢迎留言讨论。

.root{width: 280px;position: absolute;background:#ccc;top:450px;left:100px;font-size: 12px;}
.target{height: 32px;line-height: 32px;margin: 0;background:blue;cursor: move;padding-left: 10px;color:#fff;}
#target1{cursor: move;}
#target3,#target2{margin:0}

 例子1.
$.drag('#target1');

例子2.

$.drag('#target2',{ root:'#root2' });

例子3.

最小范围:min:{x:100,y:10}

最大范围:max:{x:900,y:2000}

开始:false

移动:false

结束:false

$.drag('#target3',

{

    root:'#root3',

    min:{x:100,y:10},

    max:{x:900,y:2000},

    start: function(pos){

        $('#isEnd').html('false');

        $('#isStart').html('true, x='+pos.x+', y='+pos.y);

    },

    move: function(pos){

        $('#isMove').html('true, x='+pos.x+', y='+pos.y);

    },

    end: function(pos){

        $('#isEnd').html('true, x='+pos.x+', y='+pos.y);

        $('#isStart').html('false');

        $('#isMove').html('false');

    }

});

javascript拖拽原理与简单实现方法[demo]的更多相关文章

  1. Javascript 拖拽的一些简单的应用——逐行分析代码,让你轻松了解拖拽的原理

    今天我们来看看如何让拖拽的物体不能拖出某个div之外和拖拽的吸附功能 上次讲到我们的拖拽是不可拖出可视区范围的,在这基础上我们加个父级的div,不让他拖出父级.原理和之前的一样,简单吧. <di ...

  2. js拖拽原理及简单实现(渣渣自学)

    第一步 首先简单分析下需求吧,我们就是想实现鼠标拖拽带颜色的方块时,让方块停留在鼠标松开的位置,需要计算的就是拖拽前的坐标和拖拽后的坐标,鼠标移动后相对于原位置的偏移量=目标元素的偏移量,根据这个等式 ...

  3. Javascript 拖拽的一些高级的应用——逐行分析代码,让你轻松了解拖拽的原理

    我们看看之前的拖拽在周围有东西的时候会出现什么问题? 在高级浏览器中不会有啥问题,我们放到IE7下面测试一下,问题就出来了.如图 我们可以很清楚的看到,文字都已经被选中了.那这个用户体验很不好,用起来 ...

  4. Javascript 拖拽雏形中的一些问题——逐行分析代码,让你轻松了解拖拽的原理

    今天我们就来解决上一次拖拽雏形中的一些问题.下面看看有哪些问题? 附上上期的Javascript代码,方便大家查看问题. <script type="text/javascript&q ...

  5. javascript——拖拽(完整兼容代码)

    拖拽,是JS经常会用到的效果,在网上有很多的这样那样的拖拽效果,但其中往往大多有各种各养的问题,功能不全,无法兼容,而且修改的时候 也是十分麻烦. 其实拖拽的原理很简单,无非是鼠标的三个动作的解析,以 ...

  6. Android4.0 Launcher拖拽原理分析

    在Android4.0源码自带的Launcher中,拖拽是由DragController进行控制的. 1) 先来看看类之间的继承关系 2)再来看看Launcher拖拽流程的时序图   1.基本流程: ...

  7. Javascript 拖拽雏形——逐行分析代码,让你轻松了解拖拽的原理

    拖拽的原理: 其实就是鼠标与左上角的距离保持不变.我们来看下图, 这红点就是鼠标. 拖拽拖拽实际上来说就是通过鼠标的位置来计算物体的位置,就是这么简单,就是这么任性. 那这个距离怎么求呢?? 鼠标的位 ...

  8. JS鼠标的拖拽原理

    拖拽功能主要是用在让用户做一些自定义的动作,比如拖动排序,弹出框拖动移动等等,效果还是蛮不错的.下面讲解一下拖拽的原理,希望可以帮助到有需要的朋友! 一.拖拽的流程动作①鼠标按下②鼠标移动③鼠标松开 ...

  9. js拖拽原理和碰撞原理

    拖拽的原理onmousedown 选择元素onmousemove 移动元素onmouseup 释放元素 1:如果拖拽的时候有文字:被选中,会产生问题原因:当鼠标按下的时如果页面中有文字或者图片被选中的 ...

随机推荐

  1. c# load xml 中文报错

    <?xml version="1.0" encoding="GB2312"?>

  2. 导弹拦截与Dilworth定理

    这两天被Dilworth.链和反链搞到头昏脑胀,终于有点眉目,现在来总结一下. Dilworth定理说的是:对于一个偏序集,其最少链划分数等于其最长反链的长度. Dilworth定理的对偶定理说的是: ...

  3. Java核心技术点之接口

    1. 为什么使用接口 Java中的接口是一组对需求的描述.接口通过声明接口方法来对外宣布:“要想具有XX功能,就得按我说的做(即实现接口方法).” 而接口的实现类通过实现相应接口的方法来宣布:“我已经 ...

  4. ubuntu中下载sublime相关问题

    1.SublimeText3的安装 在网上搜索了一些ubuntu下关于sublime-text-3安装的方法,在这里针对自己尝试的情况进行反馈: 方法一(未成功): 在终端输入以下代码: sudo a ...

  5. css3边框阴影效果

    下面来说下css3阴影的语法: box-shadow:none | <shadow> [ , <shadow> ]* <shadow> = inset? & ...

  6. [OS] 操作系统-进程线程-经典面试笔试题

    题目转自:http://blog.csdn.net/morewindows/article/details/7392749 ·线程的基本概念.线程的基本状态及状态之间的关系? 线程,有时称为轻量级进程 ...

  7. vijos1859[TJOI2014]电源插排

    题意:小 M 的实验室有很多电源插排.这些插排的编号从 1 到 N,由左向右排成一排.每天早晨,这些插排都是没有被使用的.每当一个学生来到实验室,他就将自己的笔记本电源插到某一个未被使用的插排上.实验 ...

  8. 生成模型(Generative Model)Vs 判别模型(Discriminative Model)

      概率图分为有向图(bayesian network)与无向图(markov random filed).在概率图上可以建立生成模型或判别模型.有向图多为生成模型,无向图多为判别模型. 判别模型(D ...

  9. 【题解】51nod 1672区间交

    二分答案 + two - pointer + 树状数组大法好ヽ(゚∀゚)メ(゚∀゚)ノ 我们可以直接二分一个答案,然后检验 是否存在一个值大于等于这个二分的答案的,且覆盖次数大于等于 \(k\) 的区 ...

  10. [洛谷P4999]烦人的数学作业

    题目大意:定义$f(x)$表示$x$每一个数位(十进制)的数之和,求$\sum\limits_{i=l}^rf(i)$,多组询问. 题解:数位$DP$,可以求出每个数字的出现个数,再乘上每个数字的大小 ...