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
risposta
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.
Hai una demo? – starbeamrainbowlabs
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
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. –
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
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
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
La migliore soluzione. Grazie. – modernator
<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>
Fresco, ma probabilmente non è ciò che OP intendeva per "div cartaggiante" ... –
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>
- 1. Un semplice DIV trascinabile utilizzando jQuery UI
- 2. Creare un'immagine di un DIV in JavaScript (GIF/PNG)
- 3. Impostare la posizione del div trascinabile
- 4. Come creare una legenda trascinabile in matplotlib?
- 5. jQuery contenitore trascinabile trascinabile
- 6. Creare un div div a un altro
- 7. Creare iframe con javascript accodando ad un div
- 8. Ottenere jQuery ordinabile, trascinabile e trascinabile per lavorare insieme
- 9. jQuery-UI trascinabile: div non segue il mouse correttamente orizzontale
- 10. Grande oggetto trascinabile in un contenitore piccolo e trascinabile?
- 11. java.lang.OutOfMemoryError: impossibile creare un nuovo thread nativo
- 12. creare div bambino in un div genitore utilizzando jQuery
- 13. Visualizza un'immagine in un div con javascript?
- 14. Lanciare un div usando Javascript
- 15. Il div trascinabile e ridimensionabile con contenimento esce dal contenimento
- 16. Jquery-ui trascinabile e dinamico Jquery-ui trascinabile?
- 17. Come creare un messagebox modale in WinRT usando C++ nativo
- 18. Interfaccia utente jQuery: trascinamento droppabile/trascinabile su div principale?
- 19. immissione javascript tramite popup nativo
- 20. Javascript migliorato nativo per ciclo
- 21. metodo nativo javascript nel GWT
- 22. Rileva Javascript browser nativo Android
- 23. Quando faccio un clone trascinabile e lo faccio cadere in un oggetto trascinabile non riesco a trascinarlo di nuovo
- 24. Javascript: come creare un nuovo div in modo dinamico, modificarlo, spostarlo, modificarlo in ogni modo possibile?
- 25. Disabilita JavaScript in iframe/div
- 26. impostazione dei limiti al contorno per un oggetto trascinabile
- 27. jQueryUI: rimozione corretta di un elemento trascinabile
- 28. come trascinare da un div scorrevole a un oggetto trascinabile e quindi trascinare di nuovo?
- 29. SVG trascinabile utilizzando JQuery e Jquery-svg
- 30. Creazione della mia funzione "trascinabile"
Date un'occhiata qui [http://stackoverflow.com/questions/9334084/moveable-draggable-div-using-javascript] – prageeth
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