js拖拽换位置,使用数组方法

之前一直需要一个拖拽效果,网上找了些感觉不是不好用,就是写的有些地方让人不太满意,下面贡献一个自己写的。亲测可用,拖动后可互换位置!(带有注释)

方法/步骤
CSS代码部分
<style>
* { padding:0;margin:0;list-style: none }
html,body { height:100%; overflow:hidden; }
ul { margin:50px auto;position:relative; width:1100px; height:500px;}
ul li { float:left; width:25%; cursor:pointer; padding:10px; box-sizing:border-box; height:33%}
ul img { height:100%;width:100%; box-shadow:0 3px 4px rgba(102,102,102,0.5) }
</style>
JS代码部分
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
$(function(){

        var ps={L:[],R:[],T:[],B:[]};
        for(var i=11; i>=0; i--){
                var oLi = $(‘li‘).eq(i),
                        gLi = oLi.get(0);

                oLi.css({‘left‘:gLi.offsetLeft+‘px‘,‘top‘:gLi.offsetTop+‘px‘,‘position‘:‘absolute‘,‘margin‘:0});
                ps.L.push(gLi.offsetLeft);
                ps.T.push(gLi.offsetTop);
                ps.R.push(gLi.offsetLeft + gLi.offsetWidth);
                ps.B.push(gLi.offsetTop + gLi.offsetHeight);
        };
           ps.L = ps.L.reverse();
                ps.R = ps.R.reverse();
                 ps.T = ps.T.reverse();
                  ps.B = ps.B.reverse();  //储存位置                   

        //初始化
        var b = 0;

        $(document).on(‘mousedown‘,‘li‘,function(e){
             e.preventDefault();
                 var _this = this;
                 if(_this.setCapture){_this.setCapture()};
                 var X = e.clientX - _this.offsetLeft,
                     Y = e.clientY - _this.offsetTop,
                     oList = $(‘li‘),
                         attr = [];
                     my_index = $( _this ).attr(‘index‘);     //初始保存一个原来的Index,回到原来的数组(位置)
                     $(_this).css({‘opacity‘:0.9,‘zIndex‘:1});
                     document.index = my_index;             //目的是为了脱离变量作用域

                          $(‘li‘).each(function() {
                                  attr.push( $(this).attr(‘index‘) )
                          });                

        $(document).on(‘mousemove‘,function(e){
             var lt = e.clientX - X,
                     tp = e.clientY - Y,
                     screen_l = e.clientX - _this.parentNode.offsetLeft,
                     screen_t = e.clientY - _this.parentNode.offsetTop;
                 $(_this).css({‘left‘:lt+‘px‘,‘top‘:tp+‘px‘});

                 for(var i=0;i<12;i++){

                        var he_index = parseInt(oList.eq(i).attr(‘index‘));
                    if(screen_l>ps.L[he_index]&&screen_l<ps.R[he_index]&&screen_t>ps.T[he_index]&&screen_t<ps.B[he_index]){
                                var i_index = parseInt($(_this).attr(‘index‘));
                if(he_index == i_index)continue;
                                document.index = he_index;              //当找到元素保存要抵达的位置的index
                                document.flag = false;
                                var test = function (num,j){
                                           var he_Li = $(‘li[index=‘+j+‘]‘);
                                           $(he_Li).stop();
                                           he_Li.animate({
                                                   left:ps.L[j+num],
                                                   top:ps.T[j+num]
                                           },‘fast‘);
                                           he_Li.attr(‘index‘,j+num);
                                 };
                                 //利用属性选择器找到对应index(也就是找到数组相应位置)的元素;并且变换属性index到相应的数组索引;

                                 if(i_index>he_index){
                                         for(var j=i_index-1; j>=he_index; j--){
                            test(1,j);
                                         }
                                 }else{
                                         for(var j=i_index+1; j<he_index+1; j++){
                            test(-1,j);
                                         }
                                 };
                                 $(_this).attr(‘index‘,he_index);  //变换_this的index
                                 document.flag = true;

                        }else{
                 if(document.flag){
                         var parent = _this.parentNode,
                                                 parent_X = e.clientX - parent.offsetLeft,
                                                 parent_Y = e.clientY - parent.offsetTop;
                                         if( parent_X<0||parent_X>parent.offsetWidth||parent_Y<0||parent_Y>parent.offsetHeight ){
                                      oList.not(_this).each(function(index, element) {
                                                        var a = $(element).index();
                                $(element).animate({
                                                                   left:ps.L[attr[a]],
                                                                   top:ps.T[attr[a]]
                                                            },‘fast‘).attr(‘index‘,attr[a])
                         });
                             document.index = my_index;
                                                 $(_this).attr(‘index‘,my_index);
                                             document.flag = false;
                                                 //当移出父节点还原
                                         }

                                 }
                    };

                 };
        });
        $(document).on(‘mouseup‘,function(){
         if(_this.releaseCapture){
                     _this.releaseCapture();
                 };
                 $(this).off(‘mousemove‘);
                 $(this).off(‘mouseup‘);

                 $(_this).animate({
                                left:ps.L[document.index],
                                top:ps.T[document.index]
                 },‘fast‘,function(){
                                $(_this).css({‘opacity‘:1,‘zIndex‘:0})
                 });
                 delete document.index;
                 delete document.flag;

        });
        });

})
</script>
上面的是网页 head区域, 下面的是 body区域
 <ul>
    <li index="0"><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
    <li index="1"><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
    <li index="2"><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
    <li index="3"><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
    <li index="4"><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
    <li index="5"><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
    <li index="6"><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
    <li index="7"><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
    <li index="8"><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
    <li index="9"><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
    <li index="10"><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
    <li index="11"><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>

  </ul>

  

