Metin seçimi vurgulamasını devre dışı bırakma


5202

Düğmeler gibi davranan çapalar için (örneğin, Yığın Taşması sayfasının üst kısmındaki Sorular , Etiketler , Kullanıcılar vb.) Veya sekmeler noktaları için, kullanıcı yanlışlıkla metni seçerse vurgulama efektini devre dışı bırakmanın standart bir CSS yolu var mı?

Bunun JavaScript ile yapılabileceğini ve biraz googling'in yalnızca Mozilla -moz-user-selectseçeneğini sunduğunu fark ettim .

Bunu CSS ile başarmanın standartlara uygun bir yolu var mı, yoksa "en iyi uygulama" yaklaşımı nedir?


7
cadı içindeki öğelerde vurgulama devre dışı bırakılmış olabilir, stil veya sınıf özniteliğinde css'de vurgulama etkinleştirilmiş olabilir mi? veya başka bir deyişle, -webkit-user-select ect için başka değerler var mı? hiç yoktan başka?

7
İlgili: stackoverflow.com/questions/16600479/… = yalnızca bazı alt öğelerin seçilmesine izin verme
JK.

9
Bazı tarayıcılarda "Tümünü Seç" (CTRL + A ve CMD + A) yapmanın hala bazı şeyler seçtiği bir hata var. Bu şeffaf bir seçim rengiyle mücadele edilebilir:::selection { background: transparent; } ::-moz-selection { background: transparent; }
DaAwesomeP

12
Sadece söyleyebilir miyim: lütfen bunu yapma. Deneyimlerime göre, daha çok , başka bir yere kopyalayıp yapıştırmak için, düğme olarak da hizmet eden bir metni seçmek istemiyorum . Bazı web geliştiricileri bilerek bu özelliği benim için devre dışı bırakmak için kendi yolumdan gittim çünkü bunu yapmamak hayal edilemeyecek kadar sinir bozucu olacaktır. Çok, çok iyi bir nedeniniz yoksa lütfen bunu yapmayın .
kajacx

3
2017 yılında, bu kullanmak iyi bir yoldur postcssve autoprefixerdaha sonra ve set tarayıcı sürümü postcssher şey serin olun.
AmerllicA

Yanıtlar:


7322

GÜNCELLEŞTİRME Ocak, 2017:

Göre Can I kullanım , user-selectşu anda Internet Explorer 9 ve önceki sürümlerinde (ama ne yazık ki hariç tüm tarayıcılarda desteklenir hala bir satıcı öneki gerekir).


Doğru CSS varyasyonlarının tümü:

.noselect {
  -webkit-touch-callout: none; /* iOS Safari */
    -webkit-user-select: none; /* Safari */
     -khtml-user-select: none; /* Konqueror HTML */
       -moz-user-select: none; /* Old versions of Firefox */
        -ms-user-select: none; /* Internet Explorer/Edge */
            user-select: none; /* Non-prefixed version, currently
                                  supported by Chrome, Edge, Opera and Firefox */
}
<p>
  Selectable text.
</p>
<p class="noselect">
  Unselectable text.
</p>


Not user-select(şu anda bir de standardizasyon sürecinde olduğunu W3C çalışma taslağı ). Her yerde çalışacağı garanti edilmez ve tarayıcılar arasında uygulamada farklılıklar olabilir ve gelecekte tarayıcılar bunun için destek bırakabilir.


Daha fazla bilgi Mozilla Developer Network belgelerinde bulunabilir .


38
nice code molokoloco: D, kişisel olarak kullanmaktan çok uzak durmamıza rağmen, bazen farklı tarayıcılar için farklı değerlere ihtiyacınız olabilir ve JavaScript'e bağlı. Bir sınıf oluşturmak ve onu öğenize eklemek veya stil sayfanızdaki öğenin türüne css uygulamak oldukça kurşun geçirmezdir.
Blowsie

