Come disabilitare l'evidenziazione della selezione del testo


5204

Per le ancore che si comportano come pulsanti (ad esempio Domande , Tag , Utenti , ecc. Nella parte superiore della pagina Stack Overflow) o schede, esiste un modo CSS standard per disabilitare l'effetto di evidenziazione se l'utente seleziona accidentalmente il testo?

Mi rendo conto che questo potrebbe essere fatto con JavaScript, e un po 'googling ha prodotto l' -moz-user-selectopzione solo per Mozilla .

Esiste un modo conforme agli standard per ottenere questo risultato con i CSS e, in caso contrario, qual è l'approccio delle "migliori pratiche"?


7
gli elementi all'interno dell'elemento che hanno l'evidenziazione disabilitata, l'evidenziazione è abilitata con in css nello stile o nell'attributo class? o in altre parole, ci sono altri valori per -webkit-user-select ect. altro che solo nessuno?

7
Correlati: stackoverflow.com/questions/16600479/… = come consentire la selezione di solo alcuni degli elementi figlio
JK.

9
C'è un bug in alcuni browser in cui facendo "Seleziona tutto" (CTRL + A e CMD + A) si selezionano ancora le cose. Questo può essere combattuto con un colore di selezione trasparente: ::selection { background: transparent; } ::-moz-selection { background: transparent; }
DaAwesomeP

12
Posso solo dire: per favore non farlo. Dalla mia esperienza, il più delle volte desidero selezionare accuratamente del testo che funge anche da pulsante, per copiarlo e incollarlo altrove. Sarebbe inimmaginabilmente irritante non poterlo fare perché alcuni sviluppatori web hanno fatto di tutto per disabilitare questa funzione per me. Quindi per favore non farlo a meno che tu non abbia una ragione molto, molto buona.
Kajacx,

3
Nel 2017, è il modo migliore per utilizzare postcsse autoprefixere set di versione del browser, quindi postcssrendono tutto fresco.
Amerllic,

Risposte:


7324

AGGIORNAMENTO Gennaio 2017:

Secondo Can I use , user-selectattualmente è supportato in tutti i browser tranne Internet Explorer 9 e versioni precedenti (ma purtroppo ha ancora bisogno di un prefisso del fornitore).


Tutte le varianti CSS corrette sono:

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


Si noti che user-selectè in fase di standardizzazione (attualmente in una bozza di lavoro del W3C ). Non è garantito che funzioni ovunque, e potrebbero esserci differenze nell'implementazione tra i browser e in futuro i browser potrebbero perdere supporto.


Ulteriori informazioni sono disponibili nella documentazione di Mozilla Developer Network .


38
bel codice molokoloco: D, anche se personalmente starei ben lontano dall'utilizzarlo, poiché a volte potresti aver bisogno di valori diversi per diversi browser e si basa su JavaScript. Creare una classe e aggiungerla al tuo elemento o applicare il CSS al tuo tipo di elemento nel tuo foglio di stile è piuttosto a prova di proiettile.
Blowsie,

58
'user-select'- Valori: none | testo | attiva / disattiva | elemento | elementi | tutto | inherit - w3.org/TR/2000/WD-css3-userint-20000216
Blowsie

34
In realtà -o-user-select non è implementato in Opera. Implementa invece l'attributo non selezionabile di IE.
Tim Down,

30
Per qualche motivo, questo da solo non funzionava in IE8, quindi ho aggiunto <div onselectstart="return false;">al mio div principale.
Robasta,

308
questo è ridicolo! così tanti modi diversi di fare la stessa cosa. facciamo un nuovo standard per le selezioni dell'utente. lo chiameremo standard-user-select. allora non avremo questi problemi. sebbene per compatibilità con le versioni precedenti dovremmo includere anche gli altri. così ora il codice diventa -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, molto meglio.
Claudiu,

854

Nella maggior parte dei browser, ciò può essere ottenuto utilizzando varianti proprietarie della user-selectproprietà CSS , originariamente proposte e poi abbandonate in CSS 3 e ora proposte in CSS UI Level 4 :

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

Per Internet Explorer <10 e Opera <15, dovrai utilizzare l' unselectableattributo dell'elemento che desideri non sia selezionabile. Puoi impostarlo usando un attributo in HTML:

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

Purtroppo questa proprietà non è ereditata, il che significa che devi inserire un attributo nel tag iniziale di ogni elemento all'interno di <div>. Se questo è un problema, puoi invece usare JavaScript per farlo ricorsivamente per i discendenti di un elemento:

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

