2012-10-31 29 views
12

Voglio creare un div mobile/trascinabile in javascript nativo senza utilizzare jquery e librerie. C'è un tutorial o anythign?Creare un div trascinabile in javascript nativo

+0

Date un'occhiata qui [http://stackoverflow.com/questions/9334084/moveable-draggable-div-using-javascript] – prageeth

+0

Per darti un'idea di base su come funziona: prima devi collegare i gestori di eventi onmousedown e onmouseup a un div . Quindi è necessario modificare le coordinate xey di div in quelle della posizione del puntatore (ma è necessario tenere conto dell'offset a cui l'elemento è stato prima trascinato).Oh, e non dimenticare di impostare la posizione dell'elemento su "assoluto" – KaeruCT

risposta

15

OK, ecco il mio codice personale che uso per implementazioni lightweight (progetti in cui si utilizza una libreria o non è consentito o eccessivo per qualche motivo). Per prima cosa, io uso sempre questa funzione convenienza in modo che possa passare sia un id o l'elemento DOM attuale:

function get (el) { 
    if (typeof el == 'string') return document.getElementById(el); 
    return el; 
} 

Come bonus, get() è più corto da digitare rispetto document.getElementById() e il mio codice finisce più breve.

In secondo luogo, rendersi conto che ciò che la maggior parte delle librerie sta facendo è la compatibilità cross-browser. Se tutti i browser si comportano allo stesso modo, il codice è abbastanza banale. Quindi, consente di scrivere alcune funzioni cross-browser per ottenere la posizione del mouse:

function mouseX (e) { 
    if (e.pageX) { 
    return e.pageX; 
    } 
    if (e.clientX) { 
    return e.clientX + (document.documentElement.scrollLeft ? 
     document.documentElement.scrollLeft : 
     document.body.scrollLeft); 
    } 
    return null; 
} 

function mouseY (e) { 
    if (e.pageY) { 
    return e.pageY; 
    } 
    if (e.clientY) { 
    return e.clientY + (document.documentElement.scrollTop ? 
     document.documentElement.scrollTop : 
     document.body.scrollTop); 
    } 
    return null; 
} 

OK, le due funzioni sopra sono identiche. Ci sono sicuramente modi migliori per scriverli, ma per ora lo tengo (relativamente) semplice.

Ora possiamo scrivere il codice di trascinamento della selezione. La cosa che mi piace di questo codice è che tutto è catturato in una singola chiusura, quindi non ci sono variabili globali o funzioni di supporto che ingombrano il browser. Inoltre, il codice separa la maniglia di trascinamento dall'oggetto che viene trascinato. Questo è utile per creare finestre di dialogo, ecc. Ma se non è necessario, è sempre possibile assegnare loro lo stesso oggetto. Comunque, ecco il codice:

function dragable (clickEl,dragEl) { 
    var p = get(clickEl); 
    var t = get(dragEl); 
    var drag = false; 
    offsetX = 0; 
    offsetY = 0; 
    var mousemoveTemp = null; 

    if (t) { 
    var move = function (x,y) { 
     t.style.left = (parseInt(t.style.left)+x) + "px"; 
     t.style.top = (parseInt(t.style.top) +y) + "px"; 
    } 
    var mouseMoveHandler = function (e) { 
     e = e || window.event; 

     if(!drag){return true}; 

     var x = mouseX(e); 
     var y = mouseY(e); 
     if (x != offsetX || y != offsetY) { 
     move(x-offsetX,y-offsetY); 
     offsetX = x; 
     offsetY = y; 
     } 
     return false; 
    } 
    var start_drag = function (e) { 
     e = e || window.event; 

     offsetX=mouseX(e); 
     offsetY=mouseY(e); 
     drag=true; // basically we're using this to detect dragging 

     // save any previous mousemove event handler: 
     if (document.body.onmousemove) { 
     mousemoveTemp = document.body.onmousemove; 
     } 
     document.body.onmousemove = mouseMoveHandler; 
     return false; 
    } 
    var stop_drag = function() { 
     drag=false;  

     // restore previous mousemove event handler if necessary: 
     if (mousemoveTemp) { 
     document.body.onmousemove = mousemoveTemp; 
     mousemoveTemp = null; 
     } 
     return false; 
    } 
    p.onmousedown = start_drag; 
    p.onmouseup = stop_drag; 
    } 
} 

C'è un motivo per il leggermente contorte offsetX/offsetY calcoli. Se si nota, sta solo prendendo la differenza tra le posizioni del mouse e aggiungendole alla posizione del div che viene trascinato. Perché non usare solo le posizioni del mouse? Bene, se lo fai, il div salterà sul puntatore del mouse quando clicchi su di esso. Qual è un comportamento che non volevo.

+0

Hai una demo? – starbeamrainbowlabs

+1

Quel codice sopra è la demo. Copia incollalo in un file html (incluse le funzioni di supporto) e chiama la funzione su un div nella pagina. – slebetman

+0