58
'user-select'- Değerler: yok | metin | değiştirme | eleman | elemanları | hepsi | miras - w3.org/TR/2000/WD-css3-userint-20000216
Blowsie

34
Aslında -o-user-select Opera'da uygulanmaz. Bunun yerine IE'nin seçilemez özelliğini uygular.
Tim Down

30
Nedense, bu yalnız IE8 çalışma değildi, daha sonra <div onselectstart="return false;">benim ana div ekledi .
12'de robasta

308
bu gülünç! aynı şeyi yapmanın birçok farklı yolu. Kullanıcı seçimleri için yeni bir standart oluşturalım. biz onu arayacağız standard-user-select. o zaman bu sorunlarımız olmaz. geriye dönük uyumluluk için diğerlerini de dahil etmeliyiz. şimdi kod olur -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; standard-user-select: none;. ah, çok daha iyi.
Claudiu

854

Çoğu tarayıcıda, bu user-select, başlangıçta CSS 3'te önerilen ve sonra terk edilen ve şimdi CSS UI Seviye 4'te önerilen CSS mülkündeki özel varyasyonlar kullanılarak elde edilebilir :

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

   /*
     Introduced in Internet Explorer 10.
     See http://ie.microsoft.com/testdrive/HTML5/msUserSelect/
   */
   -ms-user-select: none;
   user-select: none;
}

Internet Explorer <10 ve Opera <15 için, unselectableseçilemez olmasını istediğiniz öğenin niteliğini kullanmanız gerekir . HTML'deki bir özelliği kullanarak bunu ayarlayabilirsiniz:

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

Ne yazık ki bu özellik devralınmıyor, yani içindeki her öğenin başlangıç ​​etiketine bir özellik koymanız gerekiyor <div>. Bu bir sorunsa, bunu bir öğenin torunları için yinelemeli olarak yapmak için JavaScript'i kullanabilirsiniz:

function makeUnselectable(node) {
    if (node.nodeType == 1) {
        node.setAttribute("unselectable", "on");
    }
    var child = node.firstChild;
    while (child) {
        makeUnselectable(child);
        child = child.nextSibling;
    }
}

makeUnselectable(document.getElementById("foo"));

30 Nisan 2014 Güncelleştirmesi : Ağaca her yeni öğe eklendiğinde bu ağaç geçişinin yeniden çalıştırılması gerekir, ancak @Han tarafından yapılan bir yorumdan , hedefin hedefine mousedownayarlanan bir olay işleyicisi ekleyerek bundan kaçınmanın mümkün unselectableolduğu görülmektedir. Etkinlik. Ayrıntılar için http://jsbin.com/yagekiji/1 adresine bakın.


Bu hala tüm olasılıkları kapsamıyor. Seçilemeyen öğelerde seçimleri başlatmak imkansız olsa da, bazı tarayıcılarda (örneğin Internet Explorer ve Firefox,) tüm belgeyi seçilemez hale getirmeden seçilemez öğeden önce başlayan ve biten seçimleri engellemek hala imkansızdır.


30
* seçiciyi örneğinizden kaldırmalısınız, gerçekten verimli ve örneğinizde kullanmaya gerek yok mu?
Blowsie

66
@Blowsie: Ben öyle düşünmüyorum: CSS 2 spesifikasyonu , tam olarak eşdeğer olduğunu *.foove .foo(ikinci durumda, evrensel seçicinin ( *) ima edildiğini) belirtiyor, bu yüzden tarayıcı tuhaflıklarını kısıtlıyor, *iradenin zarar vereceğini de göremiyorum verim. Başlangıçta *okunabilirlik için yapmaya başladığımı eklemek benim uzun süredir devam eden bir alışkanlığım : açıkça bir bakışta yazarın tüm unsurları eşleştirmeyi planladığını belirtiyor.
Tim Down

38
oooh biraz daha okuduktan sonra, anahtar olarak (en sağdaki seçici) yani. seçilemez * olarak kullanıldığında * sadece verimli değildir. Daha fazla bilgi için burada code.google.com/speed/page-speed/docs/…
Blowsie