时间: 2024-10-17 05:15:44

js拖拽换位置,使用数组方法的相关文章

一步一步实现JS拖拽插件

js拖拽是常见的网页效果,本文将从零开始实现一个简单的js插件. 一.js拖拽插件的原理 常见的拖拽操作是什么样的呢?整过过程大概有下面几个步骤: 1.用鼠标点击被拖拽的元素 2.按住鼠标不放,移动鼠标 3.拖拽元素到一定位置,放开鼠标 这里的过程涉及到三个dom事件:onmousedown,onmousemove,onmouseup.所以拖拽的基本思路就是: 1.用鼠标点击被拖拽的元素触发onmousedown (1)设置当前元素的可拖拽为true,表示可以拖拽 (2)记录当前鼠标的坐标x,y

React.js实现原生js拖拽效果及思考

一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖拽效果. 首先,其实拖拽效果的思路是很简单的.主要就是三个步骤: 1.onmousedown的时候,启动可拖拽事件,记录被拖拽元素的原始坐标参数. 2.onmousemove的时候,实时记录鼠标移动的距离,结合被拖拽元素第一阶段的坐标参数,计算并设置新的坐标值. 3.onmouseup的时候,关闭可拖拽事件

再谈React.js实现原生js拖拽效果

前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目地就是要尽量避免直接操作dom元素,所以我们在对dom元素进行操作的时候需要注意,我之前为了获取form的参数就直接用了var dragBox=document.getElementById('form')去找dom,但是其实记录from的初始位置,可以在其子组件更新父组件参数的时候调用.即在MyF

js拖拽效果实现

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head>    <meta

JS拖拽

拖拽原理    a, 被拖拽物体绝对定位    b, 按下时记录鼠标在拖拽物体上的位置,拖拽时鼠标在拖拽物体上的位置保持不变    c, 鼠标移动时改变拖拽物体位置 1,简易拖拽 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>拖拽原型</title> <script type="text/javascript" sr

控件拖拽置换位置

简单的一个控件拖拽交换位置Demo,有些场景下会用到,关于此类功能网上有很多例子,而且Google官方API中也有相应的接口,对这种业务需求进行了一定逻辑封装.这里没有采用官方接口,单纯的从触摸事件入手来简单的实现控件位置交换. 写代码之前先理清楚实现的思路,这里从控件的触摸事件入手,触摸事件有ACTION_DOWN.ACTION_MOVE.ACTION_UP这几个状态,下面先把实现逻辑的思路写出来: 1.界面加载完成后用一个List记录各个子控件相对于父控件的坐标,同时将这些子控件放入一个Li

js拖拽分析

js拖拽分析 思路 1.三个鼠标事件,mousedown,mousemove,mouseup 2.可移动性absolute 3.边界限制 得到鼠标点击处和div边界的距离,然后得出top 和 left 的值 具体 mousedown div.onmousedown=function(event){ var event=event||window.event var diffX=event.clientX-div.offsetLeft var diffY=event.clientY-div.off

php+mysql+js拖拽div实例

php+mysql+js拖拽div实例 代码已改好,放在目录下可直接使用.适合新手学习! 效果如下图,比较适合做可以移动,拖拽的留言板. 实现思路: 思路也是很简单了,就是js获取定位后的数据,然后请求给PHP,php将定位的横向坐标和纵向坐标存到数据库! 代码实例下载地址:http://download.csdn.net/detail/u011986449/8099045

js拖拽效果的原理及实现

js中元素的拖拽效果需要用到的主要的知识点为:事件侦听和鼠标事件.即被拖拽的元素添加事件侦听,侦听的事件主要为mousedown,mousemove和mouseup,一些情况下还需要用到mouseleave.本篇所针对的原理是存在多个相同元素情况下的拖拽.下面结合案例进行分析.1.首先在body中创建7个div元素,并设置css样式. <style> div{ width:50px; height: 50px; background-color: red; position: absolute