CSS / JS, um das Ziehen von Geisterbildern zu verhindern?

152

Gibt es eine Möglichkeit, den Benutzer daran zu hindern, einen Geist des Bildes zu sehen, das er ziehen möchte (keine Sorge um die Sicherheit der Bilder, sondern um die Erfahrung).

Ich habe dies versucht, wodurch das Problem mit der blauen Auswahl für Text und Bilder behoben wird, nicht jedoch für das Geisterbild:

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

(Ich habe auch versucht, das Bild in einem Div zu verschachteln, wobei die gleichen Regeln für das Div gelten). Vielen Dank

user885355
quelle
1
Siehe diese Antwort: stackoverflow.com/a/4211930/1060487 Frage ist möglich doppelt
Mattdlockyer

Antworten:

195

Sie können das draggableAttribut falseentweder im Markup- oder im JavaScript-Code festlegen .

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

BoltClock
quelle
48
Warum mit JavaScript hinzufügen ??? <img id="myImage" src="http://placehold.it/150x150" draggable="false">
Greg
26
@ Greg: Warum fragst du mich? Es ist das OP, das eine JavaScript-Lösung wollte. Außerdem habe ich sowieso "entweder im Markup- oder im JavaScript-Code" gesagt, sodass es nicht so ist, als könnten Sie es im Markup nicht tun, wenn Sie die Option hätten, Ihr Markup zu bearbeiten.
BoltClock
12
Funktioniert nicht in FF in Kombination mit -moz-user-select: none. Mögliche Lösung: Hinzufügen pointer-events: none.
Cedric Reichenbach
9
Vielleicht habe ich die Frage falsch interpretiert, aber fragt das OP nicht, wie sie Drag & Drop beibehalten, aber nur das Geisterbild verbergen können? Bei Einstellung draggableauf falsewird Drag & Drop vollständig deaktiviert.
James
1
@ James: Es ist nicht sehr klar aus der Frage, um ehrlich zu sein. Ich antworte meistens unter der Annahme, dass das Geisterbild ein visueller Indikator für Drag & Drop ist (was es ist) und dass es den meisten Leuten, die das Geisterbild ausblenden möchten, im Allgemeinen egal ist, ob Drag & Drop ist insgesamt deaktiviert.
BoltClock
87

Ich denke du kannst deine ändern

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

in ein

img {
  -webkit-user-drag: none;
  -khtml-user-drag: none;
  -moz-user-drag: none;
  -o-user-drag: none;
  user-drag: none;
}
Max
quelle
3
@victorsosa Stimmt, aber ein De-facto-Standard ist immer noch ein Standard, W3C oder nicht. Das heißt, wenn jeder Browser dies unterstützt, ist es gut zu gehen. Denken Sie daran, dass viele W3C-Produkte wie AJAX als proprietär angefangen haben.
Beejor
4
Diese Lösung funktioniert nicht in IE11 und Firefox 57.0.
Tudor Ciotlos
34

Versuch es:

img {
  pointer-events: none;
}

und versuchen zu vermeiden

* {
  pointer-events: none;
}
Erik Rybalkin
quelle
8
Dies ist eine schlechte Lösung, da dadurch keine Möglichkeit mehr besteht, mit dem Element zu interagieren. OP fordert nur dazu auf, die "Drag" -Funktionalität eines Elements zu deaktivieren und nicht alle zeigerbasierten Interaktionen mit dem Element vollständig zu deaktivieren.
Tschad
4
@Chad das stimmt, aber es ist möglich, das Bild zu verpacken und den Ereignis-Listener zum Wrapper hinzuzufügen, während das Bild kein Geisterbild mehr hat.
Vincent Hoch-Drei
18

Sie können eine CSS-Eigenschaft verwenden, um Bilder in Webkit-Browsern zu deaktivieren.

img{-webkit-user-drag: none;}
Ashwani
quelle
3
Dies funktioniert auch mit -ms-user-drag, -moz-user-dragund user-drag. Eine großartige CSS-Lösung!
Beejor
14

Dadurch wird das Ziehen für ein Bild in allen Browsern deaktiviert , während andere Ereignisse wie Klicken und Bewegen beibehalten werden. Funktioniert, solange HTML5, JS oder CSS verfügbar sind.

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

Wenn Sie sicher sind, dass der Benutzer über JS verfügt, müssen Sie nur das JS-Attribut usw. verwenden. Weitere Flexibilität finden Sie in ondragstart, onselectstart und einigen WebKit-Tap / Touch-CSS.

