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.