利用JQ实现简单的拖曳效果

提出问题

如何实现将一个盒子里的元素拉到另外一个盒子里?

实现思路

  1. 此操作包含的事件有 mousedown mousemove mouseup ,对这三个事件进行监听并进行相应的操作。
  2. 操作设计的节点有:原节点,临时节点,新节点
  3. 节点的移动涉及事件e的坐标
  4. 操作元素使用JQUERY

代码实现

相应的注释在文中已有体现,请认真观看,你可以理解的。

  • 先定义一个对象 drag,包含拖曳需要用到的参数

  • 定义初始化 init 函数,监听各种鼠标事件

  • mousedown 事件:克隆一个临时节点。记录鼠标点击位置与节点的位置的X,Y差值,设置克隆副本的样式并在原容器中添加这个副本

  • mousemove 事件:判断鼠标的相对位移,设置副本绝对位置的XY,并对鼠标移出浏览器的情况进行处理;对三个UL进行遍历,在不是原容器的情况下,判断鼠标位置是否处于其他容器的范围内,如果是,修改鼠标当前容器的样式。

  • mouseup 时间:移除临时节点。对三个UL进行遍历,在不是原容器的情况下,判断鼠标位置是否处于其他容器的范围内,如果是,在该容器下加入新节点,原容器删除原节点。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>拖拽</title>
  <style>
  .container ul{
   width: 350px;
   padding: 15px;
   min-height:300px;
   background-color:#FFFFF0;
   margin:20px;
   display: inline-block;
   border-radius: 5px;
   border: 1px solid #bbb;
 }
 .container ul li{
  display: block;
  float: left;
  width: 350px;
  height: 35px;
  line-height: 35px;
  border-radius: 4px;
  margin: 0;
  padding: 0;
  list-style: none;
  background-color:#EED2EE;
  margin-bottom:10px;
  -moz-user-select: none;
  user-select: none;
  text-indent: 10px;
  color: #555;
}
</style>
</head>
<body>


  <div class="container">

   <ul>
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>e</li>
    <li>f</li>
    <li>g</li>
  </ul>

  <ul></ul>

  <ul></ul>

</div>
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js" type="text/javascript"></script>
<!-- <script src="http://www.jq22.com/jquery/jquery-1.10.2.js"></script> -->
<script type="text/javascript">

  $(function(){
    //出入允许拖拽节点的父容器,一般是ul外层的容器
    drag.init('container');
  });

//拖拽
var drag = {

  class_name : null,  //允许放置的容器
    permitDrag : false, //是否允许移动标识

    _x : 0,             //节点x坐标
  _y : 0,                   //节点y坐标
  _left : 0,          //光标与节点坐标的距离
  _top : 0,           //光标与节点坐标的距离

  old_elm : null,     //拖拽原节点
  tmp_elm : null,     //跟随光标移动的临时节点
  new_elm : null,     //拖拽完成后添加的新节点

    //初始化
    init : function (className){

      //允许拖拽节点的父容器的classname(可按照需要,修改为id或其他)
      drag.class_name = className;

      //监听鼠标按下事件,动态绑定要拖拽的节点(因为节点可能是动态添加的)
      $('.' + drag.class_name).on('mousedown', 'ul li', function(event){
          //当在允许拖拽的节点上监听到点击事件,将标识设置为可以拖拽
          drag.permitDrag = true;
          //获取到拖拽的原节点对象
          drag.old_elm = $(this);
          //执行开始拖拽的操作
          drag.mousedown(event);
          return false;
        });

      //监听鼠标移动
      $(document).mousemove(function(event){
          //判断拖拽标识是否为允许,否则不进行操作
          if(!drag.permitDrag) return false;
          //执行移动的操作
          drag.mousemove(event);
          return false;
        });

      //监听鼠标放开
      $(document).mouseup(function(event){
        //判断拖拽标识是否为允许,否则不进行操作
        if(!drag.permitDrag) return false;
        //拖拽结束后恢复标识到初始状态
        drag.permitDrag = false;
        //执行拖拽结束后的操作
        drag.mouseup(event);
        return false;
      });
    },

    //按下鼠标 执行的操作
    mousedown : function (event){

    //1.克隆临时节点,跟随鼠标进行移动
    drag.tmp_elm = $(drag.old_elm).clone();

    //2.计算 节点 和 光标 的坐标
    drag._x = $(drag.old_elm).offset().left;
    drag._y = $(drag.old_elm).offset().top;

    var e = event || window.event;
    drag._left = e.pageX - drag._x;
    drag._top = e.pageY - drag._y;

    //3.修改克隆节点的坐标,实现跟随鼠标进行移动的效果
    $(drag.tmp_elm).css({
      'position' : 'absolute',
      'background-color' : '#FF8C69',
      'left' : drag._x,
      'top' : drag._y,
    });

    //4.添加临时节点
    tmp = $(drag.old_elm).parent().append(drag.tmp_elm);
    drag.tmp_elm = $(tmp).find(drag.tmp_elm);
    $(drag.tmp_elm).css('cursor', 'move');

  },

    //移动鼠标 执行的操作
    mousemove : function (event){

    //2.计算坐标
    var e = event || window.event;
    var x = e.pageX - drag._left;
    var y = e.pageY - drag._top;
    var maxL = $(document).width() - $(drag.old_elm).outerWidth();
    var maxT = $(document).height() - $(drag.old_elm).outerHeight();
    //不允许超出浏览器范围
    x = x < 0 ? 0: x;
    x = x > maxL ? maxL: x;
    y = y < 0 ? 0: y;
    y = y > maxT ? maxT: y;

    //3.修改克隆节点的坐标
    $(drag.tmp_elm).css({
      'left' : x,
      'top' : y,
    });

    //判断当前容器是否允许放置节点
    $.each($('.' + drag.class_name + ' ul'), function(index, value){

        //获取容器的坐标范围 (区域)
        var box_x = $(value).offset().left;     //容器左上角x坐标
        var box_y = $(value).offset().top;      //容器左上角y坐标
        var box_width = $(value).outerWidth();  //容器宽
        var box_height = $(value).outerHeight();//容器高

        //给可以放置的容器加背景色
        if(e.pageX > box_x && e.pageX < box_x+box_width && e.pageY > box_y && e.pageY < box_y+box_height){

            //判断是否不在原来的容器下(使用坐标进行判断:x、y任意一个坐标不等于原坐标,则表示不是原来的容器)
            if($(value).offset().left !== drag.old_elm.parent().offset().left 
              || $(value).offset().top !== drag.old_elm.parent().offset().top){

              $(value).css('background-color', '#FFEFD5');
          }
        }else{
            //恢复容器原背景色
            $(value).css('background-color', '#FFFFF0');
        }

      });

    },

    //放开鼠标 执行的操作
    mouseup : function (event){
    //移除临时节点
    $(drag.tmp_elm).remove();

    //判断所在区域是否允许放置节点
    var e = event || window.event;

    $.each($('.' + drag.class_name + ' ul'), function(index, value){

        //获取容器的坐标范围 (区域)
        var box_x = $(value).offset().left;     //容器左上角x坐标
        var box_y = $(value).offset().top;      //容器左上角y坐标
        var box_width = $(value).outerWidth();  //容器宽
        var box_height = $(value).outerHeight();//容器高

        //判断放开鼠标位置是否想允许放置的容器范围内
        if(e.pageX > box_x && e.pageX < box_x-0+box_width && e.pageY > box_y && e.pageY < box_y-0+box_height){

            //判断是否不在原来的容器下(使用坐标进行判断:x、y任意一个坐标不等于原坐标,则表示不是原来的容器)
            if($(value).offset().left !== drag.old_elm.parent().offset().left 
              || $(value).offset().top !== drag.old_elm.parent().offset().top){
                //向目标容器添加节点并删除原节点
              tmp = $(drag.old_elm).clone();
              var newObj = $(value).append(tmp);
              $(drag.old_elm).remove();
                //获取新添加节点的对象
                drag.new_elm = $(newObj).find(tmp);
              }
            }
        //恢复容器原背景色
        $(value).css('background-color', '#FFFFF0');
      });

    },

  };

  </script>

