Gibt es eine Möglichkeit, einen DIV nicht auswählbar zu machen?

140

Hier sind interessante CSS-Fragen für Sie!

Ich habe einen Textbereich mit einem transparenten Hintergrund, der einen TEXT überlagert, den ich als eine Art Wasserzeichen verwenden möchte. Der Text ist groß und nimmt einen Großteil des Textbereichs ein. Es sieht gut aus, das Problem ist, wenn der Benutzer in den Textbereich klickt, wählt er manchmal stattdessen den Wasserzeichentext aus. Ich möchte, dass der Wasserzeichentext niemals auswählbar ist. Ich hatte erwartet, dass etwas, das im Z-Index niedriger ist, nicht auswählbar ist, aber Browser scheinen sich bei der Auswahl von Elementen nicht um Z-Index-Ebenen zu kümmern. Gibt es einen Trick oder eine Möglichkeit, es so zu machen, dass dieser DIV niemals auswählbar ist?

Whozumommy
quelle
Würden Sie sich über eine Javascript-Lösung freuen?
Joshcomley

Antworten:

203

Ich habe vor einiger Zeit eine einfache jQuery-Erweiterung geschrieben, um die Auswahl zu deaktivieren: Deaktivieren der Auswahl in jQuery . Sie können es durch aufrufen$('.button').disableSelection();

Alternativ mit CSS (Cross-Browser):

.button {
        user-select: none;
        -moz-user-select: none;
        -khtml-user-select: none;
        -webkit-user-select: none;
        -o-user-select: none;
} 
Aleemb
quelle
@kasperTaeymans danke für den Hinweis. hat das Snippet aktualisiert.
Aleemb
@kasperTaeymans Aber es ist in einem W3C-Arbeitsentwurf ... Ich würde es nur für den Fall einschließen.
Camilo Martin
2
Der ursprünglichen Antwort, die ich positiv bewertet habe, nichts wegzunehmen, aber sie ist 3+ Jahre alt. Daher habe ich unten eine Antwort ( stackoverflow.com/questions/924916/… ) mit einer zusätzlichen Einstellung für die Touch-Oberfläche hinzugefügt.
Anne Gunn
Das wollte ich für einen beweglichen modalen Bootstrap-Header! Vielen Dank!
Entwickler
62

Der folgende CSS-Code funktioniert fast moderner Browser:

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

Für IE müssen Sie JS verwenden oder ein Attribut in ein HTML-Tag einfügen.

<div id="foo" unselectable="on" class="unselectable">...</div>
KimKha
quelle
Was ist der Zweck von unselectable="on". Können Sie bitte eine Referenz geben
Benutzer
4
Ich fand hier: msdn.microsoft.com/en-us/library/hh801966(v=vs.85).aspx Aber ich habe tatsächlich im IE getestet und es funktioniert korrekt.
KimKha
1
Ich bin mir nicht sicher. <Code> unselectable = "on" </ code> ist möglicherweise im IE enthalten, und der W3C-Validator akzeptiert dieses Attribut nicht.
KimKha
Während es in modernen Browsern funktioniert, ist es von W3C noch nicht spezifiziert.
Ciro Santilli 法轮功 冠状 病 六四 六四 22
41

Aktualisieren Sie einfach die ursprüngliche, vielbeachtete Antwort von aleemb mit ein paar Ergänzungen zum CSS.

Wir haben die folgende Kombination verwendet:

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

Wir haben den Vorschlag zum Hinzufügen des Webkit-Touch-Eintrags erhalten von:
http://phonegap-tips.com/articles/essential-phonegap-css-webkit-touch-callout.html

2015 Apr: Ich aktualisiere nur meine eigene Antwort mit einer Variation, die nützlich sein kann. Wenn Sie den DIV im laufenden Betrieb auswählbar / nicht auswählbar machen müssen und bereit sind, Modernizr zu verwenden , funktioniert Folgendes in Javascript einwandfrei:

    var userSelectProp = Modernizr.prefixed('userSelect');
    var specialDiv = document.querySelector('#specialDiv');
    specialDiv.style[userSelectProp] = 'none';
Anne Gunn
quelle
Die Bewerbung user-select: nonebei a divhat keinerlei Auswirkungen. Ich bin mir ziemlich sicher, dass user-selectes nur für Text ist. Gibt es andere Möglichkeiten, eine divnicht auswählbare zu machen ?
Oldboy
22

Wie Johannes bereits vorgeschlagen hat, ist ein Hintergrundbild wahrscheinlich der beste Weg, dies allein in CSS zu erreichen.

Eine JavaScript-Lösung müsste auch "Dragstart" beeinflussen, um in allen gängigen Browsern wirksam zu sein.

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

Reich

kim3er
quelle
13

Sie können pointer-events: none;in Ihrem CSS verwenden

div {
  pointer-events: none;
}
Linh Dam
quelle
6

Sie können dies versuchen:

<div onselectstart="return false">your text</div>
Fortega
quelle
1
Es ist weiterhin möglich, per Doppelklick auszuwählen.
am
6

Würde ein einfaches Hintergrundbild für den Textbereich nicht ausreichen?

Joey
quelle
1
Nun, ich meinte eher das Wasserzeichen, aber ein transparentes Hintergrundbild könnte auch funktionieren. Außerdem sollten Sie keine sehr kleinen Bilder kacheln, da einige Browser in diesem Fall unglaublich langsam werden :)
Joey
Zumal ein 1000x1000 transparentes PNG (oder GIF) nur 4kb groß ist.
Ryan Florence
Eigentlich eher wie 1 KiB :-)
Joey
4

WebKit-Browser (dh Google Chrome und Safari) verfügen über eine CSS-Lösung, die Mozillas -moz-user-select ähnelt: none

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

Fügen Sie auch unter IOS CSS hinzu, wenn Sie graue, halbtransparente Overlays entfernen möchten, die auf der Berührung erscheinen:

-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-touch-callout: none;
Artjom Kurapov
quelle
-1

Verwenden

onselectstart = "return false"

Es verhindert das Kopieren Ihrer Inhalte.

Anuraj
quelle
4
Diese Lösung wurde von anderen veröffentlicht.
benommen verwirrt
-1

Stellen Sie sicher, dass Sie die Position explizit als absolut oder relativ festlegen, damit der Z-Index für die Auswahl funktioniert. Ich hatte ein ähnliches Problem und dies löste es für mich.

Eric Grotke
quelle
-2

Sie sind sich Ihres Anwendungsfalls nicht sicher, können ihn jedoch ziehbar machen.

Costa
quelle
Es ist eine unangenehme, aber gültige Antwort.
Rusty