2016-08-05 12 views
0

私はスケジューラの作成に取り組んでいます。私はinteract.jsを使ってすべてのドラッグを処理しています&要素のドロップ/スナップですが、ハードウェアセンタリングと要素をTDにスナップするようにするInteract.js tdの中心にドラッグした設定

this fiddle to see what I gotをチェックすることができます。ドラッグ可能なものを任意のセルの左上隅にドラッグすると、スナップが動作しますが、中央には表示されませんその要素、またはいつも起こることもなく、スナップが機能するための特定の位置になければならず、必ずしもセルの内側にスナップするわけではありません。いつか、ドラッグ要素はその一部をセルから取り出します。

プラグインgithubのSnapサンプルを既に見直しましたが、私が探しているものをどのように達成するかというアイディアがありました。グリッドシステムは私にとってはうまくいかないでしょう。なぜなら、プロジェクトはある種の空白として空の列を要求するからです。

ご協力いただければ幸いです。スナップが起こることを意図している場合、細胞上記

十字架があり、私が意味する、それは完璧な、アンカーの位置ではないですが、私はまだこれはコード

である彼らに

を中心に取り組んでいます

var element = document.getElementById("schedule"); 
     var anchors = []; 
     document.querySelectorAll(".dropzone").forEach(function (td, i) { 
      var boundRect = td.getBoundingClientRect(); 
      var anchor = { 
       x: boundRect.left + 30, 
       y: boundRect.top + 15, 
       range: 20 
      } 
      anchors.push(anchor); 
     }); 
     anchors.forEach(function(anchor, i){ 
      var textNode = document.createElement("div"); 
      textNode.appendChild(document.createTextNode("+")); 
      textNode.style.position = "absolute"; 
      textNode.style.top = anchor.y + "px"; 
      textNode.style.left = anchor.x + "px"; 
      textNode.style.zIndex = 100; 
      textNode.style.fontWeight = "bolder"; 
      document.querySelector("#wrapper").appendChild(textNode); 
     }); 

     // target elements with the "draggable" class 
     interact('.draggable') 
      .draggable({ 
       // enable inertial throwing 
       inertia: true, 
       // snapping to grid 
       snap: { 
        targets: anchors, 
        enabled: true, 
        endOnly: true, 
        //offset: 'startCoords' 
       }, 
       // keep the element within the area of it's parent 
       restrict: { 
        drag: element, 
        endOnly: false, 
        elementRect: { top: 0, left: 0, bottom: 1, right: 1 } 
       }, 
       // enable autoScroll 
       autoScroll: true, 
       // call this function on every dragmove event 
       onmove: dragMoveListener, 
       // call this function on every dragend event 
       onend: function (event) { 
       } 
      }); 

     // enable draggables to be dropped into this 
      interact('.dropzone').dropzone({ 
       // only accept elements matching this CSS selector 
       accept: '#dragabble', 
       // Require a 75% element overlap for a drop to be possible 
       overlap: 0.6, 

       // listen for drop related events: 

       ondropactivate: function (event) { 
        // add active dropzone feedback 
        event.target.classList.add('drop-active');      
       }, 
       ondragenter: function (event) { 
        var draggableElement = event.relatedTarget, 
        dropzoneElement = event.target; 

        // feedback the possibility of a drop 
        dropzoneElement.classList.add('drop-target'); 
        draggableElement.classList.add('can-drop'); 
        draggableElement.textContent = 'Dragged in'; 
        var dropRect = interact.getElementRect(event.target), 
        dropCenter = { 
         x: dropRect.left + 30, 
         y: dropRect.top + 15 
        }; 

        event.draggable.snap({ 
         anchors: dropCenter 
        }); 
       }, 
       ondragleave: function (event) { 
        // remove the drop feedback style 
        event.target.classList.remove('drop-target'); 
        event.relatedTarget.classList.remove('can-drop'); 
        event.relatedTarget.textContent = 'Dragged out'; 
        event.draggable.snap(false);      
       }, 
       ondrop: function (event) { 
        event.relatedTarget.textContent = 'Dropped'; 
       }, 
       ondropdeactivate: function (event) { 
        // remove active dropzone feedback 
        event.target.classList.remove('drop-active'); 
        event.target.classList.remove('drop-target'); 
       } 
      }); 

     function dragMoveListener(event) { 
      var target = event.target, 
      // keep the dragged position in the data-x/data-y attributes 
      x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx, 
      y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy; 

      // translate the element 
      target.style.webkitTransform = 
      target.style.transform = 
       'translate(' + x + 'px, ' + y + 'px)'; 

      // update the posiion attributes 
      target.setAttribute('data-x', x); 
      target.setAttribute('data-y', y); 
     } 

     // this is used later in the resizing and gesture demos 
     window.dragMoveListener = dragMoveListener; 

