【问题标题】:Drag and drop without JQuery UI没有 JQuery UI 的拖放
【发布时间】:2012-03-15 03:46:08
【问题描述】:

我搜索了很多,找到了一个单独使用jQuery(没有UI)的拖放教程,但是由于JQuery UI的流行,所有的拖放功能都基于JQuery UI。

谁能给我一个提示,如何通过 JQuery 独立进行基本的拖放操作?

【问题讨论】:

标签: javascript jquery drag-and-drop draggable


【解决方案1】:

有几个插件你可以使用看看下面

http://wayfarerweb.com/jquery/plugins/animadrag/

http://threedubmedia.com/code/event/drag/demo/

它仍然是 jquery,但没有 UI

【讨论】:

    【解决方案2】:

    我认为一个很好的起点可能是规划流程,然后决定您需要为每个用户操作使用哪些 jQuery 工具。

    所以用户进程可能是:

    • 在“可拖动”区域单击您的内容 div
    • 拖动内容,将内容保留在该 div 中
    • 松开鼠标,将内容放入“可拖放”容器中,该容器将调整之前内容的大小以适应可拖放大小

    需要以下类型的事件监听器:

    • 鼠标移动
    • 鼠标按下
    • 动画

    至少。另一种选择可能是查看 jQuery UI 源代码,看看他们是如何做到的!这将告诉您确切的操作,但您可以在必要时添加或修剪。

    【讨论】:

    • 感谢您对流程的了解。会有帮助的!
    【解决方案3】:

    http://thezillion.wordpress.com/2012/09/27/javascript-draggable-2-no-jquery

    看到这个。它是核心 JS,易于实现。

    【讨论】:

      【解决方案4】:

      我发现这个非常有用: http://draggabilly.desandro.com/

      【讨论】:

      【解决方案5】:

      遇到了同样的问题,只有可拖放和可拖放的缩小 jqueryUI 的 33.4 KB 对于我需要的有限功能来说太大了。下面的方法不是工作代码 - 它只是一个简单的结构来可视化需要发生的事情。

      $('.draggable').on{
        mousemove : function(){
          var mouseposition = { // this also needs to account for onclick offset of pointer vis-a-vis element
              x : pageX,
              y : pageY 
          };
          $(this).css({
            top : mouseposition.y,
            left : mouseposition.y
          });
        if( // this statement is kinda bogus, idea is to perform a collision detection via coordinate comparison
          $('.draggable').offset().top < $(.droppable').offset().top 
          &&
          $('.draggable').offset().left < $(.droppable').offset().left
        ) {
            alert('the item has been dropped');
        }
        }
      });
      

      【讨论】:

      • 您实际上不需要 jqueryui css 文件进行拖放 - 所以缩小后的 js 约为 12k
      【解决方案6】:

      答案基于:https://www.sanwebe.com/2014/10/draggable-element-with-jquery-no-jquery-ui

      对于排序,请参阅:http://johnny.github.io/jquery-sortable/

      var draggable = $('#dragit'); //element 
      
      draggable.on('mousedown', function(e){
      	var dr = $(this).addClass("drag").css("cursor","move");
      	height = dr.outerHeight();
      	width = dr.outerWidth();
      	ypos = dr.offset().top + height - e.pageY,
      	xpos = dr.offset().left + width - e.pageX;
      	$(document.body).on('mousemove', function(e){
      		var itop = e.pageY + ypos - height;
      		var ileft = e.pageX + xpos - width;
      		if(dr.hasClass("drag")){
      			dr.offset({top: itop,left: ileft});
      		}
      	}).on('mouseup', function(e){
      			dr.removeClass("drag");
      	});
      });
      #dragit
        {
          background: red;
          width: 50px;
          height: 50px;
          cursor: move;
          position: relative;
        }
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <div id="dragit">Drag me</div>

      约束运动

      var draggable = $('#dragit-contained'); //element 
      
      draggable.on('mousedown', function(e){
      	var dr = $(this).addClass("drag").css("cursor","move");
      	height = dr.outerHeight();
      	width = dr.outerWidth();
      	max_left = dr.parent().offset().left + dr.parent().width() - dr.width();
      	max_top = dr.parent().offset().top + dr.parent().height() - dr.height();
      	min_left = dr.parent().offset().left;
      	min_top = dr.parent().offset().top;
      
      	ypos = dr.offset().top + height - e.pageY,
      	xpos = dr.offset().left + width - e.pageX;
      	$(document.body).on('mousemove', function(e){
      		var itop = e.pageY + ypos - height;
      		var ileft = e.pageX + xpos - width;
      		
      		if(dr.hasClass("drag")){
      			if(itop <= min_top ) { itop = min_top; }
      			if(ileft <= min_left ) { ileft = min_left; }
      			if(itop >= max_top ) { itop = max_top; }
      			if(ileft >= max_left ) { ileft = max_left; }
      			dr.offset({ top: itop,left: ileft});
      		}
      	}).on('mouseup', function(e){
      			dr.removeClass("drag");
      	});
      });
      .draggable-area
        {
          background: grey;
          width: 320px;
          height: 240px;
        }
      #dragit-contained
        {
          background: red;
          width: 50px;
          height: 50px;
          cursor: move;
          position: relative;
        }
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <div class="draggable-area">
      	<div id="dragit-contained">Drag me</div>
      </div>

      【讨论】:

        【解决方案7】:

        我知道这是一篇旧帖子,但我也有兴趣在没有 Jquery UI 的情况下执行此操作。我检查了上面的链接,but i found this to be the best。它只缩小了 8kb(UI 可排序 ~30,我读过),并且独立于任何庞大的 JQuery 库(尽管这些库有时可以让我们的生活更轻松)。

        【讨论】:

          猜你喜欢
          • 2010-12-27
          • 1970-01-01
          • 1970-01-01
          • 2018-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-21
          • 1970-01-01
          相关资源
          最近更新 更多