Verhindern, dass ein Bild ohne Verwendung von JS ziehbar oder auswählbar ist

131

Kennt jemand eine Möglichkeit, ein Bild in Firefox nicht ziehbar und gleichzeitig nicht auswählbar zu machen, ohne auf Javascript zurückzugreifen? Scheint trivial, aber hier ist das Problem:

1) Kann in Firefox gezogen und hervorgehoben werden:

<img src="...">

2) Also fügen wir dies hinzu, aber das Bild kann beim Ziehen immer noch hervorgehoben werden:

<img src="..." draggable="false">

3) Also fügen wir dies hinzu, um das Hervorhebungsproblem zu beheben, aber dann wird das Bild nicht intuitiv wieder ziehbar. Seltsam, ich weiß! Verwenden von FF 16.0.1

<img src="..." draggable="false" style="-moz-user-select: none;">

Weiß jemand, warum das Hinzufügen von "-moz-user-select: none" "draggable = false" irgendwie übertrumpfen und deaktivieren würde? Natürlich funktioniert das Webkit wie erwartet. In den Interwebs gibt es darüber nichts ... Es wäre großartig, wenn wir gemeinsam etwas Licht ins Dunkel bringen könnten.

Vielen Dank!!

Bearbeiten: Hier geht es darum, zu verhindern, dass UI-Elemente versehentlich gezogen werden, und die Benutzerfreundlichkeit zu verbessern - kein lahmer Versuch eines Kopierschutzschemas :-)

tmkly3
quelle
1
Ich hoffe, Sie glauben nicht, dass dies die Leute daran hindert, Ihr Image auf der Festplatte zu speichern. Jeder, der auch nur ein wenig Verständnis für die Funktionsweise von Browsern hat, kann dies leicht umgehen.
Jim Garrison
@ JimGarrison natürlich nicht, sorry, ich hätte genauer sein sollen, ich versuche zu verhindern, dass einige meiner UI-Elemente verschoben werden. Im richtigen Kontext beeinträchtigt dies die Benutzerfreundlichkeit.
tmkly3
Sehr nützlich, wenn Sie Hintergrundelemente haben, die auf den Desktop gezogen werden (oder schlimmer noch, wenn href-Codezeilen in eine Datei im Hintergrund hinter dem Browserfenster geöffnet werden, während Sie daran arbeiten!), Wenn sie sich in der Nähe der sehr kleinen modernen Bildlaufleisten befinden und Sie Schlagen Sie nicht jedes Mal genau auf die Leiste, wenn Sie die Schriftrollen testen.
Garavani
1
Dies ist ein sehr bekanntes Problem in Firefox seit sehr langer Zeit, wie sich herausstellt ( Duplikat? )
Coderer

Antworten:

209

Legen Sie die folgenden CSS-Eigenschaften für das Bild fest:

user-drag: none; 
user-select: none;
-moz-user-select: none;
-webkit-user-drag: none;
-webkit-user-select: none;
-ms-user-select: none;
Jeff Wooden
quelle
3
Vielen Dank, ich habe diese auch installiert, aber das Problem sieht allmählich wie ein Fehler in Firefox aus. Ich denke, der einzige Weg, dies zu lösen, ist Javascript.
tmkly3
Funktionierte in allen Browsern.
Milad Abooali
Okay, wie kann ich dafür sorgen, dass es keinen Effekt zeigt, aber trotzdem das Drag-Ereignis auslöst?
Ty_
6
Ich stellte fest, dass ich Firefox 47 immer noch ziehen konnte, aber Masadows ondragstart = "return false;" Eigenschaft zum Image-Tag behoben.
Andrew Pate
3
Ich kann immer noch in Chrom ziehen
lonewarrior556
54

Ich habe vergessen, meine Lösung zu teilen. Ohne JS konnte ich keinen Weg finden, dies zu tun. Es gibt einige Eckfälle, in denen das von @Jeffery A Wooden vorgeschlagene CSS nicht behandelt wird.

Dies ist, was ich auf alle meine UI-Container anwende. Es muss nicht auf jedes Element angewendet werden, da es auf alle untergeordneten Elemente angewendet wird.

CSS:

.unselectable {
    /* For Opera and <= IE9, we need to add unselectable="on" attribute onto each element */
    /* Check this site for more details: http://help.dottoro.com/lhwdpnva.php */
    -moz-user-select: none; /* These user-select properties are inheritable, used to prevent text selection */
    -webkit-user-select: none;
    -ms-user-select: none; /* From IE10 only */
    user-select: none; /* Not valid CSS yet, as of July 2012 */

    -webkit-user-drag: none; /* Prevents dragging of images/divs etc */
    user-drag: none;
}

