C'è un modo per rendere un DIV non selezionabile?


140

Ecco una domanda CSS interessante per te!

Ho una textarea con uno sfondo trasparente sovrapposto a TEXT che vorrei usare come una sorta di filigrana. Il testo è grande e occupa la maggior parte dell'area di testo. Sembra carino, il problema è che quando l'utente fa clic nell'area di testo a volte seleziona invece il testo della filigrana. Voglio che il testo della filigrana non sia mai selezionabile. Mi aspettavo che se qualcosa fosse più basso nell'indice z non sarebbe selezionabile, ma i browser non sembrano preoccuparsi dei livelli dell'indice z quando si selezionano gli elementi. C'è un trucco o un modo per farlo in modo che questo DIV non sia mai selezionabile?


Saresti felice con una soluzione javascript?
joshcomley,

Risposte:


203

Ho scritto una semplice estensione jQuery per disabilitare la selezione qualche tempo fa: Disabilitare la selezione in jQuery . Puoi invocarlo$('.button').disableSelection();

In alternativa, usando CSS (cross-browser):

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

@kasperTaeymans grazie per averlo sottolineato. aggiornato lo snippet.
aleemb,

@kasperTaeymans Ma è in una bozza di lavoro del W3C ... Includerei per ogni evenienza.
Camilo Martin,

2
Non togliere nulla dalla risposta originale, che ho votato, ma ha più di 3 anni. Quindi ho aggiunto una risposta di seguito ( stackoverflow.com/questions/924916/… ) con un'impostazione aggiunta per l'interfaccia touch.
Anne Gunn,

Questo è quello che volevo per l'intestazione modale bootstrap mobile! Grazie!
Sviluppatore

62

Il seguente codice CSS funziona in un browser quasi moderno:

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

Per IE, è necessario utilizzare JS o inserire l'attributo nel tag html.

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

Qual è lo scopo di unselectable="on". Puoi fornire un riferimento per favore
utente

4
Ho trovato qui: msdn.microsoft.com/en-us/library/hh801966(v=vs.85).aspx Ma in realtà ho testato su IE e funziona correttamente.
KimKha,

1
Non ne sono sicuro. Ma <code> unselectable = "on" </code> potrebbe essere incluso in IE e il validatore W3C non accetta tale attributo.
KimKha,

Mentre funziona su browser moderni, non è ancora specificato da W3C.
Ciro Santilli 22 冠状 病 六四 事件 法轮功

41

Sto solo aggiornando la risposta originale e molto votata di aleemb con un paio di aggiunte al CSS.

Abbiamo usato la seguente combinazione:

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

Abbiamo ricevuto il suggerimento per l'aggiunta della voce webkit-touch da:
http://phonegap-tips.com/articles/essential-phonegap-css-webkit-touch-callout.html

Apr 2015: sto solo aggiornando la mia risposta con una variazione che potrebbe tornare utile. Se è necessario rendere il DIV selezionabile / non selezionabile al volo e si desidera utilizzare Modernizr , le seguenti funzioni funzionano perfettamente in javascript:

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

l'applicazione user-select: nonea divnon ha alcun effetto. sono abbastanza sicuro user-selectsolo per il testo. ci sono altri modi per rendere divnon selezionabile?
oldboy,

22

Come Johannes ha già suggerito, un'immagine di sfondo è probabilmente il modo migliore per raggiungere questo obiettivo nel solo CSS.

Una soluzione JavaScript dovrebbe inoltre influire sul "trascinamento" per essere efficace su tutti i browser più diffusi.

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

Ricco


13

Puoi usarlo pointer-events: none;nel tuo CSS

div {
  pointer-events: none;
}

6

puoi provare questo:

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

1
È ancora possibile selezionare con un doppio clic.
ceving

6

Non sarebbe sufficiente una semplice immagine di sfondo per la textarea?


1
Bene, intendevo piuttosto la filigrana, ma potrebbe funzionare anche un'immagine di sfondo trasparente. Inoltre, non dovresti affiancare immagini di dimensioni molto ridotte poiché alcuni browser in questo caso diventano incredibilmente lenti :)
Joey,

Soprattutto perché un png (o gif) trasparente 1000x1000 è solo 4kb.
Ryan Florence,

Più come 1 KiB, in realtà :-)
Joey,

4

I browser WebKit (ovvero Google Chrome e Safari) hanno una soluzione CSS simile a -moz-user-select di Mozilla: nessuna

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

2

Anche in IOS se vuoi eliminare sovrapposizioni semitrasparenti grigie che appaiono suuchuch, aggiungi css:

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

-1

Uso

onselectstart = "return false"

impedisce di copiare i tuoi contenuti.


4
Questa soluzione è stata pubblicata da altri.
stupito confuso il

-1

Assicurati di impostare esplicitamente la posizione come assoluta o relativa affinché z-index funzioni per la selezione. Ho avuto un problema simile e questo mi ha risolto.


-2

Non sei sicuro del tuo caso d'uso, ma potresti renderlo trascinabile.


È una risposta spiacevole ma valida.
Rusty,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.