CSS / JS per impedire il trascinamento dell'immagine fantasma?


152

C'è un modo per impedire all'utente di vedere un fantasma dell'immagine che stanno cercando di trascinare (non preoccupazione per la sicurezza delle immagini, ma l'esperienza).

Ho provato questo che risolve il problema con la selezione blu su testo e immagini ma non sull'immagine fantasma:

img {
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -o-user-select: none;
  user-select: none;
}

(Ho anche provato a nidificare l'immagine all'interno di un div con le stesse regole applicate al div). Grazie


1
Vedi questa risposta: stackoverflow.com/a/4211930/1060487 la domanda è possibile duplicata
mattdlockyer

Risposte:


195

È possibile impostare l' draggableattributo su falsenel markup o nel codice JavaScript.

// As a jQuery method: $('#myImage').attr('draggable', false);
document.getElementById('myImage').setAttribute('draggable', false);
<img id="myImage" src="http://placehold.it/150x150">


48
Perché aggiungerlo con JavaScript ??? <img id="myImage" src="http://placehold.it/150x150" draggable="false">
Greg

26
@Greg: Perché me lo chiedi? È l'OP che voleva una soluzione JavaScript. Inoltre ho detto "nel codice markup o nel codice JavaScript", quindi non è come se non potessi farlo nel markup se avessi la possibilità di modificare il markup.
BoltClock

12
Non funziona in FF in combinazione con -moz-user-select: none. Possibile soluzione: Aggiungi pointer-events: none.
Cedric Reichenbach,

9
Forse ho interpretato male la domanda ma l'OP non sta chiedendo come possono trattenere il trascinamento della selezione ma nascondere semplicemente l'immagine fantasma? L'impostazione draggablesu falsedisabilita completamente il trascinamento della selezione.
James,

1
@James: non è molto chiaro dalla domanda, a dire il vero. Sto rispondendo principalmente supponendo che l'immagine fantasma sia un indicatore visivo del trascinamento della selezione (che è) e che la maggior parte delle persone che vogliono nascondere l'immagine fantasma in genere non si preoccupano se il trascinamento della selezione è disabilitato del tutto.
BoltClock

87

Penso che tu possa cambiare il tuo

img {
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -o-user-select: none;
  user-select: none;
}

in un

img {
  -webkit-user-drag: none;
  -khtml-user-drag: none;
  -moz-user-drag: none;
  -o-user-drag: none;
  user-drag: none;
}

3
@victorsosa Vero, ma uno standard di fatto è ancora uno standard, W3C o meno. Cioè, se ogni browser lo supporta, è bene andare. Ricorda che molte cose del W3C sono iniziate come proprietarie, come AJAX.
Beejor,

4
Questa soluzione non funziona in IE11 e Firefox 57.0.
Tudor Ciotlos,

34

Provalo:

img {
  pointer-events: none;
}

e cerca di evitare

* {
  pointer-events: none;
}

8
Questa è una soluzione scadente, poiché rimuove tutte le capacità di interagire con l'elemento. OP chiede solo di disabilitare la funzionalità di "trascinamento" di un elemento, non di disabilitare completamente qualsiasi interazione basata su puntatore con l'elemento.
Ciad

4
@Chad è vero, ma è possibile avvolgere l'immagine e aggiungere il listener di eventi al wrapper mentre l'immagine non ha più immagini fantasma.
Vincent Hoch-Drei,

18

È possibile utilizzare una proprietà CSS per disabilitare le immagini nei browser webkit.

img{-webkit-user-drag: none;}

3
Questo funziona anche con -ms-user-drag, -moz-user-drage user-drag. Un'ottima soluzione solo CSS!
Beejor,

14

Ciò disabiliterà il trascinamento di un'immagine in tutti i browser , preservando altri eventi come clic e passaggio del mouse. Funziona finché sono disponibili HTML5, JS o CSS.

<img draggable="false" onmousedown="return false" style="user-drag: none" />

Se sei sicuro che l'utente avrà JS, devi solo usare l'attributo JS, ecc. Per maggiore flessibilità, guarda ondragstart, onselectstart e alcuni WebKit tocca / tocca CSS.


Potresti voler fare (this.onclick || this.click) () invece .. se onclick può essere indefinito secondo questa logica?
Van Nguyen,

@Kaizoku Grazie, non ci avevo pensato! Aggiornato la mia risposta in base al tuo suggerimento.
Beejor,

Questo non sembra funzionare in FireFox perché, a rigor di termini, <img> non ha nemmeno eventi onclick o click. Ad ogni modo, ho appena usato la parte onmouseup e ho lasciato che il DIV padre gestisse l'onclick e funzionasse.
Nelson,

