JS kullanmadan bir görüntünün sürüklenebilir veya seçilebilir olmasını önleme


132

Firefox'ta bir resmi Javascript'e başvurmadan sürüklenemeyen ve aynı zamanda seçilemez hale getirmenin bir yolunu bilen var mı? Önemsiz görünüyor, ancak sorun şu:

1) Firefox'ta sürüklenebilir ve vurgulanabilir:

<img src="...">

2) Bu yüzden bunu ekliyoruz, ancak resim sürüklerken hala vurgulanabilir:

<img src="..." draggable="false">

3) Bu yüzden vurgulama sorununu düzeltmek için bunu ekliyoruz, ancak daha sonra sezgiye aykırı olarak, görüntü tekrar sürüklenebilir hale geliyor. Garip, biliyorum! FF 16.0.1'i kullanma

<img src="..." draggable="false" style="-moz-user-select: none;">

Öyleyse, "-moz-user-select: none" eklemenin neden bir şekilde "draggable = false" seçeneğini gölgeleyip devre dışı bırakacağını bilen var mı? Tabii ki, webkit beklendiği gibi çalışıyor. Interwebs'de bununla ilgili hiçbir şey yok ... Bu konuya birlikte biraz ışık tutsak harika olur.

Teşekkürler!!

Düzenleme: Bu, kullanıcı arabirimi öğelerinin yanlışlıkla sürüklenmesini önlemek ve kullanılabilirliği artırmakla ilgilidir - bir kopya koruma şemasında bazı kötü girişimler değil :-)


1
Umarım bunun insanların resminizi diske kaydetmesini engelleyeceğini düşünmüyorsunuz. Tarayıcıların nasıl çalıştığını az da olsa anlayan herkes bunu kolayca aşabilir.
Jim Garrison

@JimGarrison elbette değil, üzgünüm daha spesifik olmalıydım, bazı UI öğelerimin taşınmasını engellemeye çalışıyorum, doğru bağlamda kullanılabilirliğe zarar veriyor.
tmkly3

Bunun yerine, çok küçük modern kaydırma çubuklarına yakın olduklarında masaüstünde sürüklenecek arka plan öğeleriniz varsa (veya üzerinde çalışırken tarayıcı penceresinin arkasında arka planda açık bir dosyaya href kod satırları olarak daha kötüsü!) Varsa çok kullanışlıdır. parşömenleri her test ettiğinizde çubuğa tam olarak vurmayın.
Garavani

1
Bu Firefox'ta çok uzun zamandır bilinen bir sorundu ( yineleniyor mu? )
Coderer

Yanıtlar:


210

Aşağıdaki CSS özelliklerini görüntüye ayarlayın:

user-drag: none; 
user-select: none;
-moz-user-select: none;
-webkit-user-drag: none;
-webkit-user-select: none;
-ms-user-select: none;

3
Teşekkürler, bunları yerinde de buldum, ancak sorun Firefox'ta bir hata gibi görünmeye başladı. Sanırım bunu şimdilik çözmenin tek yolu Javascript üzerinden.
tmkly3

Tüm tarayıcılarda çalıştı.
Milad Abooali

Pekala, nasıl etkisiz hale getirebilirim ama yine de drag olayını ateşleyebilirim?
Ty_

6
Hala Firefox 47'yi sürükleyebileceğimi ama Masadow'un ondragstart = "return false;" görüntü etiketinin özelliği bunu düzeltti.
andrew pate

3
Hala
kromda

54

Çözümümü paylaşmayı unutuyordum, JS kullanmadan bunu yapmanın bir yolunu bulamadım. @Jeffery A Wooden'in önerdiği CSS'nin kapatılmayacağı bazı köşe vakaları var.

Bu, tüm UI kapsayıcılarıma uyguladığım şeydir, tüm alt öğelerde yeniden kullanıldığından her öğeye başvurmaya gerek yoktur.

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

Bu, olması gerekenden çok daha karmaşıktı.


1
$ (el) .on ('dragstart', function (e) {e.preventDefault ();});
Pete B

3
<img src="..." draggable="false" style="-moz-user-select: none;" ondragstart="return false;">OP'nin koduyla eşleşecek şekilde de yazılabilir .
Masadow

39

pointer-eventsÖzelliği CSS'nizde kullanabilir ve "yok" olarak ayarlayabilirsiniz.

img {
    pointer-events: none;
}

Düzenlenen

bu olay (tıklama) engelleyecektir. Daha iyi bir çözüm olurdu

<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
Bunu bu şekilde yapmak, görüntü simgesinin daha çok glifikon gibi davranmasını sağlar, bu yüzden bu yöntemi en çok seviyorum.
Funkodebat

9
Bu aynı zamanda (onclick) gibi olayları kullanılamaz hale getirir. Bu yaklaşımı kullanırsanız dikkatli olun.
Nicolas Bouvrette

Kabul edilen cevap en son yazılım sürümlerinde değilken bu cevap hala geçerlidir. Bu yeni kabul edilen cevap olmalıdır. @ tmkly3
progyammer

resim için tıklama olayımız varsa bu sorun yaratacaktır. Tıklama etkinliğini engelleyecek
Pratap AK

12

Duruma bağlı olarak, görüntüyü divCSS ile bir arka plan görüntüsü yapmak genellikle yararlıdır .

<div id='my-image'></div>

Sonra CSS'de:

#my-image {
    background-image: url('/img/foo.png');
    width: ???px;
    height: ???px;
}

Bir düğme ve farklı bir boyutlandırma seçeneğiyle canlı bir örnek için bu JSFiddle'a bakın .


9

Muhtemelen başvurabilirsin

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

Bu kabul edilen cevap olmalı, kullanıcı sürükleme firefox tarafından desteklenmiyor. Bunun için teşekkür ederim!
Merritt6616

Benim için de çözüm "işaretçi olayları" idi çünkü tarayıcılar arası çalıştı ("kullanıcı sürükleme" nin Firefox üzerinde hiçbir etkisi olmayacak, en azından 11.2018)
David Dal Busco

2

Özellikle Windows Edge tarayıcısı için genel bir çözüm (-ms-user-select olarak: yok; CSS kuralı çalışmıyor):

window.ondragstart = function() {return false}

Not: Bu , tıklama olayına hala ihtiyacınız olduğunda (yani kullanamadığınızda ), ancak sürükleme simgesi görüntüsünün görünmesini istemediğinizde sizi draggable="false"her imgetikete eklemek zorunda kalmadan kurtarabilir pointer-events: none.


Benim için gerçekten işe yarayan tek cevap! Neden daha yüksek oylanmadığını bilmiyorum.
AldaronLau

1

Görüntüyü arka plan görüntüsü olarak ayarlayabilirsiniz. Bir içinde yer aldığından divve divparçalanamaz olduğundan, görüntü parçalanamaz olacaktır:

<div style="background-image: url("image.jpg");">
</div>

1

Görüntüyle aynı boyutta ve görüntünün üstüne yerleştirilmiş bir div öğesi oluşturdum . Daha sonra, fare olayları görüntü öğesine gitmez.

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.