</body>
</html>

项目demo 请点击这里

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用jQuery实现简单的拼图效果的示例代码: HTML代码: ```html <div id="puzzle"> <div class="piece" id="piece1"></div> <div class="piece" id="piece2"></div> <div class="piece" id="piece3"></div> <div class="piece" id="piece4"></div> <div class="piece" id="piece5"></div> <div class="piece" id="piece6"></div> <div class="piece" id="piece7"></div> <div class="piece" id="piece8"></div> <div class="piece" id="piece9"></div> </div> ``` CSS代码: ```css #puzzle { width: 300px; height: 300px; border: 1px solid #000; position: relative; } .piece { width: 100px; height: 100px; border: 1px solid #000; background-image: url('path/to/image.jpg'); background-size: 300px 300px; position: absolute; } #piece1 { top: 0; left: 0; } #piece2 { top: 0; left: 100px; } #piece3 { top: 0; left: 200px; } #piece4 { top: 100px; left: 0; } #piece5 { top: 100px; left: 100px; } #piece6 { top: 100px; left: 200px; } #piece7 { top: 200px; left: 0; } #piece8 { top: 200px; left: 100px; } #piece9 { top: 200px; left: 200px; } ``` jQuery代码: ```javascript $(document).ready(function() { var emptyPiece = $('#piece9'); // 空白拼图块 var pieces = $('.piece'); // 所有的拼图块 // 随机打乱拼图块的位置 pieces.sort(function() { return Math.random() - 0.5; }); // 设置每个拼图块的位置 pieces.each(function(index) { var piece = $(this); var top = Math.floor(index / 3) * 100; var left = (index % 3) * 100; piece.css({ top: top + 'px', left: left + 'px' }); // 点击拼图块时进行交换 piece.click(function() { var currentTop = parseInt(piece.css('top')); var currentLeft = parseInt(piece.css('left')); // 判断是否与空白拼图块相邻 if ((currentTop === emptyPiece.position().top && Math.abs(currentLeft - emptyPiece.position().left) === 100) || (currentLeft === emptyPiece.position().left && Math.abs(currentTop - emptyPiece.position().top) === 100)) { var tempTop = piece.css('top'); var tempLeft = piece.css('left'); piece.css({ top: emptyPiece.css('top'), left: emptyPiece.css('left') }); emptyPiece.css({ top: tempTop, left: tempLeft }); } }); }); }); ``` 在上面的示例代码中,我们首先定义了一个包含9个拼图块的容器,并使用CSS设置了每个拼图块的位置。然后在jQuery代码中,我们将所有的拼图块随机打乱位置,并为每个拼图块绑定了一个点击事件,在点击拼图块时进行交换。交换拼图块时,我们使用了jQuery的css()方法来修改每个拼图块的位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值