JS:

var makeUnselectable = function( $target ) {
    $target
        .addClass( 'unselectable' ) // All these attributes are inheritable
        .attr( 'unselectable', 'on' ) // For IE9 - This property is not inherited, needs to be placed onto everything
        .attr( 'draggable', 'false' ) // For moz and webkit, although Firefox 16 ignores this when -moz-user-select: none; is set, it's like these properties are mutually exclusive, seems to be a bug.
        .on( 'dragstart', function() { return false; } );  // Needed since Firefox 16 seems to ingore the 'draggable' attribute we just applied above when '-moz-user-select: none' is applied to the CSS 

    $target // Apply non-inheritable properties to the child elements
        .find( '*' )
        .attr( 'draggable', 'false' )
        .attr( 'unselectable', 'on' ); 
};

Das war viel komplizierter als es sein musste.

tmkly3
quelle
1
$ (el) .on ('Dragstart', Funktion (e) {e.preventDefault ();});
Pete B
3
Es könnte auch so geschrieben werden <img src="..." draggable="false" style="-moz-user-select: none;" ondragstart="return false;">, dass es mit dem Code von OP übereinstimmt.
Masadow
38

Sie können die pointer-eventsEigenschaft in Ihrem CSS verwenden und sie auf "keine" setzen.

img {
    pointer-events: none;
}

Bearbeitet

Dadurch wird das Ereignis blockiert (angeklickt). Eine bessere Lösung wäre also

<img draggable="false" (dragstart)="false;" class="unselectable">

.unselectable {
  user-drag: none; 
  user-select: none;
  -moz-user-select: none;
  -webkit-user-drag: none;
  -webkit-user-select: none;
  -ms-user-select: none;
}
Linh Dam
quelle
1
Wenn Sie dies auf diese Weise tun, verhält sich ein Bildsymbol eher wie ein Glyphikon. Daher gefällt mir diese Methode am besten.
Funkodebat
9
Dies macht auch Ereignisse wie (onclick) unbrauchbar. Seien Sie vorsichtig, wenn Sie diesen Ansatz verwenden.
Nicolas Bouvrette
Diese Antwort ist weiterhin gültig, solange die akzeptierte Antwort nicht in den neuesten Softwareversionen enthalten ist. Dies sollte die neu akzeptierte Antwort sein. @ tmkly3
Progyammer
Dies führt zu Problemen, wenn wir ein Klickereignis für das Bild haben. Es wird das Klick-Ereignis blockieren
Pratap AK
12

Je nach Situation ist es oft hilfreich, das Bild als Hintergrundbild eines divmit CSS zu erstellen.

<div id='my-image'></div>

Dann in CSS:

#my-image {
    background-image: url('/img/foo.png');
    width: ???px;
    height: ???px;
}

In dieser JSFiddle finden Sie ein Live-Beispiel mit einer Schaltfläche und einer anderen Größenoption.

Nick Merrill
quelle
9

Sie könnten wahrscheinlich einfach darauf zurückgreifen

<img src="..." style="pointer-events: none;">
Thomas Bachem
quelle
Dies sollte die akzeptierte Antwort sein. Das Ziehen von Benutzern wird von Firefox nicht unterstützt. Danke dafür!
Merritt6616
Auch für mich war "Pointer-Events" die Lösung, da es browserübergreifend funktionierte ("User-Drag" hat zumindest in 11.2018 keine Auswirkungen auf Firefox)
David Dal Busco
2

Eine generische Lösung speziell für Windows Edge-Browser (als -ms-user-select: keine; CSS-Regel funktioniert nicht):

window.ondragstart = function() {return false}

Hinweis: Dies erspart Ihnen das Hinzufügen draggable="false"zu jedem imgTag, wenn Sie das Klickereignis noch benötigen (dh nicht verwenden können pointer-events: none), aber nicht möchten, dass das Drag-Symbol angezeigt wird.

Philip Murphy
quelle
Die einzige Antwort, die bei mir tatsächlich funktioniert! Ich weiß nicht, warum es nicht höher gewählt wird.
AldaronLau
1

Sie können das Bild als Hintergrundbild festlegen. Da es sich in a divbefindet und das nicht divzerlegbar ist, ist das Bild nicht zerlegbar:

<div style="background-image: url("image.jpg");">
</div>
Joshua Pogi 28
quelle
1

Ich habe ein div- Element erstellt, das dieselbe Größe wie das Bild hat und über dem Bild positioniert ist . Dann gehen die Mausereignisse nicht zum Bildelement.

Benutzer
quelle