20
Class = "unselectable" sınıfını kullanmak yerine, [unselectable = "on"] {…} nitelik seçicisini kullanmanız
yeterlidir

13
@Francisc: Hayır. Yorumlarda daha önce Blowsie'ye söylediğim gibi, hiçbir fark yaratmıyor.
Tim Down

196

Internet Explorer için bir JavaScript çözümü:

onselectstart="return false;"

55
Unutma ondragstart!
Mathias Bynens

9
burada bir şey daha var. Bunu gövdeye eklerseniz, IE'de textareas veya giriş alanlarının içindeki metni seçemezsiniz. IE için sabitleme yolu. body.onselectstart = function(e) { if (e.target.nodeName != "INPUT" && e.target.nodeName != "TEXTAREA") { e.preventDefault(); return false; } return true; }
TheBrain

2
Bu kullanarak bir öznitelik jQuery olarak eklenebilir -. $ ( "P") attr ( "onselectstart", "geri dönüş false") Bu IE8 benim için tek güvenilir yöntemdir oldu
Matt

13
@Abudayah Internet Explorer'ın eski sürümlerinde çalışmadığı için mi? Bu, cevabın bütün mesele bu.
Pekka

?? inputkullansam bile hala elemanlardaki metni seçebilirim user-select: none. bunu önlemek için nasıl bilmek gerekir
oldboy

191

CSS 3'ün kullanıcı seçme özelliği kullanılabilir hale gelinceye kadar , Gecko tabanlı tarayıcılar -moz-user-selectzaten bulduğunuz özelliği destekler . WebKit ve Blink tabanlı tarayıcılar-webkit-user-select özelliği .

Bu elbette Gecko oluşturma motorunu kullanmayan tarayıcılarda desteklenmez.

Bunu yapmak için "standartlar" ile uyumlu hızlı ve kolay bir yol yoktur; JavaScript kullanmak bir seçenektir.

Asıl soru, kullanıcıların neden belirli öğeleri vurgulamasını ve muhtemelen kopyalayıp yapıştıramamasını istediğinizdir? Kullanıcıların web sitemin belirli bir bölümünü vurgulamasına izin vermek istemediğim tek bir kez karşılaşmadım. Birkaç arkadaşım, kodları okumak ve yazmak için saatler harcadıktan sonra, vurgulama özelliğini sayfanın neresinde olduklarını hatırlamanın bir yolu olarak veya gözlerinin bir sonraki nereye bakacaklarını bilmesi için bir işaretleyici olarak kullanacak.

Bunun yararlı olduğunu görebildiğim tek yer, bir kullanıcı web sitesini kopyalayıp yapıştırdıysa kopyalanması ve yapıştırılmaması gereken formlar için düğmeleriniz varsa.


20
Düğmeler tam olarak benim motivasyonum olurdu.
Kriem

27
Bunun gerekli olmasının bir başka nedeni, bir ızgara veya tablodaki birden çok satırı seçmek için Shift tuşunu basılı tutarak tıklamaktır. Metni vurgulamak istemezsiniz, satırları seçmesini istersiniz.
Gordon Tucker

7
Başka birinin içeriğinin yasal olarak yeniden yayınlandığı yasal sorunlar da vardır, ancak lisanstaki bir madde web yayıncılarının metnin kolayca kopyalanıp yapıştırılmasını önlemesini gerektirir. Beni bu soruyu bulmaya iten şey buydu. Şartları kabul etmiyorum ancak sözleşme yaptığım şirket yasal olarak bu şekilde uygulamakla yükümlüdür.
Craig M

5
@CraigM css stili, bir kişinin HTML kaynağını almasını ve kopyalamasını engellemez. İçeriğinizi korumak istiyorsanız daha iyi yollar bulmanız gerekir.
Agile Jedi