答えて

1

まあ、気にしないで、私は自分が望むやり方で自分のスナップを実装することに決めました。

は、私はちょうどそれが上陸したTDの中心に dragabbleを設定するには、 ondropイベントに少しのコードを追加し、それは私が

var element = document.getElementById("schedule"); 
 

 
     // target elements with the "draggable" class 
 
     interact('.draggable') 
 
      .draggable({ 
 
       // enable inertial throwing 
 
       inertia: true, 
 
       // keep the element within the area of it's parent 
 
       restrict: { 
 
        drag: element, 
 
        endOnly: true, 
 
        elementRect: { top: 0, left: 0, bottom: 1, right: 1 } 
 
       }, 
 
       // enable autoScroll 
 
       autoScroll: true, 
 
       // call this function on every dragmove event 
 
       onmove: dragMoveListener, 
 
       // call this function on every dragend event 
 
       onend: function (event) { 
 
       } 
 
      }); 
 

 
     // enable draggables to be dropped into this 
 
      interact('.dropzone').dropzone({ 
 
       // only accept elements matching this CSS selector 
 
       accept: '#dragabble', 
 
       // Require a 75% element overlap for a drop to be possible 
 
       overlap: 0.6, 
 

 
       // listen for drop related events: 
 

 
       ondropactivate: function (event) { 
 
        // add active dropzone feedback 
 
        event.target.classList.add('drop-active');      
 
       }, 
 
       ondragenter: function (event) { 
 
        var draggableElement = event.relatedTarget, 
 
        dropzoneElement = event.target; 
 

 
        // feedback the possibility of a drop 
 
        dropzoneElement.classList.add('drop-target'); 
 
        draggableElement.classList.add('can-drop'); 
 
        draggableElement.textContent = 'Dragged in'; 
 
       }, 
 
       ondragleave: function (event) { 
 
        // remove the drop feedback style 
 
        event.target.classList.remove('drop-target'); 
 
        event.relatedTarget.classList.remove('can-drop'); 
 
        event.relatedTarget.textContent = 'Dragged out'; 
 
       }, 
 
       ondrop: function (event) { 
 
        var draggableElement = event.relatedTarget, 
 
         dropzoneElement = event.target, 
 
         dropRect = getOffset(dropzoneElement), 
 
         x = dropRect.left, 
 
         y = dropRect.top; 
 
        draggableElement.textContent = 'Dropped'; 
 
        // translate the element 
 
        draggableElement.style.webkitTransform = 
 
        draggableElement.style.transform = 
 
         'translate(' + x + 'px, ' + y + 'px)'; 
 

 
        // update the posiion attributes 
 
        draggableElement.setAttribute('data-x', x); 
 
        draggableElement.setAttribute('data-y', y);     
 
        event.relatedTarget.textContent = 'Dropped'; 
 
       }, 
 
       ondropdeactivate: function (event) { 
 
        // remove active dropzone feedback 
 
        event.target.classList.remove('drop-active'); 
 
        event.target.classList.remove('drop-target'); 
 
       } 
 
      }); 
 

 
     function dragMoveListener(event) { 
 
      var target = event.target, 
 
      // keep the dragged position in the data-x/data-y attributes 
 
      x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx, 
 
      y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy; 
 

 
      // translate the element 
 
      target.style.webkitTransform = 
 
      target.style.transform = 
 
       'translate(' + x + 'px, ' + y + 'px)'; 
 

 
      // update the posiion attributes 
 
      target.setAttribute('data-x', x); 
 
      target.setAttribute('data-y', y); 
 
     } 
 

 
     function getOffset(el) { 
 
      el = el.getBoundingClientRect(); 
 
      return { 
 
      left: el.left + window.scrollX, 
 
      top: el.top + window.scrollY 
 
      } 
 
     } 
 
     // this is used later in the resizing and gesture demos 
 
     window.dragMoveListener = dragMoveListener;
 td 
 
     { 
 
      width: 68px; 
 
      height: 32px; 
 
     } 
 
     
 
     #wrapper 
 
     { 
 
      width: 100%; 
 
      height: 100%; 
 
     } 
 
     
 
     #dropZone { 
 
      height: 140px; 
 
      background-color: Gray; 
 
     } 
 
     
 
     .dropzone { 
 
      background-color: #ccc; 
 
      border: dashed 4px transparent; 
 
      border-radius: 4px; 
 
      /*margin: 10px auto 30px;*/ 
 
      padding: 6px; 
 
      /*width: 80%;*/ 
 
      transition: background-color 0.3s; 
 
     } 
 
     
 
     .drop-active { 
 
      border-color: #aaa; 
 
     } 
 

 
     .drop-target { 
 
      background-color: #29e; 
 
      border-color: #fff; 
 
      border-style: solid; 
 
     } 
 

 
     .drag-drop { 
 
      display: inline-block; 
 
      width: 60px; 
 
      height: 30px; 
 
      /*padding: 2em 0.5em;*/ 
 

 
      color: #fff; 
 
      background-color: #29e; 
 
      border: solid 2px #fff; 
 

 
      -webkit-transform: translate(0px, 0px); 
 
        transform: translate(0px, 0px); 
 

 
      transition: background-color 0.3s; 
 
     } 
 

 
     .drag-drop.can-drop { 
 
      color: #000; 
 
      background-color: #4e4; 
 
     } 
 

 
     #draggable::before { 
 
      content: "#" attr(id); 
 
      font-weight: bold; 
 
     }
