CSS / JS para evitar el arrastre de la imagen fantasma?

152

¿Hay alguna manera de evitar que el usuario vea un fantasma de la imagen que está tratando de arrastrar (no le preocupa la seguridad de las imágenes, sino la experiencia).

He intentado esto que soluciona el problema con la selección azul en texto e imágenes, pero no la imagen fantasma:

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

(También intenté anidar la imagen dentro de un div con las mismas reglas aplicadas al div). Gracias

usuario885355
fuente
1
Vea esta respuesta: stackoverflow.com/a/4211930/1060487 pregunta es posible duplicar
mattdlockyer

Respuestas:

195

Puede establecer el draggableatributo falseen el código de marcado o JavaScript.

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

BoltClock
fuente
48
¿Por qué agregarlo con JavaScript? <img id="myImage" src="http://placehold.it/150x150" draggable="false">
Greg
26
@ Greg: ¿Por qué me preguntas? Es el OP quien quería una solución de JavaScript. Además, dije "en el código de marcado o JavaScript" de todos modos, por lo que no es como si no pudieras hacerlo en el marcado si tuvieras la opción de editar tu marcado.
BoltClock
12
No funciona en FF en combinación con -moz-user-select: none. Posible solución: Agregar pointer-events: none.
Cedric Reichenbach
9
Tal vez he malinterpretado la pregunta, pero el OP no pregunta cómo pueden retener y soltar, sino simplemente ocultar la imagen fantasma. La configuración draggableen falsedeshabilitará completamente arrastrar y soltar
James
1
@ James: No es muy claro a partir de la pregunta, para ser honesto. Principalmente estoy respondiendo bajo el supuesto de que la imagen fantasma es un indicador visual de arrastrar y soltar (que es), y que a la mayoría de las personas que quieren ocultar la imagen fantasma generalmente no les importa si arrastrar y soltar es discapacitados por completo.
BoltClock
87

Creo que puedes cambiar tu

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

en un

img {
  -webkit-user-drag: none;
  -khtml-user-drag: none;
  -moz-user-drag: none;
  -o-user-drag: none;
  user-drag: none;
}
Max
fuente
3
@victorsosa Cierto, pero un estándar de facto sigue siendo un estándar, W3C o no. Es decir, si todos los navegadores lo admiten, está listo. Recuerde que muchas cosas del W3C comenzaron como propiedad, como AJAX.
Beejor
44
Esta solución no funciona en IE11 y Firefox 57.0.
Tudor Ciotlos
34

Intentalo:

img {
  pointer-events: none;
}

e intenta evitar

* {
  pointer-events: none;
}
Erik Rybalkin
fuente
8
Esta es una solución pobre, ya que elimina toda la capacidad de interactuar con el elemento. OP solo pide deshabilitar la funcionalidad de "arrastrar" de un elemento, no deshabilitar completamente cualquier interacción basada en puntero con el elemento.
Chad
44
@Chad eso es cierto, pero es posible ajustar la imagen y agregar el detector de eventos al contenedor mientras la imagen ya no tiene imagen fantasma.
Vincent Hoch-Drei
18

Puede usar una propiedad CSS para deshabilitar imágenes en los navegadores webkit.

img{-webkit-user-drag: none;}
Ashwani
fuente
3
Esto también funciona con -ms-user-drag, -moz-user-dragy user-drag. ¡Una gran solución solo para CSS!
Beejor
14

Esto deshabilitará el arrastre de una imagen en todos los navegadores , al tiempo que preservará otros eventos, como hacer clic y desplazarse. Funciona siempre que haya HTML5, JS o CSS disponibles.

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

Si está seguro de que el usuario tendrá JS, solo necesita usar el atributo JS, etc. Para obtener más flexibilidad, busque ondragstart, onselectstart y algunos CSS de toque / toque de WebKit.