27
Sürükle ve bırak bir sürü yüksek etkileşimli web uygulaması ... yanlışlıkla vurgulama büyük bir kullanılabilirlik sorunudur.
Marc Hughes

138

<p>Öğeler hariç her şeyde metin seçimini devre dışı bırakmak istiyorsanız, bunu CSS'de yapabilirsiniz ( -moz-nonediğer tarayıcılarda izin verilen alt öğelerde geçersiz kılmaya izin veren öğelere dikkat edin none):

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

p {
    -webkit-user-select: text;
    -khtml-user-select: text;
    -moz-user-select: text;
    -o-user-select: text;
    user-select: text;
}

12
Giriş alanlarını da seçilebilir yaptığınızdan emin olun:p, input { -webkit-user-select: text; -khtml-user-select: text; -moz-user-select: text; -o-user-select: text; user-select: text; }
joshuadelange

11
Bir öğe hariç TÜM koddaki tarayıcı kullanıcı arayüzü beklentilerini kapatma konusunda çok dikkatli olun. Örneğin, <li /> metni liste öğeleri ne olacak?
Jason T Featheringham

Sadece bir güncelleme ... Firefox 21'den beri MDN'ye göre -moz-noneve noneaynı.
Kevin Fegan

2
Bunun için imleç ekleyebilirsiniz: varsayılan ve imleç: sırasıyla metin
:)

Bombası. Demek ki. SON. ul>* { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: -moz-none; -o-user-select: none; user-select: none; }[sırasız bir listedeki her şeyi seçer ve tüm görünüm ağacını çöpe atmak yerine seçilemez hale getirir.] Ders için teşekkürler. Düğme listem harika görünüyor ve bir IME'yi (android pano widget'ları) başlatmak yerine ekrana dokunmaya ve basmaya doğru yanıt veriyor.
Hypersoft Systems

125

Önceki yanıtlardaki çözümlerde seçim durdurulur, ancak kullanıcı yine de imleç hala değiştiği için metin seçebileceğinizi düşünür. Statik tutmak için CSS imlecinizi ayarlamanız gerekir:

.noselect {
    cursor: default;
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}
<p>
  Selectable text.
</p>
<p class="noselect">
  Unselectable text.
</p>

Bu, metninizi bir masaüstü uygulamasında olduğu gibi tamamen düz hale getirecektir.


Ne aksine "Düz"?
kojow7

@ kojow7 "Katmanlı" aksine. Diğer öğelerin üstünde yüzen metin yerine. SVG ve PNG görüntüleri arasındaki farka benzer.
Yeti

4
Firefox'un 2019'da hala satıcı önekini gerektirdiğini keşfettiğinde şaşırdım. user-select: none;Standardın şimdiye kadar benimseneceğini düşünerek sadece göz ardı ettim , ama ne yazık ki olmadı. Standartlar komitesindeki kişilerin hala tartışmalara girebileceğini merak ediyor. "Hayır, sizler ... Gerçekten olması gerektiğini düşünüyorum user-select: cant;çünkü daha açıklayıcı gibi, biliyor musunuz?" "Biz bunun üstesinden geldik, Mike. Kesme işaretini atlamamız gerekecek ve bu kötü bir form!" "Yeter, herkes! Önümüzdeki ay tekrar bu konuda görüşeceğiz. Standartlar Komitesi toplantısı ertelendi!"
Zihinsel

109

Bunu Firefox ve Safari'de yapabilirsiniz (ayrıca Chrome?)

::selection { background: transparent; }
::-moz-selection { background: transparent; }

121
Bunu yapmanızı tavsiye etmem, çünkü aslında sorunu çözmez; metin seçimini devre dışı bırakmak - yalnızca gizler. Bu kötü kullanılabilirliğe neden olabilir, çünkü imlecimi sayfanın etrafında sürüklersem, bilmeden herhangi bir keyfi metin seçebilirdim. Bu her türlü garip kullanılabilirlik "hata" neden olabilir.
Keithamus

