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.


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;

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.


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

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.


9

Prawdopodobnie możesz po prostu uciec się do tego

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

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.


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.


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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.