<script src="http://cdnjs.cloudflare.com/ajax/libs/interact.js/1.2.6/interact.min.js"></script> 
 
<div id="wrapper"> 
 
     <div id="dragabble" class="draggable drag-drop"> 
 
      #yes-drop 
 
     </div> 
 

 
     <!--<div id="dropZone" class="dropzone"></div>--> 
 
     <table id="schedule" width="100%"> 
 
      <thead> 
 
       <tr> 
 
        <th></th> 
 
        <th>Ven1</th> 
 
        <th>Ven2</th> 
 
        <th>Ven3</th> 
 
        <th>Ven4</th> 
 
        <th>Ven5</th> 
 
        <th>N.Crane</th> 
 
        <th>S.Crane</th> 
 
        <th>TrainWell 1</th> 
 
        <th>TrainWell 2</th> 
 
        <th>InbShip</th> 
 
        <th>InbCoat</th> 
 
        <th>InbTrain</th> 
 
       </tr> 
 
      </thead> 
 
      <tbody> 
 
       <tr> 
 
        <td>0/0[2]</td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
       </tr> 
 
       <tr> 
 
        <td>0/6[3]</td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
       </tr> 
 
       <tr> 
 
        <td>0/6[2]</td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
       </tr> 
 
       <tr> 
 
        <td>0/6[4]</td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
        <td class="dropzone"></td> 
 
       </tr> 
 
      </tbody> 
 
     </table> 
 
    </div>

任意の方法を必要とするスナップを作りました誰かが提案を持っているか、interact.jsのスナップ機能を使ってそれを動作させる方法を知っているなら、スナップグリッドやアンカーであればそれは大丈夫です

関連する問題