CSS / JS, aby zapobiec przeciąganiu obrazu-widma?


152

Czy istnieje sposób, aby uniemożliwić użytkownikowi zobaczenie ducha obrazu, który próbują przeciągnąć (nie dotyczy to bezpieczeństwa obrazów, ale wrażenia).

Wypróbowałem to, co rozwiązuje problem z niebieskim zaznaczeniem tekstu i obrazów, ale nie z obrazem-duchem:

img {
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -o-user-select: none;
  user-select: none;
}

(Próbowałem też zagnieżdżać obraz w elemencie div, stosując te same zasady, co w przypadku elementu div). Dzięki


1
Zobacz tę odpowiedź: stackoverflow.com/a/4211930/1060487 pytanie jest możliwe duplikat
mattdlockyer

Odpowiedzi:


195

Możesz ustawić draggableatrybut na falsew kodzie znaczników lub JavaScript.

// As a jQuery method: $('#myImage').attr('draggable', false);
document.getElementById('myImage').setAttribute('draggable', false);
<img id="myImage" src="http://placehold.it/150x150">


48
Po co dodawać go za pomocą JavaScript ??? <img id="myImage" src="http://placehold.it/150x150" draggable="false">
Greg,

26
@Greg: Dlaczego mnie o to pytasz? To OP, który chciał rozwiązania JavaScript. Poza tym i tak powiedziałem „albo w kodzie znaczników, albo w kodzie JavaScript”, więc nie jest tak, że nie można tego zrobić w znacznikach, gdybyś miał możliwość edycji swoich znaczników.
BoltClock

12
Nie działa w FF w połączeniu z -moz-user-select: none. Możliwe rozwiązanie: dodaj pointer-events: none.
Cedric Reichenbach

9
Może źle zinterpretowałem pytanie, ale czy OP nie pyta, jak mogą zachować funkcję przeciągnij i upuść, ale po prostu ukryć obraz widmo? Ustawianie draggablesię falsecałkowicie wyłączyć przeciągnij i upuść.
James

1
@James: Szczerze mówiąc, z pytania nie wynika jasno. Odpowiadam głównie przy założeniu, że obraz ducha jest wizualnym wskaźnikiem przeciągania i upuszczania (a tak jest) i że większość ludzi, którzy chcą ukryć obraz ducha, generalnie nie obchodzi, czy przeciąganie i upuszczanie jest całkowicie wyłączone.
BoltClock

87

Myślę, że możesz zmienić swoje

img {
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -o-user-select: none;
  user-select: none;
}

do

img {
  -webkit-user-drag: none;
  -khtml-user-drag: none;
  -moz-user-drag: none;
  -o-user-drag: none;
  user-drag: none;
}

3
@victorsosa Prawda, ale de facto standard jest nadal standardem, W3C czy nie. Oznacza to, że jeśli każda przeglądarka go obsługuje, dobrze jest iść. Pamiętaj, że wiele rzeczy związanych z W3C zaczynało się jako zastrzeżone, jak AJAX.
Beejor

4
To rozwiązanie nie działa w IE11 i Firefox 57.0.
Tudor Ciotlos

34

Spróbuj:

img {
  pointer-events: none;
}

i staraj się tego unikać

* {
  pointer-events: none;
}

8
To kiepskie rozwiązanie, ponieważ usuwa wszelkie możliwości interakcji z elementem. OP prosi jedynie o wyłączenie funkcji „przeciągania” elementu, a nie o całkowite wyłączenie jakiejkolwiek i wszystkich interakcji opartych na wskaźnikach z elementem.
Czad

4
@Chad to prawda, ale możliwe jest zawinięcie obrazu i dodanie detektora zdarzeń do opakowania, gdy obraz nie ma już obrazu-ducha.
Vincent Hoch-Drei

18

Możesz użyć właściwości CSS, aby wyłączyć obrazy w przeglądarkach Webkit.

img{-webkit-user-drag: none;}

3
To również działa z -ms-user-drag, -moz-user-drag, i user-drag. Świetne rozwiązanie tylko dla CSS!
Beejor

14

Spowoduje to wyłączenie przeciągania obrazu we wszystkich przeglądarkach , zachowując jednocześnie inne zdarzenia, takie jak kliknięcie i najechanie kursorem. Działa tak długo, jak długo dostępny jest dowolny z HTML5, JS lub CSS.

<img draggable="false" onmousedown="return false" style="user-drag: none" />

Jeśli jesteś pewien, że użytkownik będzie miał JS, wystarczy użyć atrybutu JS, itp. Aby uzyskać większą elastyczność, zapoznaj się z ondragstart, onselectstart i niektórymi plikami CSS typu tap / touch WebKit.


Możesz zamiast tego zrobić (this.onclick || this.click) () .. czy onclick może być niezdefiniowany zgodnie z tą logiką?
Van Nguyen

@Kaizoku Dzięki, nie brałem tego pod uwagę! Zaktualizowałem moją odpowiedź na podstawie Twojej sugestii.
Beejor

Wydaje się, że to nie działa w FireFox, ponieważ, ściśle mówiąc, <img> nie ma nawet zdarzeń onclick ani click. Tak czy inaczej, właśnie użyłem części onmouseup i pozwoliłem rodzicowi DIV obsłużyć onclick i działa.
Nelson