Aggiornamento del 30 aprile 2014 : questo attraversamento dell'albero deve essere rieseguito ogni volta che un nuovo elemento viene aggiunto all'albero, ma sembra da un commento di @Han che è possibile evitarlo aggiungendo un mousedowngestore di eventi che si imposta unselectablesulla destinazione del evento. Vedi http://jsbin.com/yagekiji/1 per i dettagli.


Questo non copre ancora tutte le possibilità. Sebbene sia impossibile avviare selezioni in elementi non selezionabili, in alcuni browser (ad esempio Internet Explorer e Firefox) è ancora impossibile impedire selezioni che iniziano prima e finiscono dopo l'elemento non selezionabile senza rendere l'intero documento non selezionabile.


30
dovresti rimuovere il selettore * dal tuo esempio, è davvero inefficiente e non c'è davvero bisogno di usarlo nel tuo esempio?
Blowsie,

66
@Blowsie: Non credo: la specifica CSS 2 afferma che *.fooe .foosono esattamente equivalenti (nel secondo caso, il selettore universale ( *) è implicito), quindi escludendo le stranezze del browser, non riesco a vedere che includendo il *danno prestazione. È una mia abitudine di vecchia data includere il *, che originariamente ho iniziato a fare per leggibilità: afferma esplicitamente a colpo d'occhio che l'autore intende abbinare tutti gli elementi.
Tim Down,

38
oooh dopo qualche ulteriore lettura, sembra * essere inefficace solo quando lo si utilizza come chiave (il selettore più giusto), cioè non selezionabile *. Ulteriori informazioni qui code.google.com/speed/page-speed/docs/…
Blowsie

20
Invece di usare class = "unselectable", basta usare il selettore di attributi [unselectable = "on"] {…}
Chris Calo,

13
@Francisc: No. Come ho detto a Blowsie prima nei commenti, non fa esattamente la differenza.
Tim Down

196

Una soluzione JavaScript per Internet Explorer è:

onselectstart="return false;"

55
Non dimenticare ondragstart!
Mathias Bynens,

9
un'altra cosa qui. Se lo aggiungi al corpo, non sarai in grado di selezionare il testo all'interno delle aree di testo o dei campi di input in IE. Il modo in cui l'ho risolto per IE. body.onselectstart = function(e) { if (e.target.nodeName != "INPUT" && e.target.nodeName != "TEXTAREA") { e.preventDefault(); return false; } return true; }
TheBrain,

2
Questo può essere aggiunto come attributo usando jQuery - $ ("p"). Attr ("onselectstart", "return false") Questo è stato l'unico metodo affidabile per me in IE8
Matt

13
@Abudayah perché non funzionano nelle versioni precedenti di Internet Explorer? Questo è, come, l'intero punto di questa risposta.
Pekka,

?? posso sempre selezionare il testo negli inputelementi anche se lo uso user-select: none. Devo sapere come
evitarlo

191

Fino a quando la proprietà di selezione dell'utente CSS 3 non sarà disponibile, i browser basati su Gecko supportano la -moz-user-selectproprietà che hai già trovato. I browser basati su WebKit e Blink supportano la -webkit-user-selectproprietà.

Questo ovviamente non è supportato nei browser che non utilizzano il motore di rendering Gecko.

Non esiste un modo rapido e semplice conforme agli "standard" per farlo; l'utilizzo di JavaScript è un'opzione.

La vera domanda è: perché desideri che gli utenti non siano in grado di evidenziare e presumibilmente copiare e incollare determinati elementi? Non mi sono mai imbattuto in una sola volta in cui non volevo consentire agli utenti di evidenziare una determinata porzione del mio sito Web. Molti dei miei amici, dopo aver trascorso molte ore a leggere e scrivere il codice, useranno la funzione di evidenziazione come un modo per ricordare dove si trovavano sulla pagina o fornire un pennarello in modo che i loro occhi sappiano dove guardare dopo.

L'unico posto in cui ho visto che questo è utile è se hai pulsanti per moduli che non devono essere copiati e incollati se un utente copia e incolla il sito Web.


20
La cosa dei bottoni sarebbe esattamente la mia motivazione.
Kriem,

27
Un altro motivo è necessario fare clic tenendo premuto Maiusc per selezionare più righe in una griglia o tabella. Non vuoi evidenziare il testo, vuoi che selezioni le righe.
Gordon Tucker,

