DIV'yi seçilemez yapmanın bir yolu var mı?


140

İşte size ilginç bir CSS sorusu!

Ben şeffaf bir arka plan ile bir tür filigran olarak kullanmak istiyorum bazı METİN overlaying bir textarea var. Metin büyük ve metin alanının çoğunu kaplıyor. Güzel görünüyor, sorun, kullanıcı metin alanına tıkladığında bazen filigran metnini seçiyor. Filigran metninin asla seçilemez olmasını istiyorum. Bir şey z-endeksi daha düşük olsaydı seçilebilir olmazdı ama tarayıcılar öğeleri seçerken z-endeksi katmanları umurumda görünmüyordu bekliyordum. Bu DIV asla seçilemez hale getirmek için bir hile veya yol var mı?


Bir javascript çözümünden memnun olur musunuz?
joshcomley

Yanıtlar:


203

Bir süre geri devre dışı seçime basit jQuery uzantısı yazdı: Devre Dışı Bırakma Seçimi içinde jQuery . Aracılığıyla çağırabilirsiniz$('.button').disableSelection();

Alternatif olarak, CSS (çapraz tarayıcı) kullanarak:

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

@kasperTaeymans bunu işaret ettiğiniz için teşekkürler. snippet'i güncelledi.
aleemb

@kasperTaeymans Ama bir W3C çalışma taslağında ... Her ihtimale karşı eklerdim .
Camilo Martin

2
Kaldırdığım orijinal cevaptan bir şey almamalıyım, ama 3+ yaşında. Bu yüzden aşağıya bir dokunmatik arayüz ayarı ekleyerek bir yanıt ekledim ( stackoverflow.com/questions/924916/… ).
Anne Gunn

Hareketli bootstrap modal başlığı için istediğim buydu! Teşekkürler!
Geliştirici

62

Aşağıdaki CSS kodu neredeyse modern tarayıcıda çalışır:

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

IE için html etiketine JS kullanmalı veya öznitelik eklemelisiniz.

<div id="foo" unselectable="on" class="unselectable">...</div>

Amacı nedir unselectable="on". Bir referans verebilir misiniz
kullanıcı

4
Burada buldum: msdn.microsoft.com/en-us/library/hh801966(v=vs.85).aspx Ama aslında IE üzerinde test ettim ve düzgün çalışıyor.
KimKha

1
Emin değilim. Ancak IE'de <code> unselectable = "on" </code> bulunabilir ve W3C doğrulayıcı bu özelliği kabul etmez.
KimKha

Modern tarayıcılarda çalışırken, henüz W3C tarafından belirtilmemiştir.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

41

Sadece aleemb'ın orijinal, çok beğenilen cevabını css'e birkaç ekleme ile güncelliyor.

Aşağıdaki komboyu kullanıyoruz:

.unselectable {
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    -o-user-select: none;
    user-select: none;
}

Webkit-touch girişini eklemek için öneri aldık:
http://phonegap-tips.com/articles/essential-phonegap-css-webkit-touch-callout.html

2015 Nis: Sadece kendi cevabımı işe yarayabilecek bir varyasyonla güncelliyorum. DIV'yi seçilebilir / seçilemez hale getirmeniz gerekiyorsa ve Modernizr'ı kullanmaya istekli iseniz , aşağıdakiler düzgün bir şekilde javascript'te çalışır:

    var userSelectProp = Modernizr.prefixed('userSelect');
    var specialDiv = document.querySelector('#specialDiv');
    specialDiv.style[userSelectProp] = 'none';

uygulayarak user-select: nonebir karşı divhiçbir etkisi olursa olsun vardır. Eminim user-selectsadece metin içindir. divseçilemez hale getirmenin başka yolları var mı?
oldboy

22

Johannes'in daha önce de belirttiği gibi, bir arka plan görüntüsü muhtemelen CSS'de bunu başarmanın en iyi yoludur.

Bir JavaScript çözümünün, tüm popüler tarayıcılarda etkili olması için "dragstart" ı da etkilemesi gerekir.

JavaScript:

<div onselectstart="return false;" ondragstart="return false;">your text</div>

jQuery:

var _preventDefault = function(evt) { evt.preventDefault(); };
$("div").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault);

Zengin


13

pointer-events: none;CSS'nizde kullanabilirsiniz

div {
  pointer-events: none;
}

6

bunu deneyebilirsiniz:

<div onselectstart="return false">your text</div>

1
Çift tıklama ile seçim yapmak hala mümkündür.
ceving

6

Metin alanı için basit bir arka plan görüntüsü yeterli olmaz mı?


1
Filigranı kastediyorum, ama şeffaf bir arka plan görüntüsü de işe yarayabilir. Ayrıca, bazı tarayıcılar bu durumda uçsuz bucakça yavaşladığı için çok küçük resimleri döşememelisiniz :)
Joey

Özellikle 1000x1000 şeffaf png (veya gif) sadece 4kb olduğundan.
Ryan Florence

1 KiB, aslına bakarsak :-)
Joey

4

WebKit tarayıcılarında (yani Google Chrome ve Safari) Mozilla'nın -moz-user-select uygulamasına benzer bir CSS çözümü vardır: yok

.no-select{    
    -webkit-user-select: none;
    cursor:not-allowed; /*makes it even more obvious*/
}

2

Ayrıca IOS'ta, üzerinde görünen gri yarı saydam bindirmelerden kurtulmak istiyorsanız, css ekleyin:

-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-touch-callout: none;

-1

kullanım

onselectstart = "yanlış döndür"

içeriğinizin kopyalanmasını önler.


4
Bu çözüm başkaları tarafından yayınlanmıştır.
dazedconfused

-1

Z-endeksinin seçim için çalışması için konumu açıkça mutlak veya göreli olarak ayarladığınızdan emin olun. Benzer bir sorunum vardı ve bu benim için çözdü.


-2

Kullanım durumunuzdan emin değilsiniz, ancak sürüklenebilir hale getirebilirsiniz.


Hoş olmayan ama geçerli bir cevap.
Paslı
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.