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

回答:


195

あなたは、設定することができますdraggableに属性をfalseマークアップやJavaScriptコードのいずれかで。

// 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
@グレッグ:なぜあなたは私に尋ねるのですか?JavaScriptソリューションを求めていたのはOPです。さらに、私はとにかく「マークアップまたはJavaScriptコードのどちらかで」と言ったので、マークアップを編集するオプションがあったとしても、マークアップでそれを行うことができなかったようではありません。
BoltClock

12
と組み合わせたFFでは機能しません-moz-user-select: none。可能な解決策:を追加しpointer-events: noneます。
セドリックライヘンバッハ2014

9
多分私は質問を間違って解釈したかもしれませんが、OPはドラッグアンドドロップを保持する方法を尋ねているのではなく、ゴーストイメージを非表示にしていますか?設定draggablefalseと、ドラッグアンドドロップが完全に無効になります。
ジェームズ

1
@ジェームズ:正直に言うと、質問からは明確ではありません。私はほとんどゴースト画像がドラッグアンドドロップの視覚的インジケーターであるという仮定のもとで答えています(それはそうです)。完全に無効になっています。
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、2018年

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-drag、とuser-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

@海賊ありがとう、私はそれを考えていませんでした!あなたの提案に基づいて私の答えを更新しました。
Beejor 2016年

厳密に言えば、<img>にはonclickイベントやclickイベントさえないため、これはFireFoxでは機能しないようです。とにかく、私はonmouseupの部分を使用して、親DIVにonclickを処理させるだけで機能します。
ネルソン

@ネルソン教えてくれてありがとう。onmousedown / upハンドラーからの戻り値に関係なくonclickが発生するため、とにかくonmouseupは必要なかったようです。簡単にするために、回答を修正することにしました。新しいワンライナーは問題なく機能するはずです。FF、Safari、Chrome、IE8 / 10でテストされました。
Beejor 2016

私はFirefox 62を使用してonmousedown="return false"おり、十分です。また、ユーザーが画像をドラッグしているときに画像を選択しないようにする必要もあります。これにより、ユーザーが画像をドラッグできるようになります。
loxaxs


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
setDragImageIE10 / 11などのドラッグアンドドロップをサポートしていても、すべてのブラウザがをサポートしているわけではありません。
ジェームズ

実際に空白のpngを使用せずにこのトリックを使用することは可能ですか?
Fabien Quatravaux 2014

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、背景画像が変更されるたびにプロパティを再定義する必要があることです。または、それは私の側から見たものです。さらに良いことに、imgIEの通常のタグに問題があり、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

be-all-end-all。すべてのブラウザプレフィックスを使用して、選択やドラッグを行わない場合:

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.