@Nelson Grazie per avermelo fatto notare. Sembra che onmouseup non sia stato comunque necessario poiché onclick si attiva indipendentemente dal valore di ritorno da qualsiasi gestore onmousedown / up. Ho deciso di rivedere la mia risposta per semplicità. Il nuovo one-liner dovrebbe funzionare bene; appena testato in FF, Safari, Chrome, IE8 / 10.
Beejor,

Sono su Firefox 62 ed onmousedown="return false"è sufficiente. È inoltre necessario evitare che l'utente selezioni l'immagine mentre la trascina, il che consentirebbe loro di trascinare la selezione.
Loxaxs

8

Gestisci l' dragstartevento e return false.


4

Puoi assegnare un'immagine fantasma alternativa se devi davvero utilizzare gli eventi di trascinamento e non puoi impostare draggable = false. Quindi basta assegnare un png vuoto in questo modo:

    $('#img').bind({
        dragstart: function(e) {
            var dragIcon = document.createElement('img');
            dragIcon.src = 'blank.png';
            dragIcon.width = 100;
            e.dataTransfer.setDragImage(dragIcon, -10, -10);
        }
    });

2
Non tutti i browser supportano setDragImage, anche se supportano il trascinamento della selezione, ad esempio IE10 / 11.
James,

È possibile usare questo trucco senza effettivamente usare un png vuoto?
Fabien Quatravaux,

1
Potresti usare un'immagine codificata in base64 definita in linea ... ad es.dragIcon.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
Murray Smith,


2

Per Firefox devi andare un po 'più a fondo con questo:

var imgs = document.getElementsByTagName('img');

    // loop through fetched images
    for (i = 0; i < imgs.length; i++) {
        // and define onmousedown event handler
        imgs[i].onmousedown = disableDragging;
    }

function disableDragging(e) {
        e.preventDefault();
    }

Godere.


1

Ho scoperto che per IE è necessario aggiungere l'attributo draggable = "false" alle immagini e alle ancore per impedire il trascinamento. le opzioni CSS funzionano per tutti gli altri browser. L'ho fatto in jQuery:

$("a").attr('draggable', false); 
$("img").attr('draggable', false);

1

Esiste una soluzione molto più semplice rispetto all'aggiunta di listener di eventi vuoti. Basta impostare pointer-events: nonesulla tua immagine. Se hai ancora bisogno che sia cliccabile, aggiungi un contenitore attorno che attivi l'evento.


1
<img src="myimage.jpg" ondragstart="return false;" />

0

Testato su Firefox: la rimozione e la reimpostazione dell'immagine funziona! Ed è anche trasparente all'esecuzione. Per esempio,

$('.imageContainerClass').mousedown(function() {
    var id = $(this).attr('id');
    $('#'+id).remove();
    $('#'+id).append('Image tag code');
});

EDIT : Funziona solo su IE e su Firefox, stranamente. Ho anche aggiunto draggable = falsesu ogni immagine. Ancora un fantasma con Chrome e Safari.

EDIT 2 : La soluzione di immagine di sfondo è davvero la migliore. L'unica sottigliezza è che la background-sizeproprietà deve essere ridefinita ogni volta che l'immagine di sfondo viene cambiata! O almeno, è così che sembrava dalla mia parte. Meglio ancora, ho avuto un problema con i normali imgtag in IE, in cui IE non è riuscito a ridimensionare le immagini. Ora, le immagini hanno le dimensioni corrette. Semplice:

$(id).css( 'background-image', url('blah.png') );
$(id).css( 'background-size', '40px');

Inoltre, forse considera quelli:

background-Repeat:no-repeat;
background-Position: center center;

0

È possibile impostare l'immagine che viene mostrata quando si trascina un elemento. Testato con Chrome.

setDragImage

uso

onclick = myFunction();
myFunction(e) {
    e.dataTransfer.setDragImage(someImage, xOffset, yOffset);
}

In alternativa, come già accennato nelle risposte, è possibile impostare draggable="false"l'elemento HTML, se non è possibile trascinare affatto l'elemento non è un problema.


0

Il be-all-end-all, per nessuna selezione o trascinamento, con tutti i prefissi del browser:

-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-o-user-select: none;
-ms-user-select: none;
user-select: none;

-webkit-user-drag: none;
-khtml-user-drag: none;
-moz-user-drag: none;
-o-user-drag: none;
-ms-user-drag: none;
user-drag: none;

È inoltre possibile impostare l' draggableattributo su false. È possibile farlo con Inline HTML: draggable="false"con Javascript: elm.draggable = falseo con jQuery: elm.attr('draggable', false).

Puoi anche gestire la onmousedownfunzione return false. Puoi farlo con HTML inline:, onmousedown="return false"con Javascript: elm.onmousedown=()=>return false;o con jQuery:elm.mousedown(()=>return false)


-1

Questo lavoro per me, utilizzo alcuni script lightbox

.nodragglement {
    transform: translate(0px, 0px)!important;
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.