Czy istnieje sposób, aby uniemożliwić wybór DIV?


140

Oto interesujące pytania dotyczące CSS!

Mam obszar tekstowy z przezroczystym tłem pokrywającym jakiś TEKST, którego chciałbym użyć jako rodzaju znaku wodnego. Tekst jest duży i zajmuje większość obszaru tekstu. Wygląda ładnie, problem polega na tym, że gdy użytkownik klika obszar tekstu, czasami wybiera zamiast tego tekst znaku wodnego. Chcę, aby tekst znaku wodnego nigdy nie był możliwy do wybrania. Spodziewałem się, że jeśli coś będzie niżej w indeksie z, nie będzie można go wybrać, ale przeglądarki nie przejmują się warstwami indeksu z podczas wybierania elementów. Czy jest jakaś sztuczka lub sposób, aby to zrobić, aby tego DIV nigdy nie można było wybrać?


Czy byłbyś zadowolony z rozwiązania javascript?
joshcomley

Odpowiedzi:


203

Napisałem proste rozszerzenie jQuery, aby wyłączyć zaznaczanie jakiś czas temu: Wyłączanie zaznaczania w jQuery . Możesz go wywołać$('.button').disableSelection();

Alternatywnie, używając CSS (cross-browser):

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

@kasperTaeymans dzięki za zwrócenie na to uwagi. zaktualizował fragment.
aleemb

@kasperTaeymans Ale to jest w roboczym szkicu W3C ... Dodałbym to na wszelki wypadek.
Camilo Martin

2
Nie odejmuję niczego od oryginalnej odpowiedzi, za którą głosowałem, ale ma ona ponad 3 lata. Więc dodałem odpowiedź poniżej ( stackoverflow.com/questions/924916/… ) z dodanym ustawieniem interfejsu dotykowego.
Anne Gunn

Właśnie tego chciałem dla ruchomego nagłówka modalnego bootstrap! Dzięki!
Deweloper,

62

Poniższy kod CSS działa w prawie nowoczesnej przeglądarce:

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

W przypadku IE musisz użyć JS lub wstawić atrybut w tagu html.

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

Jaki jest cel unselectable="on". Czy możesz podać referencje
użytkownik

4
Znalazłem tutaj: msdn.microsoft.com/en-us/library/hh801966(v=vs.85).aspx Ale faktycznie testowałem na IE i działa poprawnie.
KimKha

1
Nie jestem pewny. Ale <code> unselectable = "on" </code> może znajdować się w IE, a walidator W3C nie akceptuje tego atrybutu.
KimKha,

Chociaż działa w nowoczesnych przeglądarkach, nie jest jeszcze określony przez W3C.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

41

Po prostu zaktualizuję oryginalną, cieszącą się dużą popularnością odpowiedź aleemb z kilkoma dodatkami do css.

Używaliśmy następującej kombinacji:

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

Sugestię dodania wpisu webkit-touch otrzymaliśmy z:
http://phonegap-tips.com/articles/essential-phonegap-css-webkit-touch-callout.html

Kwiecień 2015: Aktualizuję własną odpowiedź, dodając wariację, która może się przydać. Jeśli chcesz sprawić, by DIV był wybierany / niewybieralny w locie i chcesz używać Modernizr , poniższe działa dobrze w javascript:

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

zastosowanie user-select: nonedo a divnie ma żadnego skutku. jestem pewien, że user-selectdotyczy tylko tekstu. czy są jakieś inne sposoby, aby uniemożliwić wybór div?
oldboy

22

Jak już zasugerował Johannes, obraz tła jest prawdopodobnie najlepszym sposobem osiągnięcia tego w samym CSS.

Rozwiązanie JavaScript również musiałoby wpływać na „dragstart”, aby było skuteczne we wszystkich popularnych przeglądarkach.

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

Bogaty


13

Możesz użyć pointer-events: none;w swoim CSS

div {
  pointer-events: none;
}

6

możesz spróbować tego:

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

1
Nadal można wybrać za pomocą podwójnego kliknięcia.
ceving

6

Czy zwykły obraz tła dla obszaru tekstowego nie wystarczyłby?


1
Cóż, raczej chodziło mi o znak wodny, ale przezroczysty obraz tła może również działać. Nie powinieneś też układać bardzo małych obrazów, ponieważ niektóre przeglądarki działają w takim przypadku strasznie wolno :)
Joey

Zwłaszcza, że ​​przezroczysty png (lub gif) 1000x1000 ma tylko 4kb.
Ryan Florence

Bardziej jak 1 KiB, właściwie :-)
Joey

4

Przeglądarki WebKit (tj. Google Chrome i Safari) mają rozwiązanie CSS podobne do -moz-user-select Mozilli: brak

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

2

Również w IOS, jeśli chcesz pozbyć się szarych, półprzezroczystych nakładek pojawiających się po dotknięciu, dodaj css:

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


-1

Upewnij się, że ustawiłeś pozycję jawnie jako bezwzględną lub względną, aby indeks Z działał przy wyborze. Miałem podobny problem i to rozwiązało go dla mnie.


-2

Nie jestem pewien swojego przypadku użycia, ale możesz sprawić, że będzie można go przeciągać.


To nieprzyjemna, ale ważna odpowiedź.
Rusty
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.