@Nelson Dzięki za poinformowanie mnie. Wygląda na to, że onmouseup i tak nie był potrzebny, ponieważ onclick uruchamia się niezależnie od wartości zwracanej przez jakąkolwiek procedurę obsługi onmousedown / up. Postanowiłem zrewidować swoją odpowiedź dla uproszczenia. Nowa jednoliniowa powinna działać dobrze; właśnie przetestowany w FF, Safari, Chrome, IE8 / 10.
Beejor

Jestem na Firefoksie 62 i onmousedown="return false"wystarczy. Konieczne jest również, aby użytkownik nie wybierał obrazu podczas przeciągania po nim, co pozwoliłoby mu na przeciągnięcie zaznaczenia.
loxaxs


4

Możesz przypisać alternatywny obraz ducha, jeśli naprawdę potrzebujesz użyć zdarzeń przeciągania i nie możesz ustawić draggable = false. Po prostu przypisz pusty plik png w następujący sposób:

    $('#img').bind({
        dragstart: function(e) {
            var dragIcon = document.createElement('img');
            dragIcon.src = 'blank.png';
            dragIcon.width = 100;
            e.dataTransfer.setDragImage(dragIcon, -10, -10);
        }
    });

2
Nie wszystkie przeglądarki obsługują setDragImage, nawet jeśli obsługują przeciągnij i upuść, np. IE10 / 11.
James

Czy można użyć tej sztuczki bez użycia pustego pliku png?
Fabien Quatravaux

1
Możesz użyć zdefiniowanego w linii obrazu zakodowanego w base64 ... np.dragIcon.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
Murray Smith


2

W przypadku przeglądarki Firefox musisz pójść trochę głębiej z tym:

var imgs = document.getElementsByTagName('img');

    // loop through fetched images
    for (i = 0; i < imgs.length; i++) {
        // and define onmousedown event handler
        imgs[i].onmousedown = disableDragging;
    }

function disableDragging(e) {
        e.preventDefault();
    }

Cieszyć się.


1

Zauważyłem, że w przypadku IE należy dodać atrybut draggable = "false" do obrazów i kotwic, aby zapobiec przeciąganiu. opcje CSS działają we wszystkich innych przeglądarkach. Zrobiłem to w jQuery:

$("a").attr('draggable', false); 
$("img").attr('draggable', false);

1

Jest o wiele łatwiejsze rozwiązanie niż dodanie pustych detektorów zdarzeń. Po prostu ustaw pointer-events: noneswój obraz. Jeśli nadal chcesz, aby było klikalne, dodaj wokół niego kontener, który wyzwala zdarzenie.



0

Testowane w przeglądarce Firefox: usuwanie i przywracanie obrazu działa! I jest przezroczysty również podczas wykonania. Na przykład,

$('.imageContainerClass').mousedown(function() {
    var id = $(this).attr('id');
    $('#'+id).remove();
    $('#'+id).append('Image tag code');
});

EDYCJA : Dziwnie działa to tylko w IE i Firefox. Dodałem też draggable = falsedo każdego obrazu. Wciąż duch z Chrome i Safari.

EDYCJA 2 : Rozwiązanie obrazu tła jest naprawdę najlepsze. Jedyną subtelnością jest to, że background-sizewłaściwość musi być przedefiniowana za każdym razem, gdy zmienia się obraz tła! A przynajmniej tak to wyglądało z mojej strony. Co więcej, miałem problem z normalnymi imgtagami w IE, gdzie IE nie mógł zmienić rozmiaru obrazów. Teraz obrazy mają prawidłowe wymiary. Prosty:

$(id).css( 'background-image', url('blah.png') );
$(id).css( 'background-size', '40px');

Warto też rozważyć te:

background-Repeat:no-repeat;
background-Position: center center;

0

Możesz ustawić obraz, który jest wyświetlany, gdy element jest przeciągany. Przetestowano w Chrome.

setDragImage

posługiwać się

onclick = myFunction();
myFunction(e) {
    e.dataTransfer.setDragImage(someImage, xOffset, yOffset);
}

Alternatywnie, jak już wspomniano w odpowiedziach, możesz ustawić draggable="false"element HTML, jeśli brak możliwości przeciągnięcia elementu w ogóle nie stanowi problemu.


0

Koniec wszystkiego, bez wybierania ani przeciągania, ze wszystkimi prefiksami przeglądarki:

-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-o-user-select: none;
-ms-user-select: none;
user-select: none;

-webkit-user-drag: none;
-khtml-user-drag: none;
-moz-user-drag: none;
-o-user-drag: none;
-ms-user-drag: none;
user-drag: none;

Możesz również ustawić draggableatrybut na false. Można to zrobić z inline HTML: draggable="false"z javascript: elm.draggable = falsealbo z jQuery: elm.attr('draggable', false).

Możesz również obsłużyć onmousedownfunkcję do return false. Możesz to zrobić za pomocą wbudowanego HTML:, onmousedown="return false"Javascript: elm.onmousedown=()=>return false;lub jQuery:elm.mousedown(()=>return false)


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.