1
Saydam alanlı PNG görüntülerinde çalışmaz: Her zaman açık mavi renkte seçilecektir… Herhangi bir çözüm var mı?
AvL

80

WebKit için geçici çözüm :

/* Disable tap highlighting */
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);

Bir CardFlip örneğinde buldum.


1
transparentRgba yerine kullanmak Android'de Chrome 42'de de çalışır.
Clint Pachl

77

Hibrit CSS + jQuery çözümünü seviyorum.

İçindeki tüm öğeleri <div class="draggable"></div>seçilemez hale getirmek için bu CSS'yi kullanın:

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

.draggable input {
    -webkit-user-select: text;
     -khtml-user-select: text;
       -moz-user-select: text;
         -o-user-select: text;
            user-select: text;
 }

Ve sonra, jQuery kullanıyorsanız, bunu bir $(document).ready()bloğun içine ekleyin :

if (($.browser.msie && $.browser.version < 10) || $.browser.opera) $('.draggable').find(':not(input)').attr('unselectable', 'on');

Hala giriş elemanlarının etkileşimli olmasını istediğinizi düşünüyorum, bu yüzden :not()sözde seçici. Kullanabilirsin'*'Umurumda değilse .

Dikkat: Internet Explorer 9 bu ek jQuery parçasına ihtiyaç duymayabilir, bu nedenle buraya sürüm kontrolü eklemek isteyebilirsiniz.


5
-Ms-user-select komutunu kullanın: yok; (IE10 için) ve jQuery "eğer" bu olmalıdır: if (($ .browser.msie && $ .browser.version <10) || $ .browser.opera)
mhenry1384

Dikkatli ol adamım !!! Firefox'ta seçilebilir yapmak için kullanmalısınız-moz-user-select: Normal;
Nicolas Thery

7
@ mhenry1384 jQuery.browser1.3 sürümünden itibaren kullanımdan kaldırılmıştır ve 1.9 sürümünde kaldırılmıştır - api.jquery.com/jQuery.browser
WynandB

@Wynand İyi bir nokta. Ancak hangi CSS özelliğinin kullanılacağını belirlemek için ne tür bir "özellik algılama" vardır?
Tom Auger

@TomAuger jQuery.support kullanabilirsiniz, tek tek özellikleri kontrol etmenizi sağlar: Bağlantı
Aequanox

69

.hidden:after {
    content: attr(data-txt);
}
<p class="hidden" data-txt="Some text you don't want to be selected"></p>

Yine de bu en iyi yol değil.


3
Nitelik olarak da kullanabilirsiniz title.
Diş fırçası

6
Bu çok yaratıcı bir çözüm. Özellikle title özniteliğini kullandığı için ekran okuyucuları için muhtemelen daha iyi olur.
pseudosavant

4
Ben denedim ( JSBin ) ve IE'de çalışmıyor. Ne yazık ki, eski IE'ler user-selectişe yaramayanlar.
pseudosavant

1
Bu, Chrome'da çalışan mükemmel bir JS olmayan alternatiftir! Müthiş!
saricden

muhteşem! ......
Yalnız

69

CSS veya JavaScript kullanabilirsiniz .

JavaScript yolu desteklenir eski gibi tarayıcılar eski hem de Internet Explorer sürümlerine ama senin durumda değilse, o zaman CSS şekilde kullanabilirsiniz:

HTML / JavaScript:

<html onselectstart='return false;'>
  <body>
    <h1>This is the Heading!</h1>
    <p>And I'm the text, I won't be selected if you select me.</p>
  </body>
</html>

HTML / CSS:

.not-selectable {
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}
<body class="not-selectable">
  <h1>This is the Heading!</h1>
  <p>And I'm the text, I won't be selected if you select me.</p>
</body>


59

Ayrıca Internet Explorer için sözde sınıffocus (.ClassName: focus) ve eklemeniz gerekir outline-style: none.

