2016-04-02 21 views
7

Quando si inizia a trascinare un elemento utilizzando l'attributo draggabile HTML5, l'elemento originale è ancora visibile, quindi alla fine ho due elementi visibili anziché uno.html5 elemento nascosto trascinabile in pelle

Come posso fare per avere solo l'elemento che viene trascinato visibile (quello originale dovrebbe essere momentaneamente nascosto).

<script> 
    function startDrag() { 
    // hide initial element 
    } 

    function endDrag() { 
    // reset initial element 
    } 
</script> 

<div class="draggable" draggable="true" 
    ondragstart="startDrag(event)" 
    ondragend="endDrag(event)" 
></div> 

Ecco un jsfiddle per mostrare il problema https://jsfiddle.net/gjc5p4qp/

risposta

9

Si può avere successo questa una soluzione hacky. La trascinabilità nativa non consente stili CSS come: opacity:0;, visibility:hidden o display:none.

Ma è possibile farlo utilizzando: transform:translateX(-9999px).

Ho aggiornato il tuo JSFiddle con la soluzione.

+0

Wow che è veramente buono, sapete come impostare l'opacità dell'elemento trascinato a 1? – julesbou

+0

Haha, grazie. Non sono riuscito a trovare un modo per farlo, sembra che l'elemento "fantasma" trascinato non sia disponibile al DOM, quindi abbiamo dei limiti. Dai un'occhiata a questo [risposta] (http://stackoverflow.com/a/10904112/3938676) – Filipe

+0

@julesbou Filipe non esiste ancora una soluzione adeguata a questo? – Anthony

2

Poiché la semplice impostazione di visibility: hidden non funziona, ho trovato un'altra soluzione un po 'hacky: impostare visibility: hidden un millisecondo dopo l'inizio dell'evento di trascinamento.

function startDrag(e) { 
 
    setTimeout(function() { 
 
    e.target.style.visibility = "hidden"; 
 
    }, 1); 
 
} 
 

 
function endDrag(e) { 
 
    setTimeout(function() { 
 
    e.target.style.visibility = ""; 
 
    }, 1); 
 
}
body { 
 
    display: inline-block; 
 
    outline: 1px solid black; 
 
} 
 
.draggable { 
 
    border-radius: 4px; 
 
    background: #CC0000; 
 
    width: 40px; 
 
    height: 40px; 
 
}
<div class="draggable" draggable="true" ondragstart="startDrag(event)" ondragend="endDrag(event)"> 
 

 
</div>

+2

Invece di usare un 'setTimeout', è possibile utilizzare' window.requestAnimationFrame' per questo: 'funzione startDrag (e) { window.requestAnimationFrame (function() { e.target.style.visibility = "hidden" ; }); } ' –

+0

@AndrewHedges qualsiasi idea su come prevenire l'abbassamento dell'opacità ?! – Anthony