Zapobieganie możliwości przeciągania lub zaznaczania obrazu bez użycia JS

139

Czy ktoś wie, jak sprawić, by obraz nie był przeciągany i nie można go było jednocześnie wybrać w przeglądarce Firefox, bez uciekania się do JavaScript? Wydaje się trywialne, ale oto problem:

  1. Można przeciągać i zaznaczać w przeglądarce Firefox:

  2. Dodajemy więc to, ale obraz nadal może być podświetlony podczas przeciągania:

  3. Dodajemy więc to, aby rozwiązać problem z podświetlaniem, ale potem, wbrew intuicji , obraz znów staje się przeciągalny. Wiem, dziwne! Korzystanie z FF 16.0.1

Więc czy ktoś wie, dlaczego dodawanie -moz-user-select: none, miałoby w jakiś sposób przebić i wyłączyć draggable=false? Oczywiście webkit działa zgodnie z oczekiwaniami. W Interwebach nie ma nic na ten temat ... Byłoby wspaniale, gdybyśmy mogli razem rzucić trochę światła na to.

Edycja: Chodzi o to, aby zapobiec nieumyślnemu przeciągnięciu elementów interfejsu użytkownika i poprawić użyteczność - a nie jakąś kiepską próbę schematu ochrony przed kopiowaniem.

tmkly3
źródło
1
Mam nadzieję, że nie sądzisz, że to uniemożliwi ludziom zapisywanie twojego obrazu na dysku. Każdy, kto choć trochę rozumie, jak działają przeglądarki, będzie mógł łatwo obejść ten problem.
Jim Garrison,
@JimGarrison, oczywiście, że nie, przepraszam, że powinienem był być bardziej szczegółowy, staram się, aby niektóre elementy mojego interfejsu użytkownika nie były przenoszone, w odpowiednim kontekście szkodzi to użyteczności.
tmkly3
Bardzo przydatne zamiast tego, jeśli masz elementy tła, które zostaną przeciągnięte na pulpit (lub gorzej jako linie kodu href do jakiegoś pliku otwartego w tle za oknem przeglądarki podczas pracy nad nim!), Gdy są blisko bardzo małych nowoczesnych pasków przewijania, a ty nie uderzaj w pasek dokładnie za każdym razem, gdy testujesz zwoje.
Garavani,
1
To był znany problem w Firefoksie przez naprawdę długi czas, jak się okazuje ( duplikat? )
Coderer

Odpowiedzi:

218

Ustaw następujące właściwości CSS na obraz:

user-drag: none; 
user-select: none;
-moz-user-select: none;
-webkit-user-drag: none;
-webkit-user-select: none;
-ms-user-select: none;
Jeff Wooden
źródło
3
Dzięki, mam je również na miejscu, ale problem zaczyna wyglądać jak błąd w Firefoksie. Myślę, że jedynym sposobem rozwiązania tego problemu jest na razie JavaScript.
tmkly3
6
Okazało się, że nadal mogę przeciągać w przeglądarce Firefox 47, ale dodając ondragstart = "return false;" właściwość do tagu obrazu naprawiła to.
pasztet
3
Nadal mogę przeciągnąć chrom
lonewarrior556
1
user-dragdziała tylko w Safari. jeśli dodasz draggable="false"do tagu obrazu, nie będzie można go przeciągać.
WrksOnMyMachine
1
Kiedy ustawić user-select: nonete user-drag: nonewłaściwości nie działają ... Chrome 80
Eliasz Mock
54

Zapomniałem udostępnić swoje rozwiązanie, nie mogłem znaleźć sposobu na zrobienie tego bez użycia JS. Są pewne narożne przypadki, w których sugerowany CSS @Jeffery A Wooden po prostu nie obejmuje.

To jest to, co stosuję do wszystkich moich kontenerów UI, nie ma potrzeby stosowania do każdego elementu, ponieważ ponownie wykorzystuje wszystkie elementy podrzędne.

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

To było o wiele bardziej skomplikowane, niż było to konieczne.

tmkly3
źródło
1
$ (el) .on ('dragstart', function (e) {e.preventDefault ();});
Pete B
3
Można go również napisać tak, <img src="..." draggable="false" style="-moz-user-select: none;" ondragstart="return false;">aby pasował do kodu OP.
Masadow
41

Możesz użyć tej pointer-eventswłaściwości w swoim CSS i ustawić ją na „none”

img {
    pointer-events: none;
}

Edytowano

spowoduje to zablokowanie (kliknięcie) zdarzenia. Więc lepsze byłoby rozwiązanie

<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
źródło
1
Zrobienie tego w ten sposób sprawia, że ​​ikona obrazu zachowuje się bardziej jak glifikon, więc najbardziej podoba mi się ta metoda.
Funkodebat
9
To również sprawia, że ​​zdarzenia takie jak (onclick) stają się bezużyteczne ... bądź ostrożny, jeśli używasz tego podejścia.
Nicolas Bouvrette
Ta odpowiedź jest nadal ważna, podczas gdy zaakceptowana odpowiedź nie dotyczy najnowszych wersji oprogramowania. To powinna być nowa zaakceptowana odpowiedź. @ tmkly3
progyammer
spowoduje to problem, jeśli mamy zdarzenie kliknięcia obrazu. Zablokuje zdarzenie kliknięcia
Pratap AK
12

W zależności od sytuacji często pomocne jest ustawienie obrazu jako tła w divCSS.

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

Następnie w CSS:

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

Zobacz ten JSFiddle, aby zobaczyć przykład na żywo z przyciskiem i inną opcją zmiany rozmiaru.

Nick Merrill
źródło
9

Prawdopodobnie możesz po prostu uciec się do tego

<img src="..." style="pointer-events: none;">
Thomas Bachem
źródło
To powinna być akceptowana odpowiedź, przeciąganie użytkownika nie jest obsługiwane przez przeglądarkę Firefox. Dziękuję Ci za to!
Merritt6616
Dla mnie też rozwiązaniem było „pointer-events”, ponieważ działało w różnych przeglądarkach („user-drag” nie ma wpływu na Firefoksa, przynajmniej w 11.2018)
David Dal Busco
3

Ogólne rozwiązanie specjalnie dla przeglądarki Windows Edge (jako -ms-user-select: none; reguła CSS nie działa):

window.ondragstart = function() {return false}

Uwaga: dzięki temu nie musisz dodawać draggable="false"do każdego imgtagu, gdy nadal potrzebujesz zdarzenia kliknięcia (tj. Nie możesz go użyćpointer-events: none ), ale nie chcesz, aby pojawił się obraz ikony przeciągania.

Philip Murphy
źródło
Jedyna odpowiedź, która faktycznie działa dla mnie! Nie wiem, dlaczego nie głosowano wyżej.
AldaronLau
2

Utworzyłem element div , który ma taki sam rozmiar jak obraz i jest umieszczony na górze obrazu . Wtedy zdarzenia myszy nie przechodzą do elementu obrazu.

Użytkownik
źródło
1

Możesz ustawić obraz jako obraz tła. Ponieważ znajduje się on w a div, a divplik jest niemożliwy do przecięcia, obraz nie będzie można przesuwać:

<div style="background-image: url("image.jpg");">
</div>
joshua pogi 28
źródło