CSS / JS pour empêcher le glissement de l'image fantôme?


153

Existe-t-il un moyen d'empêcher l'utilisateur de voir un fantôme de l'image qu'il essaie de faire glisser (pas de souci de sécurité des images, mais de l'expérience).

J'ai essayé ceci qui corrige le problème avec la sélection bleue sur le texte et les images mais pas l'image fantôme:

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

(J'ai également essayé d'imbriquer l'image dans un div avec les mêmes règles appliquées au div). Merci


1
Voir cette réponse: stackoverflow.com/a/4211930/1060487 question est possible en double
mattdlockyer

Réponses:


195

Vous pouvez définir l' draggableattribut falsedans le balisage ou le code JavaScript.

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


48
Pourquoi l'ajouter avec JavaScript ??? <img id="myImage" src="http://placehold.it/150x150" draggable="false">
Greg

26
@Greg: Pourquoi me demandez-vous? C'est l'OP qui voulait une solution JavaScript. De plus, j'ai dit "dans le balisage ou dans le code JavaScript" de toute façon, donc ce n'est pas comme si vous ne pouviez pas le faire dans le balisage si vous aviez la possibilité de modifier votre balisage.
BoltClock

12
Ne fonctionne pas dans FF en combinaison avec -moz-user-select: none. Solution possible: ajouter pointer-events: none.
Cedric Reichenbach

9
Peut-être ai-je mal interprété la question, mais le PO ne demande-t-il pas comment il peut conserver le glisser-déposer mais simplement cacher l'image fantôme? Le réglage draggablesur falsedésactivera complètement le glisser-déposer.
James

1
@James: Ce n'est pas très clair d'après la question, pour être honnête. Je réponds principalement en supposant que l'image fantôme est un indicateur visuel du glisser-déposer (ce qui est le cas), et que la plupart des personnes qui souhaitent masquer l'image fantôme ne se soucient généralement pas de savoir si le glisser-déposer est complètement désactivé.
BoltClock

87

Je pense que tu peux changer ton

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

dans une

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

3
@victorsosa C'est vrai, mais un standard de facto est toujours un standard, W3C ou non. Autrement dit, si chaque navigateur le prend en charge, il est bon d'y aller. N'oubliez pas que beaucoup de choses du W3C ont commencé comme propriétaires, comme AJAX.
Beejor

4
Cette solution ne fonctionne pas dans IE11 et Firefox 57.0.
Tudor Ciotlos

34

Essayez-le:

img {
  pointer-events: none;
}

et essayez d'éviter

* {
  pointer-events: none;
}

8
C'est une mauvaise solution, car elle supprime toute capacité d'interagir avec l'élément. OP demande seulement de désactiver la fonctionnalité «glisser» d'un élément, de ne pas désactiver entièrement toute interaction basée sur un pointeur avec l'élément.
Chad

4
@Chad c'est vrai mais il est possible d'encapsuler l'image et d'ajouter l'écouteur d'événement au wrapper alors que l'image n'a plus d'image fantôme.
Vincent Hoch-Drei

18

Vous pouvez utiliser une propriété CSS pour désactiver les images dans les navigateurs Webkit.

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

3
Cela fonctionne aussi avec -ms-user-drag, -moz-user-draget user-drag. Une excellente solution CSS uniquement!
Beejor

14

Cela désactivera le glissement d'une image dans tous les navigateurs , tout en préservant d'autres événements tels que le clic et le survol. Fonctionne tant que HTML5, JS ou CSS sont disponibles.

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

Si vous êtes sûr que l'utilisateur aura JS, il vous suffit d'utiliser l'attribut JS, etc.


Vous pourriez vouloir faire (this.onclick || this.click) () à la place .. si onclick peut être indéfini selon cette logique?
Van Nguyen

@Kaizoku Merci, je n'avais pas pensé à ça! J'ai mis à jour ma réponse en fonction de votre suggestion.
Beejor

Cela ne semble pas fonctionner dans FireFox car, à proprement parler, <img> n'a même pas d'événements onclick ou click. Quoi qu'il en soit, je viens d'utiliser la partie onmouseup et de laisser le DIV parent gérer le onclick et cela fonctionne.
Nelson

@Nelson Merci de me l'avoir fait savoir. Il semble que le onmouseup n'était de toute façon pas nécessaire car onclick se déclenche quelle que soit la valeur de retour de tout gestionnaire onmousedown / up. J'ai décidé de réviser ma réponse pour plus de simplicité. Le nouveau one-liner devrait fonctionner correctement; juste testé dans FF, Safari, Chrome, IE8 / 10.
Beejor

Je suis sur Firefox 62 et onmousedown="return false"c'est suffisant. Il est également nécessaire d'éviter que l'utilisateur sélectionne l'image tout en la faisant glisser, ce qui lui permettrait alors de faire glisser la sélection.
loxaxs

8

Gérez l' dragstartévénement et return false.


4

Vous pouvez attribuer une autre image fantôme si vous avez vraiment besoin d'utiliser des événements de glissement et que vous ne pouvez pas définir draggable = false. Alors attribuez simplement un png vierge comme ceci:

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

2
Tous les navigateurs ne prennent pas en charge setDragImage, même s'ils prennent en charge le glisser-déposer, par exemple IE10 / 11.
James

Est-il possible d'utiliser cette astuce sans utiliser réellement un png vierge?
Fabien Quatravaux

1
Vous pouvez utiliser une image encodée en base64 définie en ligne ... par exempledragIcon.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
Murray Smith


2

Pour Firefox, vous devez aller un peu plus loin avec ceci:

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();
    }

Prendre plaisir.


1

J'ai trouvé que pour IE, vous devez ajouter l'attribut draggable = "false" aux images et aux ancres pour empêcher le glissement. les options CSS fonctionnent pour tous les autres navigateurs. J'ai fait cela dans jQuery:

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

1

Il existe ici une solution beaucoup plus simple que d'ajouter des écouteurs d'événements vides. Réglez simplement pointer-events: nonevotre image. Si vous avez toujours besoin qu'il soit cliquable, ajoutez un conteneur autour de lui qui déclenche l'événement.


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

0

Testé sur Firefox: supprimer et remettre l'image fonctionne! Et c'est aussi transparent lors de l'exécution. Par exemple,

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

EDIT : Cela ne fonctionne que sur IE et sur Firefox, étrangement. J'ai également ajouté draggable = falsesur chaque image. Encore un fantôme avec Chrome et Safari.

EDIT 2 : La solution d'image d'arrière-plan est vraiment la meilleure. La seule subtilité est que la background-sizepropriété doit être redéfinie à chaque fois que l'image de fond est modifiée! Ou alors, c'est à quoi ça ressemblait de mon côté. Mieux encore, j'ai eu un problème avec les imgbalises normales sous IE, où IE n'a pas réussi à redimensionner les images. Maintenant, les images ont les bonnes dimensions. Facile:

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

Aussi, considérez peut-être ceux-ci:

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

0

Vous pouvez définir l'image qui s'affiche lorsqu'un élément est déplacé. Testé avec Chrome.

setDragImage

utilisation

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

Alternativement, comme déjà mentionné dans les réponses, vous pouvez définir draggable="false"l'élément HTML, sinon ne pas pouvoir faire glisser l'élément du tout n'est pas un problème.


0

Le be-all-end-all, sans sélection ni glissement, avec tous les préfixes de navigateur:

-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;

Vous pouvez également définir l' draggableattribut sur false. Vous pouvez le faire avec HTML en ligne: draggable="false"avec Javascript: elm.draggable = falseou avec jQuery: elm.attr('draggable', false).

Vous pouvez également gérer la onmousedownfonction en return false. Vous pouvez le faire avec HTML en ligne:, onmousedown="return false"avec Javascript:, elm.onmousedown=()=>return false;ou avec jQuery:elm.mousedown(()=>return false)


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.