.ClassName,
.ClassName:focus {
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    outline-style: none; /* Internet Explorer  */
}

3
Seçim classNamesınıflı bir öğe üzerinde başladığı sürece bu IE'de çalışır . Bu JSBin'e bakın .
pseudosavant

57

Bu satırları CSS'ye eklemeyi deneyin ve class özelliğinde "disHighlight" öğesini çağırın:

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

51

Hızlı Hack Güncellemesi

Değeri nonetüm CSS user-selectözellikleri (tarayıcı önekleri dahil) için kullanırsanız, bunun yine de oluşabileceği bir sorun vardır.

.div {
    -webkit-user-select: none; /* Chrome all / Safari all */
    -moz-user-select: none;    /* Firefox all             */
    -ms-user-select: none;     /* Internet Explorer  10+  */
     user-select: none;        /* Likely future           */
}

As CSS-Tricks , diyor sorun geçerli:

WebkitEtrafındaki öğeleri seçerseniz, metnin kopyalanmasına izin verir.

Aşağıdakini enforce, bir öğenin tamamının seçilmesi için de kullanabilirsiniz . Bunun için tek yapmanız gereken değeri olarak nonedeğiştirmek all.

.force-select {
    -webkit-user-select: all;  /* Chrome 49+     */
    -moz-user-select: all;     /* Firefox 43+    */
    -ms-user-select: all;      /* No support yet */
    user-select: all;          /* Likely future  */
}

48

Touch olayıyla Android tarayıcısında aynı şeyi elde etmekte zorluk çekenler için şunları kullanın:

html, body {
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
    -webkit-tap-highlight-color: transparent;
}


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

*.unselectable {
   -moz-user-select: -moz-none;
   -khtml-user-select: none;
   -webkit-user-select: none;
   user-select: none;
}
<div id="foo" unselectable="on" class="unselectable">...</div>
function makeUnselectable(node) {
    if (node.nodeType == 1) {
        node.unselectable = true;
    }
    var child = node.firstChild;
    while (child) {
        makeUnselectable(child);
        child = child.nextSibling;
    }
}

makeUnselectable(document.getElementById("foo"));
-webkit-user-select: none;
-moz-user-select: none;
onselectstart="return false;"
::selection { 
    background: transparent; 
}

::-moz-selection { 
    background: transparent; 
}

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

p {
    -webkit-user-select: text;
    -khtml-user-select: text;
    -moz-user-select: text;
    -o-user-select: text;
    user-select: text;
}
<div class="draggable"></div>
.draggable {
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -o-user-select: none;
    user-select: none;
}

.draggable input {
    -webkit-user-select: text;
    -khtml-user-select: text;
    -moz-user-select: text;
    -o-user-select: text;
    user-select: text;
 }
if ($.browser.msie)
    $('.draggable').find(':not(input)').attr('unselectable', 'on');

46

Çalışma

CSS:

-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-touch-callout: none;
-webkit-user-select: none;

Bu işe yaramalı, ancak eski tarayıcılarda çalışmaz. Tarayıcı uyumluluğu sorunu var.


Önceden düzeltilmemiş CSS özelliği, özelliğin önekli sürümleri listesinin sonunda olmalıdır. İyi bir doğru uygulama, diğeri ise Chrome / Webkit'ten "yeni bir IE" yapma ve webkit tarayıcılarında değil -webkit önek desteğini sunma gibi çok çirkin şeylere yol açan kötü bir uygulamadır. Bakın, bu zaten 2012'de oldu: dev.opera.com/articles/…
FlameStorm

Ve ben alıntı:This is because through our site compatibility work, we have experienced that many authors of (especially mobile) sites only use -webkit- prefixed CSS, thereby ignoring other vendor prefixes and not even including an unprefixed equivalent. This leads to a reduced user experience on Opera and Firefox, which don’t receive the same shiny effects such as transitions, gradients and the like, even if the browser supported those effects.
FlameStorm