Beejor
fuente
Es posible que desee hacer (this.onclick || this.click) () en su lugar .. si onclick puede ser indefinido de acuerdo con esta lógica?
Van Nguyen
@Kaizoku ¡Gracias, no lo había considerado! Actualicé mi respuesta según su sugerencia.
Beejor
Esto no parece funcionar en Firefox porque, estrictamente hablando, <img> ni siquiera tiene eventos onclick o click. De todos modos, acabo de usar la parte onmouseup y dejé que el DIV padre maneje el onclick y funciona.
Nelson
@ Nelson Gracias por hacérmelo saber. Parece que el onmouseup no fue necesario de todos modos ya que onclick se dispara independientemente del valor de retorno de cualquier controlador onmousedown / up. Decidí revisar mi respuesta por simplicidad. El nuevo one-liner debería funcionar bien; Acabo de probar en FF, Safari, Chrome, IE8 / 10.
Beejor
Estoy en Firefox 62 y onmousedown="return false"es suficiente. También es necesario evitar que el usuario seleccione la imagen mientras la arrastra, lo que les permitiría arrastrar la selección.
loxaxs
8

Manejar el dragstartevento y return false.

SLaks
fuente
4

Puede asignar una imagen fantasma alternativa si realmente necesita usar eventos de arrastre y no puede establecer draggable = false. Así que solo asigne un png en blanco como este:

    $('#img').bind({
        dragstart: function(e) {
            var dragIcon = document.createElement('img');
            dragIcon.src = 'blank.png';
            dragIcon.width = 100;
            e.dataTransfer.setDragImage(dragIcon, -10, -10);
        }
    });
louisinhongkong
fuente
2
No todos los navegadores admiten setDragImage, incluso si admiten arrastrar y soltar, por ejemplo, IE10 / 11.
James
¿Es posible usar este truco sin usar un png en blanco?
Fabien Quatravaux
1
Podría usar una imagen codificada en base64 definida en línea ... por ejemplodragIcon.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
Murray Smith,
2

Para Firefox necesitas profundizar un poco más con esto:

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

Disfrutar.

dijipiji
fuente
1

Descubrí que para IE, debe agregar el atributo draggable = "false" a las imágenes y los anclajes para evitar el arrastre. Las opciones de CSS funcionan para todos los demás navegadores. Hice esto en jQuery:

$("a").attr('draggable', false); 
$("img").attr('draggable', false);
Derek Wade
fuente
1

Aquí hay una solución mucho más fácil que agregar oyentes de eventos vacíos. Solo configura pointer-events: nonetu imagen. Si aún necesita que se pueda hacer clic en él, agregue un contenedor a su alrededor que active el evento.

Micros
fuente
1
<img src="myimage.jpg" ondragstart="return false;" />
lubosdz
fuente
0

Probado en Firefox: ¡eliminar y volver a colocar la imagen funciona! Y también es transparente en la ejecución. Por ejemplo,

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

EDITAR : Esto funciona solo en IE y en Firefox, curiosamente. También agregué draggable = falseen cada imagen. Todavía un fantasma con Chrome y Safari.

EDIT 2 : la solución de imagen de fondo es realmente la mejor. ¡La única sutileza es que la background-sizepropiedad debe redefinirse cada vez que se cambia la imagen de fondo! O eso es lo que parecía desde mi lado. Mejor aún, tuve un problema con las imgetiquetas normales en IE, donde IE no pudo cambiar el tamaño de las imágenes. Ahora, las imágenes tienen las dimensiones correctas. Sencillo:

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

Además, quizás considere aquellos:

background-Repeat:no-repeat;
background-Position: center center;
Tama Yoshi
fuente
0

Puede configurar la imagen que se muestra cuando se arrastra un elemento. Probado con Chrome.

setDragImage

utilizar

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

Alternativamente, como ya se mencionó en las respuestas, puede configurar draggable="false"el elemento HTML, si no es posible arrastrar el elemento en absoluto.

Thibauld Nuyten
fuente
0

Be-all-end-all, para no seleccionar ni arrastrar, con todos los prefijos del navegador:

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

También puede establecer el draggableatributo en false. Usted puede hacer esto con HTML en línea: draggable="false"con Javascript: elm.draggable = falseo con jQuery: elm.attr('draggable', false).

También puede manejar la onmousedownfunción para return false. Puede hacer esto con HTML en línea:, onmousedown="return false"con Javascript: elm.onmousedown=()=>return false;o con jQuery:elm.mousedown(()=>return false)

Justin
fuente
-1

Esto funciona para mí, uso algunos scripts de lightbox

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

Wilson Delgado
fuente