两列 portal 示例

Source
Output
QRCode
<!doctype html> <html> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-touch-fullscreen" content="yes"> <style type="text/css"> body{ background: #fff; } </style> <title>两列 portal 示例</title> <style> #cols { width: 600px; } #leftCol, #rightCol { margin-left: 20px; float: left; border: 1px solid red; } #rightCol { border: 1px solid green; } .component { width: 100px; height: 100px; margin: 50px; border: 1px solid purple; -ms-touch-action: none; -ms-user-select: none; } .col .header { border-bottom: 1px solid purple; cursor: move; } .ks-dd-dragging *, .ks-dd-proxy * { visibility: hidden; } .ks-dd-drop-over { background: #ffff00; } .ks-dd-proxy,.ks-dd-dragging { border: 2px blue dashed; } .ks-dd-proxy { position: absolute; left: -9999px; top: -9999px; } </style> </head> <body> <h1>两列 portal 示例</h1> <p> 拖动组件头部或布局列的头部调整位置 </p> <div id="cols"> <div id="leftCol" class="col" style=" width: 250px;height: 400px;"> <div class="header"> 一列头部 drag me </div> <div class="component"> <div class="header"> 组件头部 drag me </div> </div> </div> <div id="rightCol" class="col" style=" width: 250px;height: 400px;"> <div class="header"> 二列头部 drag me </div> <div class="component"> <div class="header"> 组件头部 drag me </div> </div> </div> <div style="clear:both;"></div> </div> <script src="//g.alicdn.com/kissy/k/5.0.1/seed-debug.js"></script> <script> require(['dd','util','node','dd/plugin/proxy','dd/plugin/scroll'], function (DD,util, Node, Proxy, Scroll) { var DDM = DD.DDM, $ = Node.all, DraggableDelegate = DD.DraggableDelegate, DroppableDelegate = DD.DroppableDelegate, Draggable = DD.Draggable, Droppable = DD.Droppable; var proxy = new Proxy({ /** * 如何产生替代节点 * @param drag 当前拖对象 */ node: function (drag) { var n = $(drag.get("dragNode").clone(true)); n.attr('id', util.guid("ks-dd-proxy")); n.css("opacity", 0.2); return n; }, moveOnEnd: false, destroyOnEnd: true }); var dragDelegate = new DraggableDelegate({ container: "#cols", move: 1, handlers: ['.header'], selector: function (el) { el = $(el); return el.hasClass('col') || el.hasClass('component'); } }); dragDelegate.plug(proxy); /** * 一列也为可拖放节点,防止空列无法拖入 */ new DroppableDelegate({ container: "#cols", selector: '.col' }); /** * 单个 component 为可拖放节点 */ new DroppableDelegate({ container: "#cols", selector: '.component' }); dragDelegate.on("dragover", function (ev) { var drag = ev.drag; var drop = ev.drop; var dragNode = drag.get("dragNode"), dropNode = drop.get("node"); if (dragNode.hasClass("component")) { if (dropNode.hasClass("col")) { var nodes = dropNode.all(".component"); if (nodes.length) { if (nodes.length == 1 && ( nodes[0] === drag.get("node")[0] && nodes[0] !== drag.get("dragNode")[0]) ) { // 只有 proxy } else { return; } } //空列 dropNode.append(dragNode); } else { // 纵轴中线位置 var middleDropY = (dropNode.offset().top * 2 + dropNode.height()) / 2; //当前鼠标位置 if (ev.pageY > middleDropY) { var next = dropNode.next(); if (next && next[0] == dragNode) { } else { dragNode.insertAfter(dropNode); } } else { var prev = dropNode.prev(); if (prev && prev[0] == dragNode) { } else { dragNode.insertBefore(dropNode); } } } } // 列之间拖动 else if (dropNode.hasClass("col")) { // 横轴中线位置 var middleDropX = (dropNode.offset().left * 2 + dropNode.width()) / 2; //当前鼠标位置 if (ev.pageX > middleDropX) { next = dropNode.next(); if (next && next[0] == dragNode) { } else { dragNode.insertAfter(dropNode); } } else { prev = dropNode.prev(); if (prev && prev[0] == dragNode) { } else { dragNode.insertBefore(dropNode); } } } }); }); </script> </body> </html>