我正在寻求实现一个带有许多项目的Web界面,这些项目可以被选中并拖动以定位它们,无论是成组还是单独.真的像Windows桌面.
我们已经使用了JQuery,因此添加它是首选.JQuery UI Draggables和Selectables分别完成了我们想要的大部分工作,但并没有真正协同工作来提供我们正在寻找的那种效果.
我完全被JQ插件网站所淹没(它的'流行'算法看起来并不是非常有用),并且欢迎指导这里避免大量轮子改造的最佳方法,因为我猜这个比喻有已经完成了.
我也需要做同样的事情,我不想使用eyecon.ro的接口扩展.经过一些研究,我发现使用jQuery UI组合可选择和可拖动.很好地说,但要使代码片段运行,你必须深入研究它.我能够让它发挥作用.我略微改变了,这是我完成它的方法.它需要修改才能在生产级别上使用,但我希望它有所帮助.
// this creates the selected variable // we are going to store the selected objects in here var selected = $([]), offset = {top:0, left:0}; // initiate the selectable id to be recognized by UI $("#selectable").selectable({ filter: 'div', }); // declare draggable UI and what we are going to be doing on start $("#selectable div").draggable({ start: function(ev, ui) { selected = $(".ui-selected").each(function() { var el = $(this); el.data("offset", el.offset()); }); if( !$(this).hasClass("ui-selected")) $(this).addClass("ui-selected"); offset = $(this).offset(); }, drag: function(ev, ui) { var dt = ui.position.top - offset.top, dl = ui.position.left - offset.left; // take all the elements that are selected expect $("this"), which is the element being dragged and loop through each. selected.not(this).each(function() { // create the variable for we don't need to keep calling $("this") // el = current element we are on // off = what position was this element at when it was selected, before drag var el = $(this), off = el.data("offset"); el.css({top: off.top + dt, left: off.left + dl}); }); } });
CSS样式能够看到发生了什么:
#selectable { width: 100%; height: 100%;} #selectable div { background: #ffc; line-height: 25px; height: 25px; width: 200px; border: 1px solid #fcc; } #selectable div.ui-selected { background: #fcaf3e; } #selectable div.ui-selecting { background: #8ae234; }
HTML标记:
item 1item 2item 3item 4
这个问题是相关的,但已经过时了; 答案也是如此. 这是@ idFlood的jsfiddle 的更新版本,适用于jQuery 1.9.1 + jQueryUI 1.10.3:
// store selected elements and the offset of the dragged element var selected = $([]), offset = {top:0, left:0}; $( "#selectable > div" ).draggable({ start: function (event, ui) { var $this = $(this); if ($this.hasClass("ui-selected")) { // if this is selected, attach current offset // of each selected element to that element selected = $(".ui-selected").each(function() { var el = $(this); el.data("offset", el.offset()); }); } else { // if this is not selected, clear current selection selected = $([]); $( "#selectable > div" ).removeClass("ui-selected"); } offset = $this.offset(); }, drag: function (event, ui) { // drag all selected elements simultaneously var dt = ui.position.top - offset.top, dl = ui.position.left - offset.left; selected.not(this).each(function() { var $this = $(this); var elOffset = $this.data("offset"); $this.css({top: elOffset.top + dt, left: elOffset.left + dl}); }); } }); // enable marquee selecting and deselect on outside click... $( "#selectable" ).selectable(); // ...but manually implement selection to prevent interference from draggable() $( "#selectable" ).on("click", "div", function (e) { if (!e.metaKey && !e.shiftKey) { // deselect other elements if meta/shift not held down // $( "#dc-modules .dc-module" ).removeClass("ui-selected"); $( "#selectable > div" ).removeClass("ui-selected"); $(this).addClass("ui-selected"); } else { if ($(this).hasClass("ui-selected")) { $(this).removeClass("ui-selected"); } else { $(this).addClass("ui-selected"); } } });
我有一个问题,_mouseStop()调用抛出一个错误,所以我删除它; 这意味着ui-selecting
状态不再发生在点击,但所有其他功能保持不变.