CSS / JS hayalet görüntünün sürüklenmesini önlemek için?


152

Kullanıcının sürüklemeye çalıştıkları görüntünün bir hayaletini görmesini önlemenin bir yolu var mı (görüntülerin güvenliği ile ilgili endişe değil, deneyim).

Metin ve resimlerdeki mavi seçim ile ilgili sorunu çözen bu sorunu denedim ama hayalet resmi değil:

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

(Ayrıca div için uygulanan aynı kurallara sahip bir div içindeki görüntüyü iç içe yerleştirmeyi denedim). Teşekkürler


1
Bu cevaba bakın: stackoverflow.com/a/4211930/1060487 soru mümkündür yinelenen
mattdlockyer

Yanıtlar:


195

draggableÖzelliği falseişaretlemede veya JavaScript kodunda olarak ayarlayabilirsiniz .

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


48
Neden JavaScript ile eklemelisiniz ??? <img id="myImage" src="http://placehold.it/150x150" draggable="false">
Greg

26
@Greg: Neden bana soruyorsun? Bir JavaScript çözümü isteyen OP. Eğer böyle değil yani Artı ben zaten "biçimlendirme veya JavaScript kodu birinde" söz yaptım olamazdı işaretlemenizi düzenleme seçeneği olsaydı işaretlemesinde bunu.
BoltClock

12
FF ile birlikte çalışmaz -moz-user-select: none. Olası çözüm: Ekle pointer-events: none.
Cedric Reichenbach

9
Belki soruyu yanlış yorumladım ama OP sürükle bırak özelliğini nasıl koruyacaklarını, ancak sadece hayalet görüntüyü gizleyebileceklerini sormuyor mu? Ayar draggableiçin falsetamamen devre dışı bırakmak sürükle & bırak olacaktır.
James

1
@James: Dürüst olmak gerekirse, sorudan çok açık değil. Çoğunlukla hayalet görüntünün sürükle ve bırak için görsel bir gösterge olduğu varsayımı altında cevap veriyorum (ki) ve hayalet görüntüyü gizlemek isteyen çoğu insan genellikle sürükle ve bırak olup olmadığını umursamıyor tamamen engelli.
BoltClock

87

Bence sen değiştirebilirsin

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

içine

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

3
@victorsosa Doğru, ancak fiili bir standart hala bir standart, W3C veya değil. Yani, her tarayıcı destekliyorsa, gitmek iyidir. AJAX gibi birçok W3C ürününün tescilli olarak başladığını unutmayın.
Beejor

4
Bu çözüm IE11 ve Firefox 57.0'da çalışmaz.
Tudor Ciotlos

34

Dene:

img {
  pointer-events: none;
}

ve kaçınmaya çalış

* {
  pointer-events: none;
}

8
Eleman ile etkileşime girme kabiliyetini ortadan kaldırdığı için bu kötü bir çözümdür. OP yalnızca bir öğenin "sürükleme" işlevini devre dışı bırakmayı ister, öğeyle işaretçi tabanlı etkileşimleri tamamen devre dışı bırakmayı istemez.
Çad

4
@Chad bu doğru ancak görüntünün artık hayalet görüntüsü yokken görüntüyü sarmak ve olay dinleyicisini sarmalayıcıya eklemek mümkündür.
Vincent Hoch-Drei

18

Webkit tarayıcılarındaki görüntüleri devre dışı bırakmak için bir CSS özelliği kullanabilirsiniz.

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

3
Bu aynı zamanda çalışır -ms-user-drag, -moz-user-dragve user-drag. Harika bir CSS çözümü!
Beejor

14

Bu, tıklama ve fareyle üzerine gelme gibi diğer etkinlikleri korurken , tüm tarayıcılarda bir resmin sürüklenmesini devre dışı bırakır . HTML5, JS veya CSS'den herhangi biri kullanılabilir olduğu sürece çalışır.

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

Kullanıcının JS'ye sahip olacağından eminseniz, yalnızca JS özelliğini vb. Kullanmanız gerekir. Daha fazla esneklik için ondragstart, onelectstart ve bazı WebKit dokunma / dokunma CSS'lerine bakın.


Bunun yerine (this.onclick || this.click) () yapmak isteyebilirsiniz .. onclick bu mantığa göre tanımlanamazsa?
Van Nguyen

@Kaizoku Teşekkürler, bunu düşünmemiştim! Cevabınızı temel alarak cevabım güncellendi.
Beejor