7
Esistono anche problemi legali in cui il contenuto di qualcun altro viene ripubblicato legalmente, ma una clausola della licenza richiede agli editori Web di impedire che il testo possa essere facilmente copiato e incollato. Questo è ciò che mi ha portato a trovare questa domanda. Non sono d'accordo con il requisito, ma la società per la quale mi sto impegnando è legalmente obbligata ad attuarlo in questo modo.
Craig M,

5
@CraigM Lo stile CSS non impedisce a una persona di afferrare il sorgente HTML e copiarlo. Se vuoi proteggere i tuoi contenuti, dovrai trovare modi migliori.
Agile Jedi,

27
App Web altamente interattiva con molti drag & drop ... l'evidenziazione accidentale è un grosso problema di usabilità.
Marc Hughes,

138

Se si desidera disabilitare la selezione del testo su tutto tranne che sugli <p>elementi, è possibile farlo in CSS (fare attenzione a ciò -moz-noneche consente l'override nei sotto-elementi, che è consentito in altri browser con 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
Assicurati di rendere anche selezionabili i campi di input: p, input { -webkit-user-select: text; -khtml-user-select: text; -moz-user-select: text; -o-user-select: text; user-select: text; }
joshuadelange

11
Fai molta attenzione a disattivare le aspettative dell'interfaccia utente del browser su TUTTO il codice tranne un elemento. Che dire delle voci di elenco <li /> testo, ad esempio?
Jason T Featheringham,

Solo un aggiornamento ... secondo MDN da Firefox 21 -moz-nonee nonesono gli stessi.
Kevin Fegan,

2
Per questo è possibile aggiungere il cursore: predefinito e cursore: testo rispettivamente
:)

LA Bomba. Vale a dire. FINE. ul>* { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: -moz-none; -o-user-select: none; user-select: none; }[seleziona tutto in un elenco non ordinato e lo rende non selezionabile, anziché distruggere l'intero albero della vista.] Grazie per la lezione. La mia lista di pulsanti è fantastica e risponde correttamente al tocco e alla pressione dello schermo, piuttosto che al lancio di un IME (widget degli Appunti Android).
Hypersoft Systems,

125

Nelle soluzioni nelle risposte precedenti la selezione viene interrotta, ma l'utente pensa ancora che sia possibile selezionare il testo perché il cursore cambia ancora. Per mantenerlo statico, dovrai impostare il cursore CSS:

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

Questo renderà il tuo testo totalmente piatto, come sarebbe in un'applicazione desktop.


"Flat" al contrario di cosa?
kojow7,

@ kojow7 Al contrario di "a strati". Invece del testo fluttuante sopra gli altri elementi. È simile alla differenza tra immagini SVG e PNG.
Yeti,

4
Sono stato sorpreso di scoprire che Firefox richiede ancora il prefisso del fornitore nel 2019. Ho usato solo con noncuranza user-select: none;, pensando che lo standard sarebbe stato adottato ormai, ma purtroppo non lo ha fatto. Ti fa meravigliare di ciò che le persone nel comitato per gli standard potrebbero ancora discutere. "No, ragazzi ... penso davvero che dovrebbe essere user-select: cant;perché è come più descrittivo, sai?" "Siamo stati sopra questo, Mike. Dovremmo omettere l'apostrofo, e questa è una cattiva forma!" "Abbastanza tutti! Decideremo di nuovo su questo argomento il prossimo mese. Riunione del Comitato per gli Standard sospesa!"
Mentalista,

109

Puoi farlo in Firefox e Safari (anche Chrome?)

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

121
Non consiglierei di farlo, perché in realtà non risolve il problema; disabilitando la selezione del testo: la nasconde semplicemente. Questo può portare a una scarsa usabilità, perché se trascino il cursore sulla pagina potrei selezionare qualsiasi testo arbitrario senza saperlo. Ciò può causare tutti i tipi di strani "bug" di usabilità.
Keithamus,

1
Non funziona su immagini PNG con aree trasparenti: verranno sempre selezionate in un azzurro ... Qualche soluzione alternativa?
AvL

80

Soluzione alternativa per WebKit :

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

L'ho trovato in un esempio di CardFlip.


1
L'uso transparental posto di rgba funziona anche in Chrome 42 su Android.
Clint Pachl,

77

Mi piace la soluzione ibrida CSS + jQuery.

Per rendere <div class="draggable"></div>non selezionabili tutti gli elementi all'interno , utilizzare questo CSS:

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

E poi, se stai usando jQuery, aggiungilo all'interno di un $(document).ready()blocco:

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

Immagino che tu voglia ancora che tutti gli elementi di input siano interagibili, quindi lo :not()pseudo-selettore. Puoi usare '*'invece se non ti interessa.

Avvertenza: Internet Explorer 9 potrebbe non aver bisogno di questo pezzo aggiuntivo di jQuery, quindi potresti voler aggiungere un controllo di versione lì.


5
Usa -ms-user-select: none; (per IE10) e il tuo jQuery "if" dovrebbe essere questo: if (($ .browser.msie && $ .browser.version <10) || $ .browser.opera)
mhenry1384

Stai attento amico !!! Per renderlo selezionabile in Firefox devi usare-moz-user-select: Normal;
Nicolas Thery

7
@ mhenry1384 jQuery.browserè stato deprecato dalla versione 1.3 ed è stato rimosso nella versione 1.9 - api.jquery.com/jQuery.browser
WynandB

@Wynand buon punto. Ma che tipo di "rilevamento delle caratteristiche" esiste per determinare quale proprietà CSS utilizzare?
Tom Auger,

@TomAuger Potresti usare jQuery.support, ti permette di controllare singole funzionalità: Link
Aequanox

69

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

Non è il modo migliore, però.


3
Puoi anche usare titlecome attributo.
Spazzolino da denti

6
Questa è una soluzione molto creativa. Soprattutto se usasse l'attributo title perché probabilmente sarebbe meglio per gli screen reader.
pseudosavant,

4
L'ho provato ( JSBin ) e non funziona in IE. Sfortunatamente gli IE più vecchi sono gli unici per cui user-selectnon funziona.
pseudosavant,

1
Questa è un'ottima alternativa non JS che funziona in Chrome! Eccezionale!
Saricden,

stupendo! ......
Lonely

69

Puoi usare CSS o JavaScript per questo.

Il modo JavaScript è supportato nei browser più vecchi , come anche le vecchie versioni di Internet Explorer, ma se non è il tuo caso, usa il modo CSS quindi:

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

Per Internet Explorer, inoltre, è necessario aggiungere la pseudo classefocus (.ClassName: focus) e 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
Questo funziona in IE fintanto che la selezione inizia su un elemento con la classNameclasse. Vedi questo JSBin .
pseudosavant,

57

Prova a inserire queste righe nel CSS e chiama la proprietà "disHighlight" nella classe:

.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

Un aggiornamento di hack rapido

Se si utilizza il valore noneper tutte le user-selectproprietà CSS (inclusi i prefissi del browser), c'è un problema che può ancora verificarsi.

.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           */
}