Beejor
quelle
Vielleicht möchten Sie stattdessen (this.onclick || this.click) () tun .. wenn onclick gemäß dieser Logik undefiniert sein kann?
Van Nguyen
@ Kaizoku Danke, das hatte ich nicht bedacht! Meine Antwort wurde aufgrund Ihres Vorschlags aktualisiert.
Beejor
Dies scheint in FireFox nicht zu funktionieren, da <img> streng genommen nicht einmal Onclick- oder Click-Ereignisse hat. Wie auch immer, ich habe nur den Onmouseup-Teil verwendet und den übergeordneten DIV den Onclick ausführen lassen, und es funktioniert.
Nelson
@ Nelson Danke, dass du mich informiert hast. Es scheint, dass das Onmouseup sowieso nicht benötigt wurde, da Onclick ausgelöst wird, unabhängig vom Rückgabewert eines Onmousedown / Up-Handlers. Ich habe mich entschlossen, meine Antwort der Einfachheit halber zu überarbeiten. Der neue Einzeiler sollte gut funktionieren; gerade in FF, Safari, Chrome, IE8 / 10 getestet.
Beejor
Ich bin auf Firefox 62 und onmousedown="return false"ist ausreichend. Es ist auch erforderlich, um zu vermeiden, dass der Benutzer das Bild beim Ziehen auswählt, wodurch er die Auswahl ziehen kann.
Loxaxs
8

Behandeln Sie die dragstartVeranstaltung und return false.

SLaks
quelle
4

Sie können ein alternatives Geisterbild zuweisen, wenn Sie wirklich Drag-Ereignisse verwenden müssen und draggable = false nicht festlegen können. Weisen Sie einfach ein leeres PNG wie folgt zu:

    $('#img').bind({
        dragstart: function(e) {
            var dragIcon = document.createElement('img');
            dragIcon.src = 'blank.png';
            dragIcon.width = 100;
            e.dataTransfer.setDragImage(dragIcon, -10, -10);
        }
    });
Louisinhongkong
quelle
2
Nicht alle Browser unterstützen setDragImageDrag & Drop, z. B. IE10 / 11.
James
Ist es möglich, diesen Trick zu verwenden, ohne tatsächlich ein leeres PNG zu verwenden?
Fabien Quatravaux
1
Sie könnten ein Inline-definiertes Base64-codiertes Bild verwenden ... zBdragIcon.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
Murray Smith,
3

Platzieren Sie das Bild als Hintergrund eines leeren Divs oder unter einem transparenten Element. Wenn der Benutzer zum Ziehen auf das Bild klickt, klickt er auf ein Div.

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

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

Für Firefox müssen Sie etwas tiefer gehen:

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

Genießen.

dijipiji
quelle
1

Ich habe festgestellt, dass Sie für IE das Attribut draggable = "false" zu Bildern und Ankern hinzufügen müssen, um ein Ziehen zu verhindern. Die CSS-Optionen funktionieren für alle anderen Browser. Ich habe das in jQuery gemacht:

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

Hier gibt es eine viel einfachere Lösung als das Hinzufügen leerer Ereignis-Listener. Stellen pointer-events: noneSie einfach Ihr Bild ein. Wenn Sie weiterhin darauf klicken müssen, fügen Sie einen Container hinzu, der das Ereignis auslöst.

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

Auf Firefox getestet: Das Entfernen und Zurücksetzen des Bildes funktioniert! Und es ist auch bei der Ausführung transparent. Zum Beispiel,

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

BEARBEITEN : Dies funktioniert seltsamerweise nur im IE und in Firefox. Ich habe auch draggable = falsejedes Bild hinzugefügt . Immer noch ein Geist mit Chrome und Safari.

EDIT 2 : Die Hintergrundbildlösung ist wirklich die beste. Die einzige Subtilität ist, dass die background-sizeEigenschaft jedes Mal neu definiert werden muss, wenn das Hintergrundbild geändert wird! Zumindest sah es von meiner Seite so aus. Besser noch, ich hatte ein Problem mit normalen imgTags unter IE, bei denen IE die Größe der Bilder nicht ändern konnte. Jetzt haben die Bilder die richtigen Abmessungen. Einfach:

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

Betrachten Sie vielleicht auch diese:

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

Sie können das Bild festlegen, das beim Ziehen eines Elements angezeigt wird. Getestet mit Chrome.

setDragImage

verwenden

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

Alternativ können Sie, wie bereits in den Antworten erwähnt, draggable="false"das HTML-Element festlegen , wenn es kein Problem ist, das Element überhaupt nicht ziehen zu können.

Thibauld Nuyten
quelle
0

Das A und O ohne Auswahl oder Ziehen mit allen Browserpräfixen:

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

Sie können das draggableAttribut auch auf festlegen false. Sie können dies mit Inline-HTML : draggable="false", mit Javascript: elm.draggable = falseoder mit jQuery: tun elm.attr('draggable', false).

Sie können die onmousedownFunktion auch an handhaben return false. Sie können dies mit Inline-HTML : onmousedown="return false", mit Javascript: elm.onmousedown=()=>return false;oder mit jQuery: tun.elm.mousedown(()=>return false)

Justin
quelle
-1

Diese Arbeit für mich, ich benutze einige Lightbox-Skripte

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

Wilson Delgado
quelle