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


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;

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.


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

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.


9

Sie könnten wahrscheinlich einfach darauf zurückgreifen

<img src="..." style="pointer-events: none;">

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.


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>

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.