【发布时间】:2012-03-15 03:46:08
【问题描述】:
我搜索了很多,找到了一个单独使用jQuery(没有UI)的拖放教程,但是由于JQuery UI的流行,所有的拖放功能都基于JQuery UI。
谁能给我一个提示,如何通过 JQuery 独立进行基本的拖放操作?
【问题讨论】:
标签: javascript jquery drag-and-drop draggable
我搜索了很多,找到了一个单独使用jQuery(没有UI)的拖放教程,但是由于JQuery UI的流行,所有的拖放功能都基于JQuery UI。
谁能给我一个提示,如何通过 JQuery 独立进行基本的拖放操作?
【问题讨论】:
标签: javascript jquery drag-and-drop draggable
有几个插件你可以使用看看下面
http://wayfarerweb.com/jquery/plugins/animadrag/
http://threedubmedia.com/code/event/drag/demo/
它仍然是 jquery,但没有 UI
【讨论】:
我认为一个很好的起点可能是规划流程,然后决定您需要为每个用户操作使用哪些 jQuery 工具。
所以用户进程可能是:
需要以下类型的事件监听器:
至少。另一种选择可能是查看 jQuery UI 源代码,看看他们是如何做到的!这将告诉您确切的操作,但您可以在必要时添加或修剪。
【讨论】:
http://thezillion.wordpress.com/2012/09/27/javascript-draggable-2-no-jquery
看到这个。它是核心 JS,易于实现。
【讨论】:
我发现这个非常有用: http://draggabilly.desandro.com/
【讨论】:
遇到了同样的问题,只有可拖放和可拖放的缩小 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');
}
}
});
【讨论】:
答案基于: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>
【讨论】:
我知道这是一篇旧帖子,但我也有兴趣在没有 Jquery UI 的情况下执行此操作。我检查了上面的链接,but i found this to be the best。它只缩小了 8kb(UI 可排序 ~30,我读过),并且独立于任何庞大的 JQuery 库(尽管这些库有时可以让我们的生活更轻松)。
【讨论】: