CSS / JS para impedir o arrastamento da imagem fantasma?

152

Existe uma maneira de impedir que o usuário veja um fantasma da imagem que está tentando arrastar (não se preocupe com a segurança das imagens, mas com a experiência).

Eu tentei isso que corrige o problema com a seleção azul no texto e nas imagens, mas não na imagem fantasma:

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

(Também tentei aninhar a imagem dentro de uma div com as mesmas regras aplicadas à div). obrigado

user885355
fonte
1
Veja esta resposta: stackoverflow.com/a/4211930/1060487 questão é possível duplicado
mattdlockyer

Respostas:

195

Você pode definir o draggableatributo falsena marcação ou no código JavaScript.

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

BoltClock
fonte
48
Por que adicioná-lo com JavaScript ??? <img id="myImage" src="http://placehold.it/150x150" draggable="false">
Greg
26
@ Greg: Por que você está me perguntando? É o OP que queria uma solução JavaScript. Além disso, eu disse "na marcação ou no código JavaScript" de qualquer maneira, então não é como se você não pudesse fazê-lo na marcação se tivesse a opção de editar sua marcação.
BoltClock
12
Não funciona no FF em combinação com -moz-user-select: none. Solução possível: Adicionar pointer-events: none.
Cedric Reichenbach
9
Talvez eu tenha interpretado mal a pergunta, mas o OP não está perguntando como eles podem reter arrastar e soltar, mas apenas ocultando a imagem fantasma? Definir draggablepara falsedesativará completamente o recurso de arrastar e soltar.
James
1
@ James: Não está muito claro da questão, para ser sincero. Estou respondendo principalmente sob a suposição de que a imagem fantasma é um indicador visual de arrastar e soltar (o que é) e que a maioria das pessoas que deseja ocultar a imagem fantasma geralmente não se importa se o arrastar e soltar é desativado por completo.
BoltClock
87

Eu acho que você pode mudar sua

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

dentro de

img {
  -webkit-user-drag: none;
  -khtml-user-drag: none;
  -moz-user-drag: none;
  -o-user-drag: none;
  user-drag: none;
}
Máx.
fonte
3
@victorsosa É verdade, mas um padrão de fato ainda é um padrão, W3C ou não. Ou seja, se todos os navegadores suportarem, é bom ir. Lembre-se de que muitas coisas do W3C começaram como proprietárias, como o AJAX.
Beejor
4
Esta solução não funciona no IE11 e no Firefox 57.0.
Tudor Ciotlos
34

Tente:

img {
  pointer-events: none;
}

e tente evitar

* {
  pointer-events: none;
}
Erik Rybalkin
fonte
8
Esta é uma solução ruim, pois remove toda a capacidade de interagir com o elemento. O OP está apenas pedindo para desativar a funcionalidade "arrastar" de um elemento, para não desativar totalmente toda e qualquer interação baseada em ponteiro com o elemento.
Chad
4
@Chad isso é verdade, mas é possível quebrar a imagem e adicionar o ouvinte de eventos ao wrapper enquanto a imagem não tem mais uma imagem fantasma.
Vincent Hoch-Drei
18

Você pode usar uma propriedade CSS para desativar imagens em navegadores de kit da web.

img{-webkit-user-drag: none;}
Ashwani
fonte
3
Isto também funciona com -ms-user-drag, -moz-user-drage user-drag. Uma ótima solução apenas para CSS!
Beejor
14

Isso desabilitará o arrasto de uma imagem em todos os navegadores , preservando outros eventos, como clicar e passar o mouse. Funciona desde que qualquer HTML5, JS ou CSS esteja disponível.

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

Se você está confiante de que o usuário terá JS, é necessário usar apenas o atributo JS, etc. Para obter mais flexibilidade, consulte ondragstart, onselectstart e alguns WebKit toques / toques em CSS.

Beejor
fonte
Você pode querer fazer (this.onclick || this.click) () ... se onclick puder ser indefinido de acordo com essa lógica?
Van Nguyen
@ Kaizoku Obrigado, eu não tinha considerado isso! Atualizei minha resposta com base em sua sugestão.
precisa saber é o seguinte
Isso não parece funcionar no FireFox porque, estritamente falando, <img> nem sequer tem eventos de clique ou clique. Enfim, eu apenas usei a parte onmouseup e deixei o DIV pai lidar com o onclick e ele funciona.
Nelson
@ Nelson Obrigado por me avisar. Parece que o onmouseup não era necessário de qualquer maneira, pois o onclick é acionado, independentemente do valor de retorno de qualquer manipulador on / mouse up / up. Decidi revisar minha resposta por simplicidade. O novo one-liner deve funcionar bem; apenas testado em FF, Safari, Chrome, IE8 / 10.
Beejor
Estou no Firefox 62 e onmousedown="return false"é suficiente. Também é necessário evitar que o usuário selecione a imagem enquanto a arrasta, o que permitiria arrastar a seleção.
Loxaxs # 6/18
8

Lidar com o dragstartevento e return false.

SLaks
fonte
4

Você pode atribuir uma imagem fantasma alternativa se realmente precisar usar eventos de arrasto e não puder definir draggable = false. Então, basta atribuir um png em branco da seguinte maneira:

    $('#img').bind({
        dragstart: function(e) {
            var dragIcon = document.createElement('img');
            dragIcon.src = 'blank.png';
            dragIcon.width = 100;
            e.dataTransfer.setDragImage(dragIcon, -10, -10);
        }
    });
louisinhongkong
fonte
2
Nem todos os navegadores suportam setDragImage, mesmo se eles suportam arrastar e soltar, por exemplo, IE10 / 11.
James
É possível usar esse truque sem usar um png em branco?
Fabien Quatravaux
1
Você poderia usar uma imagem codificada em base64 definida em linha ... por exemplodragIcon.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
Murray Smith
3

Coloque a imagem como plano de fundo de uma div vazia ou sob um elemento transparente. Quando o usuário clica na imagem para arrastar, ele está clicando em uma div.

Consulte http://www.flickr.com/photos/thefella/5878724253/?f=hp

<div id="photo-drag-proxy"></div>
Michael Jasper
fonte
2

Para o Firefox, você precisa ir um pouco mais fundo com isso:

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

Aproveitar.

dijipiji
fonte
1

Descobri que, para o IE, você deve adicionar o atributo draggable = "false" às ​​imagens e âncoras para evitar arrastar. as opções de CSS funcionam para todos os outros navegadores. Eu fiz isso no jQuery:

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

Há uma solução muito mais fácil aqui do que adicionar ouvintes de eventos vazios. Basta definir pointer-events: nonea sua imagem. Se você ainda precisa clicar, adicione um contêiner ao redor dele que aciona o evento.

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

Testado no Firefox: remover e colocar de volta a imagem funciona! E é transparente na execução também. Por exemplo,

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

Edição : Isso funciona apenas no IE e no Firefox, estranhamente. Eu também adicionei draggable = falseem cada imagem. Ainda é um fantasma com o Chrome e o Safari.

EDIT 2 : A solução de imagem de fundo é realmente a melhor. A única sutileza é que a background-sizepropriedade precisa ser redefinida toda vez que a imagem de fundo é alterada! Ou então, é assim que parecia do meu lado. Melhor ainda, tive um problema com imgtags normais no IE, onde o IE não conseguiu redimensionar as imagens. Agora, as imagens têm as dimensões corretas. Simples:

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

Além disso, talvez considere os seguintes:

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

Você pode definir a imagem exibida quando um item é arrastado. Testado com o Chrome.

setDragImage

usar

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

Como alternativa, como já mencionado nas respostas, você pode definir draggable="false"o elemento HTML, se não conseguir arrastar o elemento, não há problema.

Thibauld Nuyten
fonte
0

O "tudo para tudo", para não selecionar ou arrastar, com todos os prefixos do 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;

Você também pode definir o draggableatributo para false. Você pode fazer isso com HTML de inline: draggable="false"com Javascript: elm.draggable = falseou com jQuery: elm.attr('draggable', false).

Você também pode manipular a onmousedownfunção para return false. Você pode fazer isso com HTML embutido:, onmousedown="return false"com Javascript: elm.onmousedown=()=>return false;ou com jQuery:elm.mousedown(()=>return false)

Justin
fonte
-1

Este trabalho para mim, eu uso alguns scripts lightbox

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

Wilson Delgado
fonte