简体   繁体   English

拖放多个选定的卡片 || jQuery 用户界面

[英]Drag and drop multiple selected cards || JQuery ui

I have 2 columns every column has 3 cards and every card has a checkbox.我有 2 列,每列有 3 张卡片,每张卡片都有一个复选框。
my code run as drag and drop every card alone but i want to drag and drop multiple selected/checked cards in one movement and uncheck checkboxes when cards drop.我的代码以单独拖放每张卡片的方式运行,但我想在一个动作中拖放多个选定/选中的卡片,并在卡片掉落时取消选中复选框。
see live example or snippet to live preview.查看实时示例或片段以实时预览。

 $("#card-list").droppable({ accept: $(".card").draggable({ revert: true, opacity: .5 }), drop: function( event, ui ){ var dropped = ui.draggable; $(this).append(dropped.clone().removeAttr('style')); dropped.remove(); } });
 .card{ width:80px; height:80px; color:#fff; } .right-list{ background-color: #B91646 !important; } .left-list{ background-color: #1F1D36 !important; } .form-check-input{ position:absolute; top:0 !important; right:0 !important; left:0 !important; bottom:0 !important; margin:auto !important; }
 <link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.0.2/css/bootstrap.min.css" rel="stylesheet"/> <div class="row"> <div class="col-6 d-flex flex-column align-items-center"> <div class="card left-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> <div class="card left-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> <div class="card left-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> </div> <div class="col-6" id="card-list"> <div class="card right-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> <div class="card right-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> <div class="card right-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> </div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.1.3/js/bootstrap.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

Consider the following.考虑以下。

 $(function() { function moveChecked(source, target) { var items = $(".card", source).filter(function(index) { return $("input", this).is(":checked"); }); items.css({ top: "", left: "" }).appendTo(target); $("input", items).prop("checked", false); } $(".card").draggable({ revert: "invalid", opacity: .5 }); $("#card-list").droppable({ accept: ".card", drop: function(event, ui) { moveChecked($(".row > .d-flex"), this); } }); });
 .card { width: 80px; height: 80px; color: #fff; } .right-list { background-color: #B91646 !important; } .left-list { background-color: #1F1D36 !important; } .form-check-input { position: absolute; top: 0 !important; right: 0 !important; left: 0 !important; bottom: 0 !important; margin: auto !important; }
 <link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.0.2/css/bootstrap.min.css" rel="stylesheet" /> <div class="row"> <div class="col-6 d-flex flex-column align-items-center"> <div class="card left-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> <div class="card left-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> <div class="card left-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> </div> <div class="col-6" id="card-list"> <div class="card right-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> <div class="card right-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> <div class="card right-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> </div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.1.3/js/bootstrap.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

First, you cannot use accept in the way you attempted.首先,你不能像你尝试的那样使用accept Draggable should be initialized on it's own. Draggable 应该自己初始化。

I created a function yet you can do all this in the drop call back if you like.我创建了一个函数,但如果你愿意,你可以在drop回调中完成所有这些。 The function basically knows to look for Checked items and move those from the Source to the Target.该函数基本上知道查找已检查的项目并将它们从源移动到目标。 It then removes any Drag styling and unchecks the items.然后删除任何拖动样式并取消选中项目。

If you like, you can use helper to build an item that reflects all the checked items.如果您愿意,可以使用helper构建一个反映所有选中项目的项目。

See more: https://api.jqueryui.com/draggable/#option-helper查看更多: https : //api.jqueryui.com/draggable/#option-helper

Update更新

 $(function() { function hideChecked(target) { var items = $(".card", target).filter(function(index) { return $("input.form-check-input", this).is(":checked"); }); items.fadeOut("fast"); } function moveChecked(source, target) { var items = $(".card", source).filter(function(index) { return $("input", this).is(":checked"); }); items.css({ top: "", left: "" }).appendTo(target); $("input", items).prop("checked", false); items.show(); } function makeHelper(event) { var helper = $("<div>", { class: "helper" }); var count = $("#check-list input:checked").length; for (var i = 0; i < count; i++) { var offsetPos = "left+" + (i * 10) + " top+" + (i * 10); $("<div>", { class: "card left-list" }).html("&nbsp;").appendTo(helper).position({ my: offsetPos, at: "left top", of: helper }); } $(".card:last", helper).append("<input class='form-check-input' type='checkbox' checked />"); return helper.get(0); } $("#check-list .card").draggable({ appendTo: ".row", revert: function(dragObj) { if (dragObj === false) { $("#check-list .card").show(); return true; } else { return false; } }, opacity: .5, helper: makeHelper, start: function(event, ui) { hideChecked($("#check-list")); } }); $("#card-list").droppable({ accept: ".card", drop: function(event, ui) { moveChecked($(".row > .d-flex"), this); } }); });
 .card { width: 80px; height: 80px; color: #fff; } .right-list { background-color: #B91646 !important; } .left-list { background-color: #1F1D36 !important; } .form-check-input { position: absolute; top: 0 !important; right: 0 !important; left: 0 !important; bottom: 0 !important; margin: auto !important; } .helper { position: relative; } .helper .card { position: absolute; }
 <link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.0.2/css/bootstrap.min.css" rel="stylesheet" /> <div class="row"> <div class="col-6 d-flex flex-column align-items-center" id="check-list"> <div class="card left-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> <div class="card left-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> <div class="card left-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> </div> <div class="col-6" id="card-list"> <div class="card right-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> <div class="card right-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> <div class="card right-list mb-3"> <input class="form-check-input" type="checkbox" value="" aria-label="..."> </div> </div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.1.3/js/bootstrap.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

Reference: jQuery ui.draggable event/status on revert参考: jQuery ui.draggable 事件/状态恢复

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM