ホームページ > ウェブフロントエンド > jsチュートリアル > jQueryは単純なドラッグ効果を実装します

jQueryは単純なドラッグ効果を実装します

小云云
リリース: 2018-01-04 14:18:36
オリジナル
1752 人が閲覧しました

この記事では、jQuery を使用して簡単なドラッグ効果を実現するための関連情報を主に紹介します。私は、個人的に、これが非常に優れたユーザー エクスペリエンスであると考えました。参考までに、編集者をフォローして詳細な紹介を見てみましょう。

前書き

この記事では主に jQuery を使用した簡単なドラッグ エフェクトを紹介し、参考と学習のために共有します。以下では多くを述べません。詳細な紹介を見てみましょう。

質問する

あるボックスから別のボックスに要素をプルするにはどうすればよいですか?

実装アイデア

  • この操作に含まれるイベントは、mousedown、mousemove、mouseup の 3 つのイベントを監視し、対応する操作を実行します。

  • 操作設計のノードは、元のノード、一時ノード、新しいノードです

    ​​
  • ノードの移動にはイベントの座標が関係します

  • 操作要素はJQUERYを使用して実装されます

該当するコメントは記事内に反映されておりますので、よく読んでいただければご理解いただけます。

    最初に、ドラッグに必要なパラメータを含むオブジェクトのドラッグを定義します
  • さまざまなマウスイベントをリッスンするための初期化 init 関数を定義します
  • mousedown イベント: 一時的なノードのクローンを作成します。マウスのクリック位置とノードの位置の X、Y の差を記録し、クローン コピーのスタイルを設定し、このコピーを元のコンテナに追加します
  • mousemove イベント: マウスの相対的な変位を決定し、XY を設定しますコピーの絶対位置を確認し、マウスを調整します。ブラウザから移動する状況を処理し、3 つの UL を横断し、元のコンテナでない場合は、マウスの位置が他のコンテナの範囲内にあるかどうかを判断します。その場合、マウスの現在のコンテナのスタイルが変更されます。
  • マウスアップ時間: 一時ノードを削除します。 3 つの 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>
    
    
     <p 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>
    
    </p>
    <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(&#39;background-color&#39;, &#39;#FFEFD5&#39;);
       }
      }else{
       //恢复容器原背景色
       $(value).css(&#39;background-color&#39;, &#39;#FFFFF0&#39;);
      }
    
      });
    
     },
    
     //放开鼠标 执行的操作
     mouseup : function (event){
     //移除临时节点
     $(drag.tmp_elm).remove();
    
     //判断所在区域是否允许放置节点
     var e = event || window.event;
    
     $.each($(&#39;.&#39; + drag.class_name + &#39; ul&#39;), 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>
    ログイン後にコピー
  • プロジェクトのデモはここをクリックしてください。

関連する推奨事項:


TP5はWebuploaderを統合してプレビュードラッグ検索と削除を実現

zTreeプラグインを使用してドラッグアンドドロップ機能を実装するjQueryの例の説明

テーブルマウスドラッグソートの実装HTML の関数

以上がjQueryは単純なドラッグ効果を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート