CSS / JS,以防止拖影?


152

有没有一种方法可以防止用户看到他们试图拖动的图像重影(与图像的安全性无关,而与体验有关)。

我已经尝试过此方法,可以解决文本和图像上的蓝色选择问题,但不能解决鬼图像:

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

(我还尝试将图像嵌套在div中,并应用与div相同的规则)。谢谢


1
看到这个答案:stackoverflow.com/a/4211930/1060487问题可能重复了
mattdlockyer 2014年

Answers:


195

您可以在标记或JavaScript代码中将draggable属性设置为false

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


48
为什么要用JavaScript添加它???<img id="myImage" src="http://placehold.it/150x150" draggable="false">
格雷格,

26
@格雷格:你为什么问我?是OP想要JavaScript解决方案。另外,我还是说了“使用标记或JavaScript代码”,因此,如果您可以选择编辑标记,就好像您不能在标记中一样。
BoltClock

12
与FF结合使用在FF中不起作用-moz-user-select: none。可能的解决方案:添加pointer-events: none
Cedric Reichenbach 2014年

9
也许我误解了这个问题,但是操作员不是在问他们如何保留拖放内容,而只是隐藏重影?设置draggablefalse将会完全禁用拖放功能。
2014年

1
@James:说实话,问题还不太清楚。我主要是在以下假设下进行回答:幻影图像是拖放的视觉指示(它是),并且大多数想要隐藏幻影图像的人通常不在乎拖放是否完全禁用。
BoltClock

87

我想你可以改变你的

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

变成一个

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

3
@victorsosa是的,但事实上的标准仍然是标准,无论是否为W3C。也就是说,如果每个浏览器都支持它,那将是一件好事。请记住,许多W3C东西都是像AJAX这样的专有产品。
Beejor

4
此解决方案在IE11和Firefox 57.0中不起作用。
Tudor Ciotlos

34

试试吧:

img {
  pointer-events: none;
}

并尽量避免

* {
  pointer-events: none;
}

8
这是一个糟糕的解决方案,因为它消除了与元素交互的所有功能。OP仅要求禁用元素的“拖动”功能,而不是完全禁用与元素的任何基于指针的交互。
乍得

4
@Chad是正确的,但是可以包装图像并将事件侦听器添加到包装器,而图像不再具有幻影图像。
Vincent Hoch-Drei,

18

您可以使用CSS属性在Webkit浏览器中禁用图像。

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

3
这也适用于-ms-user-drag-moz-user-draguser-drag。一个很棒的纯CSS解决方案!
Beejor

14

这将禁止在所有浏览器中拖动图像,同时保留其他事件,例如单击和悬停。只要有HTML5,JS或CSS可用就可以工作。

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

如果您确信用户将拥有JS,则只需使用JS属性,等等。为获得更大的灵活性,请查看ondragstart,onselectstart和某些WebKit点击/触摸CSS。


您可能想改为(this.onclick || this.click)()..如果onclick可以根据此逻辑未定义?
Van Nguyen

@Kaizoku谢谢,我还没考虑过!根据您的建议更新了我的答案。
Beejor

在FireFox中,这似乎不起作用,因为严格来讲,<img>甚至没有onclick或click事件。无论如何,我只是使用了onmouseup部分,然后让父级DIV处理onclick并成功了。
尼尔森

@Nelson感谢您告诉我。似乎无论如何都不需要onmouseup,因为无论任何onmousedown / up处理程序的返回值如何,均会触发onclick。为了简单起见,我决定修改答案。新的一线飞机应该可以正常工作;刚刚在FF,Safari,Chrome,IE8 / 10中进行了测试。
Beejor

我在Firefox 62上onmousedown="return false"就足够了。还需要避免用户在拖动图像时选择图像,这将允许他们拖动选择。
loxaxs

8

处理dragstart事件并处理return false


4

如果您确实需要使用拖动事件并且不能设置draggable = false,则可以分配一个替代的幻像。因此,只需分配一个空白png,如下所示:

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

2
并非所有浏览器都支持setDragImage,即使它们支持拖放,例如IE10 / 11。
2014年

是否可以在没有实际使用空白png的情况下使用此技巧?
法比恩·夸特拉沃

1
您可以使用内联定义的base64编码图像...例如dragIcon.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
Murray Smith


2

对于Firefox,您需要更深入地了解以下内容:

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

请享用。


1

我发现对于IE,必须将draggable =“ false”属性添加到图像和锚点以防止拖动。CSS选项可用于所有其他浏览器。我在jQuery中做到了:

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

1

与添加空事件侦听器相比,这里有一个简单得多的解决方案。只需设置pointer-events: none为您的图像即可。如果仍然需要它可单击,请在它周围添加一个容器来触发事件。



0

在Firefox上进行了测试:删除并放回图片有效!而且它在执行时也是透明的。例如,

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

编辑:奇怪的是,这仅适用于IE和Firefox。我还添加draggable = false了每个图像。Chrome和Safari仍然是鬼。

编辑2:背景图像解决方案确实是最好的。唯一的妙处是,background-size每次更改背景图像时都必须重新定义该属性!大概就是我这边的样子。更好的是,我img在IE下无法正常调整图片大小的情况下出现了IE下普通标签的问题。现在,图像具有正确的尺寸。简单:

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

另外,也许考虑一下:

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

0

您可以设置拖动项目时显示的图像。经过Chrome测试。

setDragImage

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

另外,正如答案中已经提到的draggable="false",如果根本不能拖动该元素,则可以在HTML元素上进行设置。


0

所有浏览器前缀的全部结束,无需选择或拖动:

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

您也可以将draggable属性设置为false。您可以使用内联HTML:draggable="false",Javascript:elm.draggable = false或jQuery:elm.attr('draggable', false)

您也可以处理的onmousedown功能return false。您可以使用内联HTML:onmousedown="return false",Javascript:elm.onmousedown=()=>return false;或jQuery:elm.mousedown(()=>return false)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.