CSS / JS untuk mencegah penarikan gambar hantu?

152

Apakah ada cara untuk mencegah pengguna melihat hantu gambar yang mereka coba seret (tidak khawatir tentang keamanan gambar, tetapi pengalaman).

Saya sudah mencoba ini yang memperbaiki masalah dengan pemilihan biru pada teks dan gambar tetapi tidak pada gambar hantu:

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

(Saya juga mencoba bersarang gambar di dalam div dengan aturan yang sama diterapkan pada div). Terima kasih

pengguna885355
sumber
1
Lihat jawaban ini: stackoverflow.com/a/4211930/1060487 pertanyaan dapat digandakan
mattdlockyer

Jawaban:

195

Anda dapat mengatur draggableatribut ke falsedalam markup atau kode JavaScript.

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

BoltClock
sumber
48
Mengapa menambahkannya dengan JavaScript ??? <img id="myImage" src="http://placehold.it/150x150" draggable="false">
Greg
26
@ Greg: Mengapa Anda bertanya kepada saya? OP yang menginginkan solusi JavaScript. Plus saya memang mengatakan "dalam kode markup atau JavaScript", jadi Anda tidak dapat melakukannya di markup jika Anda memiliki opsi untuk mengedit markup.
BoltClock
12
Tidak bekerja di FF dalam kombinasi dengan -moz-user-select: none. Kemungkinan solusi: Tambah pointer-events: none.
Cedric Reichenbach
9
Mungkin saya telah salah menafsirkan pertanyaan tetapi bukankah OP bertanya bagaimana mereka dapat mempertahankan drag & drop tetapi hanya menyembunyikan gambar hantu? Pengaturan draggableuntukfalse sepenuhnya menonaktifkan drag & drop.
James
1
@ James: Tidak terlalu jelas dari pertanyaan, jujur. Saya kebanyakan menjawab dengan asumsi bahwa gambar hantu adalah indikator visual untuk drag-and-drop (yang memang demikian), dan bahwa sebagian besar orang yang ingin menyembunyikan gambar hantu umumnya tidak peduli apakah drag-and-drop adalah dinonaktifkan sama sekali.
BoltClock
87

Saya pikir Anda dapat mengubah

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

menjadi a

img {
  -webkit-user-drag: none;
  -khtml-user-drag: none;
  -moz-user-drag: none;
  -o-user-drag: none;
  user-drag: none;
}
Maks
sumber
3
@victorsosa Benar, tetapi standar de-facto masih standar, W3C atau tidak. Artinya, jika setiap browser mendukungnya, ada baiknya untuk melanjutkan. Ingatlah bahwa banyak hal W3C dimulai sebagai milik, seperti AJAX.
Beejor
4
Solusi ini tidak berfungsi di IE11 dan Firefox 57.0.
Tudor Ciotlos
34

Cobalah:

img {
  pointer-events: none;
}

dan coba hindari

* {
  pointer-events: none;
}
Erik Rybalkin
sumber
8
Ini adalah solusi yang buruk, karena menghilangkan semua kemampuan untuk berinteraksi dengan elemen. OP hanya meminta untuk menonaktifkan fungsionalitas "seret" elemen, tidak sepenuhnya menonaktifkan interaksi berbasis pointer dengan elemen.
Chad
4
@Chad itu benar tetapi mungkin untuk membungkus gambar dan menambahkan pendengar acara ke pembungkus sementara gambar tidak memiliki gambar hantu lagi.
Vincent Hoch-Drei
18

Anda dapat menggunakan properti CSS untuk menonaktifkan gambar di browser webkit.

img{-webkit-user-drag: none;}
Ashwani
sumber
3
Ini juga bekerja dengan -ms-user-drag, -moz-user-drag, dan user-drag. Solusi khusus CSS yang bagus!
Beejor
14

Ini akan menonaktifkan seret untuk gambar di semua browser , sambil mempertahankan acara lain seperti klik dan arahkan. Bekerja selama ada HTML5, JS, atau CSS.

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

Jika Anda yakin pengguna akan memiliki JS, Anda hanya perlu menggunakan atribut JS, dll. Untuk lebih fleksibel, lihat ondragstart, onselectstart, dan beberapa WebKit tap / touch CSS.

Beejor
sumber
Anda mungkin ingin melakukan (this.onclick || this.click) () sebagai gantinya .. jika onclick dapat ditentukan menurut logika ini?
Van Nguyen
@ Kaizoku Terima kasih, saya tidak mempertimbangkan itu! Memperbarui jawaban saya berdasarkan saran Anda.
Beejor
Ini sepertinya tidak berfungsi di FireFox karena, sebenarnya, <img> bahkan tidak memiliki event klik atau klik. Bagaimanapun, saya hanya menggunakan bagian onmouseup dan membiarkan orangtua DIV menangani onclick dan itu berfungsi.
Nelson
@Nelson Terima kasih telah memberi tahu saya. Tampaknya onmouseup tidak diperlukan karena onclick kebakaran terlepas dari nilai balik dari onmousedown / up handler. Saya memutuskan untuk merevisi jawaban saya untuk kesederhanaan. One-liner baru harus bekerja dengan baik; baru saja diuji dalam FF, Safari, Chrome, IE8 / 10.
Beejor
Saya menggunakan Firefox 62 dan onmousedown="return false"cukup. Hal ini juga diperlukan untuk menghindari pengguna memilih gambar sambil menyeretnya, yang kemudian akan memungkinkan mereka untuk menyeret pilihan.
loxaxs
8