Bu FireFox'ta işe yaramıyor gibi görünüyor, çünkü açıkçası <img> onclick veya click etkinliklerine bile sahip değil. Her neyse, onmouseup bölümünü kullandım ve ebeveyn DIV'nin onclick'i işlemesine izin verdim ve işe yarıyor.
Nelson

@Nelson Bana haber verdiğiniz için teşekkürler. Onmouseup zaten herhangi bir onmousedown / up işleyiciden dönüş değeri ne olursa olsun yangınlar beri onmouseup gerekli değildi gibi görünüyor. Basitlik için cevabımı gözden geçirmeye karar verdim. Yeni tek astar iyi çalışmalıdır; sadece FF, Safari, Chrome, IE8 / 10'da test edildi.
Beejor

Firefox 62 kullanıyorum ve onmousedown="return false"yeterlidir. Ayrıca, kullanıcının sürüklerken görüntüyü seçmesini önlemek gerekir, bu da seçimi sürüklemesine izin verir.
loxaxs

8

dragstartEtkinliği halledin ve return false.


4

Sürükleme olaylarını gerçekten kullanmanız gerekiyorsa ve draggable = false ayarlayamıyorsanız alternatif bir hayalet resmi atayabilirsiniz. Yani sadece boş bir png atayın:

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

2
setDragImageIE10 / 11 gibi sürükleyip bırakmayı destekleseler bile tüm tarayıcılar desteklenmez .
James

Bu numarayı gerçekten boş bir png kullanmadan kullanmak mümkün mü?
Fabien Quatravaux

1
Satır içi tanımlı bir base64 kodlu görüntü kullanabilirsiniz ... ör.dragIcon.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
Murray Smith


2

Firefox için bununla biraz daha derine inmelisiniz:

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

Zevk almak.


1

IE için sürükleme önlemek için görüntüler ve çapa draggable = "false" özniteliği eklemeniz gerektiğini buldum. CSS seçenekleri diğer tüm tarayıcılarda çalışır. Bunu jQuery'de yaptım:

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

1

Burada boş olay dinleyicileri eklemekten çok daha kolay bir çözüm var. Sadece pointer-events: nonegörüntünüze ayarlayın . Yine de tıklanabilir olması gerekiyorsa, çevresine etkinliği tetikleyen bir kap ekleyin.


1
<img src="myimage.jpg" ondragstart="return false;" />

0

Firefox'ta test edildi: görüntüyü kaldırmak ve geri koymak çalışıyor! Ve idamda da şeffaf. Örneğin,

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

EDIT : Bu sadece IE ve Firefox, garip çalışır. draggable = falseHer görüntüye de ekledim . Hala Chrome ve Safari ile bir hayalet.

DÜZENLEME 2 : Arka plan görüntüsü çözümü gerçekten en iyisidir. Tek incelik, background-sizearka plan resmi her değiştiğinde özelliğin yeniden tanımlanması gerektiğidir! Ya da öyle, benim tarafımdan böyle görünüyordu. Daha da imgiyisi, IE'nin görüntüleri yeniden boyutlandıramadığı IE altında normal etiketlerle ilgili bir sorunum vardı . Şimdi görüntüler doğru boyutlara sahip. Basit:

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

Ayrıca, belki de bunları düşünün:

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

0

Bir öğe sürüklendiğinde gösterilen görüntüyü ayarlayabilirsiniz. Chrome ile test edildi.

setDragImage

kullanım

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

Alternatif olarak, cevaplarda daha önce de belirtildiği gibi draggable="false", öğeyi hiç sürükleyemiyorsanız sorun olmazsa HTML öğesini ayarlayabilirsiniz .


0

Tüm tarayıcı önekleriyle seçim yapmadan veya sürüklemeden be all-end-all:

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

Ayrıca draggableözniteliği de ayarlayabilirsiniz false. Bunu satır içi HTML:, draggable="false"Javascript: elm.draggable = falseveya jQuery: ile yapabilirsiniz elm.attr('draggable', false).

Ayrıca işleyebilir onmousedownfonksiyonu return false. Bunu satır içi HTML:, onmousedown="return false"Javascript: elm.onmousedown=()=>return false;veya jQuery ile yapabilirsiniz:elm.mousedown(()=>return false)


-1

Bu iş benim için, bazı lightbox komut dosyaları kullanıyorum

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.