2015-05-05 13 views
18

Ho bisogno di impostare l'icona per il cursore quando un utente sta trascinando DIV (div rosso nel seguente esempio).Come cambiare l'icona del cursore durante il trascinamento in HTML5?

Ho provato diversi tentativi, incluso l'utilizzo di CSS cursor:move e event.dataTransfer.dropEffect senza esito positivo, poiché l'icona mostra sempre un "cerchio incrociato".

Qualche idea su come risolvere questo problema utilizzando l'API drag-and-drop HTML5?

http://jsbin.com/hifidunuqa/1/

<script> 
     window.app = { 
      config: { 
       canDrag: false, 
       cursorOffsetX: null, 
       cursorOffsetY: null 
      }, 
      reset: function() { 
       this.config.cursorOffsetX = null; 
       this.config.cursorOffsetY = null; 
      }, 
      start: function() { 
       document.getElementById('target').addEventListener('dragstart', function (event) { 
        console.log('+++++++++++++ dragstart') 
        this.config.cursorOffsetX = event.offsetX; 
        this.config.cursorOffsetY = event.offsetY; 
        this.adjustPostion(event); 
        event.dataTransfer.effectAllowed = 'move'; 
        event.dataTransfer.dropEffect = 'move'; 
       }.bind(this)); 
       document.getElementById('target').addEventListener('drag', function (event) { 
        console.log('+++++++++++++ drag') 
        this.adjustPostion(event); 
       }.bind(this)); 
       document.getElementById('target').addEventListener('dragend', function (event) { 
        console.log('+++++++++++++ dragend') 
        this.reset(); 
       }.bind(this));; 
      }, 
      adjustPostion: function (event) { 
       if (event.pageX <= 0 || event.pageY <= 0) { 
        console.log('skipped'); 
        return; 
       } 
       var elm = document.getElementById('target'); 
       elm.style.left = (event.pageX - this.config.cursorOffsetX) + 'px'; 
       elm.style.top = (event.pageY - this.config.cursorOffsetY) + 'px'; 
       console.log(event.pageX); 
       console.log(event.pageY); 
      } 

     }; 
    </script> 
+1

che dire di evento MouseDown? –

+0

jquery va bene? – Akshay

+0

sì, anche le soluzioni jquery sono ok. grazie – GibboK

risposta

4

uso MouseDown e MouseMove

window.app = { 
 
    dragging: false, 
 
    config: { 
 
    canDrag: false, 
 
    cursorOffsetX: null, 
 
    cursorOffsetY: null 
 
    }, 
 
    reset: function() { 
 
    this.config.cursorOffsetX = null; 
 
    this.config.cursorOffsetY = null; 
 
    }, 
 
    start: function() { 
 
    document.getElementById('target').addEventListener('mousedown', function (event) { 
 
     console.log('+++++++++++++ dragstart'); 
 
     this.dragging = true; 
 
     this.config.cursorOffsetX = event.offsetX; 
 
     this.config.cursorOffsetY = event.offsetY; 
 
     this.adjustPostion(event); 
 
    }.bind(this)); 
 
    document.getElementById('target').addEventListener('mousemove', function (event) { 
 
     if (this.dragging) { 
 
     console.log('+++++++++++++ drag'); 
 
     event.target.style.cursor = 'move'; 
 
     this.adjustPostion(event); 
 
     } 
 
    }.bind(this)); 
 
    document.getElementById('target').addEventListener('mouseup', function (event) { 
 
     console.log('+++++++++++++ dragend'); 
 
     this.dragging = false; 
 
     event.target.style.cursor = 'pointer'; 
 
     this.reset(); 
 
    }.bind(this)); 
 
    }, 
 
    adjustPostion: function (event) { 
 
    if (event.clientX <= 0 || event.clientY <= 0) { 
 
     console.log('skipped'); 
 
     return; 
 
    } 
 
    var elm = document.getElementById('target'); 
 
    elm.style.left = (event.clientX - this.config.cursorOffsetX) + 'px'; 
 
    elm.style.top = (event.clientY - this.config.cursorOffsetY) + 'px'; 
 
    console.log(event.pageX); 
 
    console.log(event.pageY); 
 
    } 
 

 
};
#target { 
 
      position: absolute; 
 
      top: 100px; 
 
      left: 100px; 
 
      width: 400px; 
 
      height: 400px; 
 
      background-color: red; 
 
      -moz-user-select: none; 
 
      -ms-user-select: none; 
 
      -webkit-user-select: none; 
 
      user-select: none; 
 
     } 
 

 
     #ui1 { 
 
      position: absolute; 
 
      top: 50px; 
 
      left: 50px; 
 
      width: 100px; 
 
      height: 400px; 
 
      background-color: blue; 
 
      z-index: 100; 
 
     } 
 

 
     #ui2 { 
 
      position: absolute; 
 
      top: 50px; 
 
      left: 550px; 
 
      width: 100px; 
 
      height: 400px; 
 
      background-color: green; 
 
      z-index: 100; 
 
     }
<!-- simulate --> 
 

 
<!DOCTYPE html> 
 
<html lang="en"> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <title>title</title> 
 
</head> 
 
<body onload="window.app.start();"> 
 
    <div id="ui1"></div> 
 
    <div id="ui2"></div> 
 
    <div id="target"></div> 
 
</body> 
 
</html>

+0

Perché è necessario controllare gli offset del cursore? L'esempio ha funzionato perfettamente, non è stato possibile replicare nella mia app, non so perché. –

+0

per assicurarti che l'elemento non salti perché quando hai fatto clic sull'elemento che hai fatto clic all'interno dell'elemento, e hai bisogno dello spostamento della posizione del cursore all'interno dell'elemento. – Ihsan

2

calcolata event.dataTransfer.setData(); dovrebbe risolvere il problema. Una volta che l'elemento è riconosciuto come trascinabile, il browser aggiungerà automaticamente un cursore di spostamento una volta trascinato. Ovviamente, dovrai rimuovere tutte le altre dichiarazioni cursor: move per vedere il cursore cambiare durante il trascinamento.

Esempio minimo:

document.getElementById('target').addEventListener('dragstart', function (event) { 
    event.dataTransfer.setData('text/plain', ''); 
}.bind(this)); 

Se si vuole ancora cambiare l'icona (ad esempio, per usare l'icona di trascinamento personalizzato), si potrebbe accedere lo stile elemento utilizzando event.target.style.cursor.

Per maggiori informazioni visita MDN Drag & Drop e MDN Recommended Drag Types

+0

Purtroppo sembra che non funzioni. using event.target.style.cursor = 'none'; non cambia il cursore. Potresti applicare la tua soluzione al mio jsfiddle e inviarmi il link? Grazie – GibboK

+0

Onestamente, non sono più esattamente sicuro di quello che stai cercando di fare. Se il tuo obiettivo è quello di modificare/rimuovere l'icona durante il trascinamento, non so se questo è possibile. Sembra che le modifiche CSS riguardino solo gli elementi, che non vengono trascinati. Ci sono alcuni suggerimenti: http://stackoverflow.com/questions/6079346/javascript-how-can-i-set-the-cursor-during-a-drag-drop-operation-on-a-website https: //developer.mozilla.org/it-it/docs/Web/Guida/HTML/Drag_operations – thenickname

+0

Corretto, ho bisogno di cambiare l'icona durante il trascinamento usando l'API drag-and-drop HTML5. Grazie per il tuo tempo. – GibboK

Problemi correlati