NOTA: Vorrei anche mettere p.onmouseout = stop_drag; verso la fine con gli eventi del mouse. Quando eseguivo il codice, a volte il mio mouse si muoveva più velocemente dell'elemento e quando il mouse scendeva dall'elemento devi prima cliccarlo e rilasciarlo prima che smetta di funzionare. –

14

Si può provare questo

HTML

<div id="one" style="height:50px; width:50px; border:1px solid #ccc; background:red;"> 
</div> 

Js script per div trascinabili

window.onload = function(){ 
    draggable('one'); 
}; 

var dragObj = null; 
function draggable(id) 
{ 
    var obj = document.getElementById(id); 
    obj.style.position = "absolute"; 
    obj.onmousedown = function(){ 
      dragObj = obj; 
    } 
} 

document.onmouseup = function(e){ 
    dragObj = null; 
}; 

document.onmousemove = function(e){ 
    var x = e.pageX; 
    var y = e.pageY; 

    if(dragObj == null) 
     return; 

    dragObj.style.left = x +"px"; 
    dragObj.style.top= y +"px"; 
}; 

Scegli questa Demo

+0

Come faccio a evitare di spostare il mouse nell'angolo in alto a sinistra. Mi piacerebbe lasciare il mouse dove è stato rilasciato rispetto a dove è stato fatto clic nel div – Rod

+0

Questo è fantastico e semplice, ho appena aggiunto un piccolo cambiamento. Per evitare perdite se obj viene rimosso dal dom, il gestore obj.onmousedown non dovrebbe fare riferimento a obj, dovrebbe fare riferimento a e.currentTarget. – djabraham

+0

La migliore soluzione. Grazie. – modernator

-1
<div draggable=true ondragstart="event.dataTransfer.setData('text/plain', '12345')"> 
drag me 
</div> 

<div ondragover="return false;" ondrop="this.innerHTML=event.dataTransfer.getData('text/plain')"> 
drop on me 
</div> 
+1

Fresco, ma probabilmente non è ciò che OP intendeva per "div cartaggiante" ... –

8

Questo codice corregge la posizione del mouse (in modo da l'oggetto trascinato non salta quando si inizia il trascinamento) e lavora con touch screen/telefoni così

var dragObj = null; //object to be moved 
 
var xOffset = 0; //used to prevent dragged object jumping to mouse location 
 
var yOffset = 0; 
 
\t 
 
window.onload = function() 
 
{ 
 
\t document.getElementById("menuBar").addEventListener("mousedown", startDrag, true); 
 
\t document.getElementById("menuBar").addEventListener("touchstart", startDrag, true); 
 
} 
 

 
function startDrag(e) 
 
/*sets offset parameters and starts listening for mouse-move*/ 
 
{ 
 
\t e.preventDefault(); 
 
\t e.stopPropagation(); 
 
\t dragObj = e.target; 
 
\t dragObj.style.position = "absolute"; 
 
\t var rect = dragObj.getBoundingClientRect(); 
 
\t 
 
\t if(e.type=="mousedown") 
 
\t { 
 
\t \t xOffset = e.clientX - rect.left; //clientX and getBoundingClientRect() both use viewable area adjusted when scrolling aka 'viewport' 
 
\t \t yOffset = e.clientY - rect.top; 
 
\t \t window.addEventListener('mousemove', dragObject, true); 
 
\t } 
 
\t else if(e.type=="touchstart") 
 
\t { 
 
\t \t xOffset = e.targetTouches[0].clientX - rect.left; //clientX and getBoundingClientRect() both use viewable area adjusted when scrolling aka 'viewport' 
 
\t \t yOffset = e.targetTouches[0].clientY - rect.top; 
 
\t \t window.addEventListener('touchmove', dragObject, true); 
 
\t } 
 
} 
 

 
function dragObject(e) 
 
/*Drag object*/ 
 
{ 
 
\t e.preventDefault(); 
 
\t e.stopPropagation(); 
 
\t 
 
\t if(dragObj == null) return; // if there is no object being dragged then do nothing 
 
    else if(e.type=="mousemove") 
 
\t { 
 
\t \t dragObj.style.left = e.clientX-xOffset +"px"; // adjust location of dragged object so doesn't jump to mouse position 
 
\t \t dragObj.style.top = e.clientY-yOffset +"px"; 
 
\t } 
 
    else if(e.type=="touchmove") 
 
\t { 
 
\t \t dragObj.style.left = e.targetTouches[0].clientX-xOffset +"px"; // adjust location of dragged object so doesn't jump to mouse position 
 
\t \t dragObj.style.top = e.targetTouches[0].clientY-yOffset +"px"; 
 
\t } 
 
} 
 

 
document.onmouseup = function(e) 
 
/*End dragging*/ 
 
{ 
 
\t if(dragObj) 
 
\t { 
 
\t \t dragObj = null; 
 
\t \t window.removeEventListener('mousemove', dragObject, true); 
 
\t \t window.removeEventListener('touchmove', dragObject, true); 
 
\t } 
 
}
div{height:400px; width:400px; border:1px solid #ccc; background:blue; cursor: pointer;}
<div id="menuBar" >A</div>

Problemi correlati