Come dice CSS-Tricks , il problema è:

WebKit consente comunque di copiare il testo, se si selezionano elementi attorno ad esso.

Puoi anche usare quello sotto per selezionare enforceun intero elemento, il che significa che se fai clic su un elemento, verrà selezionato tutto il testo racchiuso in quell'elemento. Per questo, tutto ciò che devi fare è cambiare il valore nonein 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

Per coloro che hanno difficoltà a ottenere lo stesso risultato nel browser Android con l'evento touch, utilizzare:

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

Lavorando

CSS:

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

Questo dovrebbe funzionare, ma non funzionerà per i vecchi browser. Si è verificato un problema di compatibilità del browser.


La proprietà CSS non prefissata deve essere rigorosamente alla fine dell'elenco delle versioni con prefisso della proprietà. È una buona pratica, un'altra è una cattiva pratica fare un "nuovo IE" da Chrome / Webkit e portare a COSE BRUTTE come l'introduzione del supporto del prefisso -webkit nei browser non webkit. Guarda, era già nel 2012: dev.opera.com/articles/…
FlameStorm

E cito: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 il

42

Con SASS (sintassi SCSS)

Puoi farlo con un mixin :

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

In un tag HTML:

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

Provalo in questo codice .

Se si utilizza un prefissatore automatico è possibile rimuovere altri prefissi.

Compatibilità del browser qui .


36

A parte la proprietà solo di Mozilla, no, non c'è modo di disabilitare la selezione del testo con solo CSS standard (a partire da ora).

Se noti, Stack Overflow non disabilita la selezione del testo per i loro pulsanti di navigazione, e nella maggior parte dei casi sconsiglierei di farlo, poiché modifica il normale comportamento di selezione e lo rende in conflitto con le aspettative dell'utente.