42

ile SASS (SCSS sözdizimi)

Bunu bir mixin ile yapabilirsiniz :

// Disable selection
@mixin disable-selection {
    -webkit-touch-callout: none; /* iOS Safari */
    -webkit-user-select: none;   /* Safari */
    -khtml-user-select: none;    /* Konqueror HTML */
    -moz-user-select: none;      /* Firefox */
    -ms-user-select: none;       /* Internet Explorer/Edge */
    user-select: none;           /* Non-prefixed version, currently supported by Chrome and Opera */
}

// No selectable element
.no-selectable {
    @include disable-selection;
}

Bir HTML etiketinde:

<div class="no-selectable">TRY TO HIGHLIGHT</div>

Bu CodePen'de deneyin .

Otomatik düzeltici kullanıyorsanız, diğer önekleri kaldırabilirsiniz.

Tarayıcı uyumluluğu burada .


36

Yalnızca Mozilla özelliğinin yanı sıra, hayır, yalnızca standart CSS ile metin seçimini devre dışı bırakmanın bir yolu yoktur (şu andan itibaren).

Fark ederseniz, Yığın Taşması gezinme düğmeleri için metin seçimini devre dışı bırakmaz ve normal seçim davranışını değiştirdiği ve kullanıcının beklentileriyle çakışmasına neden olduğu için çoğu durumda bunu yapmamayı öneririm.


Kullanıcının beklediği davranışı değiştirdiğini kabul
etsem de

Ancak bu gereksiz uygulama ayrıntılarını göstermiyor mu? Bir giriş veya düğmenin metni seçilemez.

@anon: Çoğu kullanıcı muhtemelen düğmenizin metnini seçmeye çalışmaz, bu yüzden pratikte çok fazla önemli olmamalıdır. Ayrıca, bunu yapmak için düğmenin dışını seçmeye başlamak zorunda kalacaklar - düğmenin kendisini tıklarlarsa, onclick işleyici etkinleştirilir. Ayrıca, bazı tarayıcılar (örneğin, Safari) normal düğmelerin metnini seçmenize izin verir…
hbw

6
Bir sohbet dizisinden bir yorum kümesi seçerseniz ve her yorumun yanında bir yukarı / aşağı düğmesi varsa, metni diğer şeyler olmadan seçmek iyi olur. Kullanıcının beklediği veya istediği budur. Her yorumda düğme etiketlerini kopyalamak / yapıştırmak istemiyor.
Mnebuerquo

2
Örneğin, sizi başka bir sayfaya yönlendirmek yerine bir div açan bir düğmeyi çift tıklarsanız ne olur? çift ​​tıklama nedeniyle düğme metni seçilir!
Gigala

34

Bu, bazı tarayıcılarda çalışır :

::selection{ background-color: transparent;}
::moz-selection{ background-color: transparent;}
::webkit-selection{ background-color: transparent;}

İstediğiniz öğeleri / kimlikleri boşluklar olmadan virgülle ayırarak seçicilerin önüne ekleyin:

h1::selection,h2::selection,h3::selection,p::selection{ background-color: transparent;}
h1::moz-selection,h2::moz-selection,h3::moz-selection,p::moz-selection{ background-color: transparent;}
h1::webkit-selection,h2::webkit-selection,h3::webkit-selection,p::webkit-selection{ background-color: transparent;}

Diğer cevaplar daha iyi; Bu muhtemelen son çare / catchall olarak görülmelidir.


3
Kesin olarak bilinebilecek birkaç şey var, ancak bu çözüm kesinlikle tüm tarayıcılarda çalışmıyor .
Volker E.

33

Diyelim ki böyle iki tane var div:

.second {
  cursor: default;
  user-select: none;
  -webkit-user-select: none;
  /* Chrome/Safari/Opera */
  -moz-user-select: none;
  /* Firefox */
  -ms-user-select: none;
  /* Internet Explorer/Edge */
  -webkit-touch-callout: none;
  /* iOS Safari */
}
<div class="first">
  This is my first div