Tangani dragstartacara dan return false.

Slaks
sumber
4

Anda dapat menetapkan gambar hantu alternatif jika Anda benar-benar perlu menggunakan acara seret dan tidak dapat mengatur draggable = false. Jadi cukup berikan png kosong seperti ini:

    $('#img').bind({
        dragstart: function(e) {
            var dragIcon = document.createElement('img');
            dragIcon.src = 'blank.png';
            dragIcon.width = 100;
            e.dataTransfer.setDragImage(dragIcon, -10, -10);
        }
    });
louisinhongkong
sumber
2
Tidak semua browser mendukung setDragImage, bahkan jika mereka mendukung drag & drop misalnya IE10 / 11.
James
Apakah mungkin menggunakan trik ini tanpa benar-benar menggunakan png kosong?
Fabien Quatravaux
1
Anda dapat menggunakan gambar yang disandikan base64 yang didefinisikan secara inline ... misalnyadragIcon.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
Murray Smith
3

Tempatkan gambar sebagai latar belakang div kosong, atau di bawah elemen transparan. Ketika pengguna mengklik pada gambar untuk menarik, mereka mengklik div.

Lihat http://www.flickr.com/photos/thefella/5878724253/?f=hp

<div id="photo-drag-proxy"></div>
Michael Jasper
sumber
2

Untuk Firefox Anda harus sedikit lebih dalam dengan ini:

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

Nikmati.

dijipiji
sumber
1

Saya menemukan bahwa untuk IE, Anda harus menambahkan atribut draggable = "false" ke gambar dan jangkar untuk mencegah menyeret. opsi CSS berfungsi untuk semua browser lain. Saya melakukan ini di jQuery:

$("a").attr('draggable', false); 
$("img").attr('draggable', false);
Derek Wade
sumber
1

Ada solusi yang jauh lebih mudah di sini daripada menambahkan pendengar acara kosong. Cukup atur pointer-events: noneke gambar Anda. Jika Anda masih membutuhkannya untuk diklik, tambahkan wadah di sekitarnya yang memicu acara.

Mikros
sumber
1
<img src="myimage.jpg" ondragstart="return false;" />
lubosdz
sumber
0

Diuji pada Firefox: menghapus dan mengembalikan gambar berhasil! Dan itu transparan di eksekusi juga. Misalnya,

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

EDIT : Ini hanya berfungsi pada IE dan Firefox, anehnya. Saya juga menambahkan draggable = falsepada setiap gambar. Masih hantu dengan Chrome dan Safari.

EDIT 2 : Solusi gambar latar belakang adalah yang terbaik. Satu-satunya kehalusan adalah bahwa background-sizeproperti harus didefinisikan ulang setiap kali gambar latar belakang diubah! Atau begitulah, sepertinya dari sisi saya. Lebih baik lagi, saya punya masalah dengan imgtag normal di bawah IE, di mana IE gagal untuk mengubah ukuran gambar. Sekarang, gambar memiliki dimensi yang benar. Sederhana:

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

Juga, mungkin pertimbangkan itu:

background-Repeat:no-repeat;
background-Position: center center;
Tama Yoshi
sumber
0

Anda dapat mengatur gambar yang ditampilkan saat suatu item diseret. Diuji dengan Chrome.

setDragImage

menggunakan

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

Atau, seperti yang sudah disebutkan dalam jawaban, Anda dapat mengatur draggable="false"pada elemen HTML, jika tidak dapat menyeret elemen sama sekali tidak ada masalah.

Thibauld Nuyten
sumber
0

Be-all-end-all, tanpa memilih atau menyeret, dengan semua awalan peramban:

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

Anda juga dapat mengatur draggableatribut false. Anda dapat melakukannya dengan HTML sebaris:, draggable="false"dengan Javascript:, elm.draggable = falseatau dengan jQuery:elm.attr('draggable', false) .

Anda juga dapat menangani onmousedownfungsinya return false. Anda dapat melakukannya dengan HTML sebaris:, onmousedown="return false"dengan Javascript:, elm.onmousedown=()=>return false;atau dengan jQuery:elm.mousedown(()=>return false)

Justin
sumber
-1

Ini berfungsi untuk saya, saya menggunakan beberapa skrip lightbox

.nodragglement {
    transform: translate(0px, 0px)!important;
}

Wilson Delgado
sumber