Mentre sono d'accordo che cambia il comportamento che l'utente si aspetta, avrebbe senso per cose come il pulsante "Aggiungi commento" che si trova accanto a questo campo del modulo ...
X-Istence

Ma questo non espone inutili dettagli di implementazione? Non è possibile selezionare un testo di input o pulsante.

@anon: la maggior parte degli utenti probabilmente non proverà a selezionare il testo del tuo pulsante, quindi in pratica non dovrebbe importare molto. Inoltre, per farlo, dovranno iniziare a selezionare al di fuori del pulsante: se fanno clic all'interno del pulsante stesso, verrà attivato invece il gestore onclick. Inoltre, alcuni browser (ad esempio Safari) ti consentono di selezionare il testo dei normali pulsanti ...
hbw,

6
Se stai selezionando una serie di commenti da un thread di chat e ogni commento ha un pulsante di voto positivo / negativo accanto a esso, sarebbe bello selezionare il testo senza le altre cose. Questo è ciò che l'utente si aspetta o desidera. Non vuole copiare / incollare le etichette dei pulsanti con ogni commento.
Mnebuerquo,

2
E se, ad esempio, fai doppio clic su un pulsante che invece di reindirizzarti a un'altra pagina apre un div? quindi il testo per il pulsante verrà selezionato grazie al doppio clic!
Gigala,

34

Questo funziona in alcuni browser:

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

Aggiungi semplicemente gli elementi / ID desiderati davanti ai selettori separati da virgole senza spazi, in questo modo:

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

Le altre risposte sono migliori; questo dovrebbe probabilmente essere visto come l'ultima risorsa / catchall.


3
Ci sono alcune cose che si possono sapere con certezza, ma questa soluzione sicuramente non funziona in tutti i browser.
Volker E.

33

Supponiamo che ci siano due divs in questo modo:

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

Impostare il cursore sul valore predefinito in modo da dare all'utente una sensazione non selezionabile.

Il prefisso deve essere utilizzato per supportarlo in tutti i browser. Senza un prefisso questo potrebbe non funzionare in tutte le risposte.



29

Aggiungi questo al primo div in cui desideri disabilitare la selezione per il testo:

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

28

NOTA:

La risposta corretta è corretta in quanto ti impedisce di poter selezionare il testo. Tuttavia, ciò non ti impedisce di essere in grado di copiare il testo, come mostrerò con il prossimo paio di schermate (dal 7 novembre 2014).

Prima di aver selezionato qualcosa

Dopo aver selezionato

I numeri sono stati copiati

Come puoi vedere, non siamo stati in grado di selezionare i numeri, ma siamo riusciti a copiarli.

Testato su: Ubuntu , Google Chrome 38.0.2125.111.


1
Ho avuto lo stesso problema. Su Mac Chrome 48.0.2564.116 e su Mac Safari 9.0.3. In particolare, Mac Firefox 43.0 non copia il personaggio, ma racchiude linee extra tra di loro. Cosa si dovrebbe fare al riguardo?
NHDaly

26

Per ottenere il risultato di cui avevo bisogno, ho scoperto che dovevo usare entrambi ::selectioneuser-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 una risposta che funziona
oldboy

23

Si fa facilmente con:

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

In alternativa:

Diciamo che hai un <h1 id="example">Hello, World!</h1>. Dovrai rimuovere il HTML interno di quello h1, in questo caso Ciao, Mondo . Quindi dovrai andare su CSS e fare questo:

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

Ora pensa semplicemente che sia un elemento a blocchi e non un testo.



21

Controlla la mia soluzione senza JavaScript:

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>

Menu a comparsa con la mia tecnica applicata: http://jsfiddle.net/y4Lac/2/


21

Sebbene questo pseudo-elemento fosse in bozze di Selettori CSS livello 3, è stato rimosso durante la fase di Raccomandazione dei Candidati, poiché sembrava che il suo comportamento fosse sotto-specificato, specialmente con elementi nidificati, e l'interoperabilità non fosse stata raggiunta.

Viene discusso in Come :: la selezione funziona su elementi nidificati .

Nonostante sia implementato nei browser, puoi fare l'illusione che il testo non sia selezionato usando lo stesso colore e lo stesso colore di sfondo nella selezione del design della scheda (nel tuo caso).

Design CSS normale

p { color: white;  background: black; }

Alla selezione

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

Non consentire agli utenti di selezionare il testo solleverà problemi di usabilità.


Questo deve essere il motivo per cui il completamento automatico di Netbeans non ha idea di cosa sto parlando!
halfer
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.