</div>

<div class="second">
  This is my second div
</div>

Kullanıcıya seçilemez bir his vermek için imleci varsayılan olarak ayarlayın.

Ön ekin tüm tarayıcılarda desteklenmesi için kullanılması gerekir. Önek olmadan bu tüm yanıtlarda çalışmayabilir.



29

Bunu, metin seçimini devre dışı bırakmak istediğiniz ilk div'e ekleyin:

onmousedown='return false;' 
onselectstart='return false;'

28

NOT:

Doğru cevap, metni seçmenizi engellediği için doğrudur. Ancak, sonraki birkaç ekran görüntüsünde (7 Kasım 2014'ten itibaren) göstereceğim gibi, metni kopyalayabilmenizi engellemez.

Bir şey seçmeden önce

Biz seçtikten sonra

Numaralar kopyalandı

Gördüğünüz gibi sayıları seçemedik, ancak kopyalayabildik.

Test tarihi: Ubuntu , Google Chrome 38.0.2125.111.


1
Aynı problemi yaşadım. Mac Chrome 48.0.2564.116 ve Mac Safari 9.0.3 üzerinde. Özellikle, Mac Firefox 43.0 karakteri kopyalamaz, ancak aralarına fazladan bitiş çizgileri yapıştırır. Bu konuda ne yapılmalı?
NHDaly

26

İhtiyacım olan sonucu elde etmek için her ikisini de kullanmak zorunda olduğumu ::selectionveuser-select

input.no-select:focus {
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}

input.no-select::selection {
    background: transparent;
}

input.no-select::-moz-selection {
    background: transparent;
}

finalyyyyyyy bir cevap
oldboy

23

Kolayca yapılır:

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

Alternatif:

Diyelim ki bir <h1 id="example">Hello, World!</h1>. Bunun HTHT'sini kaldırmanız gerekecek h1, bu durumda Merhaba, Dünya . O zaman CSS'ye gidip bunu yapmanız gerekecek:

#example::before // You can of course use **::after** as well.
{
    content: 'Hello, World!'; // Both single-quotes and double-quotes can be used here.

    display: block; // To make sure it works fine in every browser.
}

Şimdi bunun metin değil, bir blok öğesi olduğunu düşünüyor.



21

JavaScript olmadan çözümümü kontrol et:

jsFiddle

li:hover {
    background-color: silver;
}
#id1:before {
    content: "File";
}
#id2:before {
    content: "Edit";
}
#id3:before {
    content: "View";
}
<ul>
    <li><a id="id1" href="www.w1.com"></a>
    <li><a id="id2" href="www.w2.com"></a>
    <li><a id="id3" href="www.w3.com"></a>
</ul>

Tekniğim uygulanmış olan açılır menü: http://jsfiddle.net/y4Lac/2/


21

Bu sözde eleman, CSS Seçicileri Seviye 3 taslaklarında olmasına rağmen, davranışının özellikle iç içe elemanlarla az belirtildiği ve birlikte çalışabilirlik sağlanamadığı göründüğü için Aday Öneri aşamasında kaldırıldı.

How :: selection iç içe elemanlarda nasıl çalıştığı konusunda tartışılmaktadır .

Tarayıcılarda uygulanmasına rağmen, sekme tasarımı (sizin durumunuzda) seçiminde aynı renk ve arka plan rengini kullanarak seçilmeyen bir metin yanılsaması yapabilirsiniz.

Normal CSS Tasarımı

p { color: white;  background: black; }

Seçimde

p::-moz-selection { color: white;  background: black; }
p::selection      { color: white;  background: black; }

Kullanıcıların metni seçmesine izin verilmemesi kullanılabilirlik sorunlarını artıracaktır.


Bu yüzden Netbeans otomatik tamamlamanın neden bahsettiğim hakkında hiçbir fikri yok!
halfer
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.