Cómo deshabilitar el resaltado de selección de texto

5204

Para las anclas que actúan como botones (por ejemplo, Preguntas , Etiquetas , Usuarios , etc. en la parte superior de la página de Desbordamiento de pila) o hay pestañas, ¿hay alguna forma estándar de CSS para deshabilitar el efecto de resaltado si el usuario selecciona accidentalmente el texto?

Me doy cuenta de que esto se puede hacer con JavaScript, y un poco de google produjo la -moz-user-selectopción de solo Mozilla .

¿Existe una manera que cumpla con los estándares para lograr esto con CSS, y si no, cuál es el enfoque de "mejor práctica"?

Peter Mortensen
fuente
77
¿Pueden los elementos dentro del elemento brujo tener resaltado deshabilitado, tener resaltado habilitado con en CSS en el atributo de estilo o clase? o en otras palabras, ¿hay otros valores para -webkit-user-select ect? aparte de simplemente ninguno?
77
Relacionado: stackoverflow.com/questions/16600479/… = cómo permitir que solo se seleccionen algunos de los elementos secundarios
JK.
99
Hay un error en algunos navegadores donde hacer "Seleccionar todo" (CTRL + A y CMD + A) todavía selecciona cosas. Esto se puede combatir con un color de selección transparente: ::selection { background: transparent; } ::-moz-selection { background: transparent; }
DaAwesomeP
12
¿Puedo decir: por favor no hagas esto? Según mi experiencia, la mayoría de las veces realmente quiero seleccionar algún texto que también sirva como botón, para copiarlo y pegarlo en otro lugar. Sería inimaginablemente exasperante no poder hacer eso porque algunos desarrolladores web hicieron todo lo posible para deshabilitar esta función para mí. Así que por favor no hagas esto a menos que tengas una muy, muy buena razón.
kajacx
3
En el año 2017, es mejor manera de utilizar postcssy autoprefixery juego de la versión del navegador, a continuación, postcsshacer que todo fresco.
AmerllicA

Respuestas:

7324

ACTUALIZACIÓN enero de 2017:

Según Can I use , user-selectactualmente es compatible con todos los navegadores, excepto Internet Explorer 9 y versiones anteriores (pero lamentablemente aún necesita un prefijo de proveedor).


Todas las variaciones correctas de CSS son:

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


Tenga user-selecten cuenta que está en proceso de estandarización (actualmente en un borrador de trabajo del W3C ). No se garantiza que funcione en todas partes, y puede haber diferencias en la implementación entre los navegadores y en el futuro los navegadores pueden dejar de admitirlo.


Se puede encontrar más información en la documentación de Mozilla Developer Network .

Blowsie
fuente
38
buen código molokoloco: D, aunque personalmente me mantendría alejado de usarlo, ya que a veces puede necesitar valores diferentes para diferentes navegadores, y depende de JavaScript. Hacer una clase y agregarlo a su elemento o aplicar el CSS a su tipo de elemento en su hoja de estilo es bastante a prueba de balas.
Blowsie
58
'user-select'- Valores: ninguno | texto | alternar | elemento | elementos | todos | heredar - w3.org/TR/2000/WD-css3-userint-20000216
Blowsie
34
En realidad, -o-user-select no se implementa en Opera. Implementa el atributo no seleccionable de IE en su lugar.
Tim Down
30
Por alguna razón, esto solo no funcionaba en IE8, luego agregué <div onselectstart="return false;">a mi div principal.
robasta
308
¡esto es ridículo! tantas maneras diferentes de hacer lo mismo. hagamos un nuevo estándar para las selecciones de los usuarios. lo llamaremos standard-user-select. entonces no tendremos estos problemas. aunque para la compatibilidad con versiones anteriores también deberíamos incluir a los demás. así que ahora se convierte el código -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, mucho mejor.
Claudiu
854

En la mayoría de los navegadores, esto se puede lograr utilizando variaciones propietarias en la user-selectpropiedad CSS , originalmente propuesta y luego abandonada en CSS 3 y ahora propuesta en CSS UI Nivel 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;
}

Para Internet Explorer <10 y Opera <15, deberá usar el unselectableatributo del elemento que desea que no se pueda seleccionar. Puede configurar esto usando un atributo en HTML:

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

Lamentablemente, esta propiedad no se hereda, lo que significa que debe colocar un atributo en la etiqueta de inicio de cada elemento dentro del <div>. Si esto es un problema, podría usar JavaScript para hacer esto de forma recursiva para los descendientes de 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"));

Actualización 30 de abril de 2014 : este recorrido del árbol debe volver a ejecutarse cada vez que se agrega un nuevo elemento al árbol, pero según un comentario de @Han es posible evitar esto agregando un mousedowncontrolador de eventos que se establece unselectableen el objetivo del evento. Ver http://jsbin.com/yagekiji/1 para más detalles.


Esto todavía no cubre todas las posibilidades. Si bien es imposible iniciar selecciones en elementos no seleccionables, en algunos navegadores (Internet Explorer y Firefox, por ejemplo) todavía es imposible evitar selecciones que comienzan antes y terminan después del elemento no seleccionable sin hacer que todo el documento sea no seleccionable.

Tim Down
fuente
30
debe eliminar el selector * de su ejemplo, es realmente ineficiente y realmente no hay necesidad de usarlo en su ejemplo, ¿verdad?
Blowsie
66
@Blowsie: No lo creo: la especificación CSS 2 establece que *.fooy .fooson exactamente equivalentes (en el segundo caso, el selector universal ( *) está implícito), por lo que, salvo las peculiaridades del navegador, no puedo ver que *eso perjudique actuación. Es un hábito mío desde hace mucho tiempo incluir el *, lo que originalmente comencé a hacer para facilitar la lectura: establece explícitamente a simple vista que el autor tiene la intención de unir todos los elementos.
Tim Down
38
oooh, después de leer más, parece que * no es eficiente cuando se usa como la tecla (el selector más adecuado), es decir, no seleccionable *. Más información aquí code.google.com/speed/page-speed/docs/…
Blowsie
20
En lugar de usar la clase = "no seleccionable", simplemente use el selector de atributos [unselectable = "on"] {…}
Chris Calo
13
@Francisc: No. Como le dije a Blowsie anteriormente en los comentarios, no hace ninguna diferencia.
Tim Down
196

Una solución de JavaScript para Internet Explorer es:

onselectstart="return false;"
Pekka
fuente
55
¡No te olvides ondragstart!
Mathias Bynens
99
Una cosa más aquí. Si agrega eso al cuerpo, no podrá seleccionar texto dentro de áreas de texto o campos de entrada en IE. La forma en que lo arreglé para IE. body.onselectstart = function(e) { if (e.target.nodeName != "INPUT" && e.target.nodeName != "TEXTAREA") { e.preventDefault(); return false; } return true; }
TheBrain
2
Esto se puede agregar como un atributo usando jQuery - $ ("p"). Attr ("onselectstart", "return false") Este fue el único método confiable para mí en IE8
Matt
13
@Abudayah porque no funcionan en versiones anteriores de Internet Explorer? Ese es, como, todo el punto de esta respuesta.
Pekka
?? Todavía puedo seleccionar texto en inputelementos, incluso si lo uso user-select: none. necesito saber cómo prevenir esto
oldboy
191

Hasta que la propiedad de selección de usuario de CSS 3 esté disponible, los navegadores basados ​​en Gecko admiten la -moz-user-selectpropiedad que ya encontró. Los navegadores WebKit y Blink admiten la -webkit-user-selectpropiedad.

Por supuesto, esto no es compatible con los navegadores que no utilizan el motor de renderizado Gecko.

No hay una forma rápida y fácil de cumplir con los "estándares"; Usar JavaScript es una opción.

La verdadera pregunta es, ¿por qué desea que los usuarios no puedan resaltar y presumiblemente copiar y pegar ciertos elementos? No he encontrado una sola vez que no quisiera permitir que los usuarios resalten una cierta parte de mi sitio web. Varios de mis amigos, después de pasar muchas horas leyendo y escribiendo códigos, usarán la función de resaltado como una forma de recordar en qué parte de la página se encontraban, o proporcionarán un marcador para que sus ojos sepan dónde mirar a continuación.

El único lugar donde podría ver que esto es útil es si tiene botones para formularios que no deben copiarse y pegarse si un usuario copia y pega el sitio web.

X-Istence
fuente
20
Lo de los botones sería exactamente mi motivación.
Kriem
27
Otra razón por la que esto es necesario es pulsar Mayús y hacer clic para seleccionar varias filas en una cuadrícula o tabla. No desea resaltar el texto, desea que seleccione las filas.
Gordon Tucker
77
También hay problemas legales en los que el contenido de otra persona se está republicando legalmente, pero una cláusula de la licencia requiere que los editores web eviten que el texto se copie y pegue fácilmente. Esto es lo que me llevó a encontrar esta pregunta. No estoy de acuerdo con el requisito, pero la empresa que estoy contratando está legalmente obligada a implementarlo de esta manera.
Craig M
55
@CraigM El estilo css no impide que una persona tome la fuente HTML y la copie. Si desea proteger su contenido, tendrá que encontrar mejores formas.
Agile Jedi
27
Aplicación web altamente interactiva con una gran cantidad de arrastrar y soltar ... el resaltado accidental es un gran problema de usabilidad.
Marc Hughes
138

Si desea deshabilitar la selección de texto en todo excepto en los <p>elementos, puede hacerlo en CSS (tenga cuidado con lo -moz-noneque permite la anulación en subelementos, que está permitido en otros navegadores 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;
}
Benjamin Crouzier
fuente
12
Asegúrese también de que los campos de entrada sean seleccionables: p, input { -webkit-user-select: text; -khtml-user-select: text; -moz-user-select: text; -o-user-select: text; user-select: text; }
joshuadelange
11
Tenga mucho cuidado al desactivar las expectativas de la interfaz de usuario del navegador en TODO el código, excepto para un elemento. ¿Qué pasa con la lista de elementos <li /> texto, por ejemplo?
Jason T Featheringham
Solo una actualización ... según MDN desde Firefox 21 -moz-noney noneson lo mismo.
Kevin Fegan
2
Para esto, puede agregar cursor: predeterminado y cursor: texto respectivamente
:)
La bomba Es decir. EL FIN. ul>* { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: -moz-none; -o-user-select: none; user-select: none; }[selecciona todo en una lista desordenada y hace que no se pueda seleccionar, en lugar de destruir todo el árbol de la vista.] Gracias por la lección. Mi lista de botones se ve muy bien y responde correctamente al tocar y presionar la pantalla, en lugar de iniciar un IME (widgets del portapapeles de Android).
Hypersoft Systems
125

En las soluciones de las respuestas anteriores, la selección se detiene, pero el usuario todavía cree que puede seleccionar texto porque el cursor todavía cambia. Para mantenerlo estático, deberá configurar su cursor 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>

Esto hará que su texto sea totalmente plano, como si estuviera en una aplicación de escritorio.

ZECTBynmo
fuente
¿"Plano" en lugar de qué?
kojow7
@ kojow7 A diferencia de "capas". En lugar de texto flotando sobre los otros elementos. Es similar a la diferencia entre las imágenes SVG y PNG.
Yeti
44
Me sorprendió descubrir que Firefox todavía requiere el prefijo del proveedor en 2019. Solo lo ignoré user-select: none;, pensando que el estándar ya se habría adoptado, pero lamentablemente no lo ha hecho. Hace que te preguntes qué podrían estar debatiendo las personas del comité de normas. "No, muchachos ... realmente creo que debería ser user-select: cant;porque es más descriptivo, ¿sabes?" "Hemos superado esto, Mike. Tendríamos que omitir el apóstrofe, ¡y esa es una mala forma!" "¡Suficiente, todos! Vamos a deliberar sobre este asunto nuevamente el próximo mes. ¡Se clausuró la reunión del Comité de Normas!"
Mentalista
109

Puedes hacerlo en Firefox y Safari (¿Chrome también?)

::selection { background: transparent; }
::-moz-selection { background: transparent; }
seanmonstar
fuente
121
No recomendaría hacer esto, porque en realidad no soluciona el problema; deshabilitar la selección de texto, simplemente lo oculta. Esto puede conducir a una mala usabilidad, porque si arrastro mi cursor alrededor de la página, podría estar seleccionando cualquier texto arbitrario sin saberlo. Esto puede causar todo tipo de "errores" de usabilidad extraños.
Keithamus
1
No funciona en imágenes PNG con áreas transparentes: siempre se seleccionará en azul claro ... ¿Alguna solución?
AvL
80

Solución alternativa para WebKit :

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

Lo encontré en un ejemplo de CardFlip.

Alex
fuente
1
El uso transparenten lugar de rgba también funciona en Chrome 42 en Android.
Clint Pachl
77

Me gusta la solución híbrida CSS + jQuery.

Para hacer que todos los elementos dentro <div class="draggable"></div>no sean seleccionables, use este 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;
 }

Y luego, si está usando jQuery, agregue esto dentro de un $(document).ready()bloque:

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

Supongo que todavía desea que los elementos de entrada sean interactivos, de ahí el :not()pseudo-selector. Podrías usar'*' lugar, si no le importa.

Advertencia: es posible que Internet Explorer 9 no necesite esta pieza adicional de jQuery, por lo que es posible que desee agregar una verificación de versión allí.

Tom Auger
fuente
55
Use -ms-user-select: ninguno; (para IE10) y su jQuery "if" debería ser esto: if (($ .browser.msie && $ .browser.version <10) || $ .browser.opera)
mhenry1384
¡Ten cuidado hombre! Para que sea seleccionable en Firefox debe usar-moz-user-select: Normal;
Nicolas Thery
77
@ mhenry1384 jQuery.browserha quedado en desuso a partir de la versión 1.3 y se ha eliminado en la versión 1.9 - api.jquery.com/jQuery.browser
WynandB
@Wynand Buen punto. Pero, ¿qué tipo de "detección de características" existe para determinar qué propiedad CSS usar?
Tom Auger
@TomAuger Puede usar jQuery.support, le permite verificar las características individuales: Enlace
Aequanox
69

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

Sin embargo, no es la mejor manera.

Cerveza inglesa
fuente
3
También podría usarlo titlecomo el atributo.
Cepillo de dientes
66
Esa es una solución muy creativa. Especialmente si usaba el atributo title porque probablemente sería mejor para los lectores de pantalla.
pseudosavant
44
Lo probé ( JSBin ) y no funciona en IE. Desafortunadamente, los IE más antiguos son los únicos para los que user-selectno funciona.
pseudosavant
1
¡Esta es una gran alternativa no JS que funciona en Chrome! ¡Increíble!
saricden
precioso! ......
Solo
69

Puede usar CSS o JavaScript para eso.

El JavaScript manera se apoya en más viejos navegadores, como viejas versiones de Internet Explorer, así, pero si no es su caso, utilice el modo CSS a continuación:

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>

Alireza
fuente
59

Para Internet Explorer, además, debe agregar pseudo clasefocus (.ClassName: focus) y 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  */
}
Elad Shechter
fuente
3
Esto funciona en IE siempre que la selección comience en un elemento con la classNameclase. Ver este JSBin .
pseudosavant
57

Intente insertar estas filas en el CSS y llame al "disHighlight" en la propiedad de clase:

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

Una actualización rápida de pirateo

Si usa el valor nonepara todas las user-selectpropiedades CSS (incluidos los prefijos del navegador), existe un problema que aún puede ocurrir.

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

Como dice CSS-Tricks , el problema es:

WebKit aún permite copiar el texto, si selecciona elementos a su alrededor.

También puede usar el siguiente para seleccionar enforceun elemento completo, lo que significa que si hace clic en un elemento, se seleccionará todo el texto envuelto en ese elemento. Para esto, todo lo que tiene que hacer es cambiar el valor nonea 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  */
}
Kaz
fuente
48

Para aquellos que tienen problemas para lograr lo mismo en el navegador de Android con el evento táctil, use:

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

Si está utilizando Less y Bootstrap , podría escribir:

.user-select(none);
Codler
fuente
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');
Gaurang
fuente
46

Trabajando

CSS:

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

Esto debería funcionar, pero no funcionará para los navegadores antiguos. Hay un problema de compatibilidad del navegador.

suraj rawat
fuente
La propiedad CSS sin prefijo debe estar estrictamente al final de la lista de versiones prefijadas de la propiedad. Es una buena práctica correcta, otra es una mala práctica hacer un "nuevo IE" de Chrome / Webkit y generar tantas cosas desagradables como introducir el soporte de prefijo -webkit en navegadores que no sean webkit. Mira, esto ya fue en 2012: dev.opera.com/articles/…
FlameStorm
Y 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
42

Con SASS (sintaxis SCSS)

Puedes hacer esto 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;
}

En una etiqueta HTML:

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

Pruébalo en este CodePen .

Si está utilizando un corrector automático , puede eliminar otros prefijos.

Compatibilidad del navegador aquí .

Ale_info
fuente
36

Aparte de la propiedad exclusiva de Mozilla, no, no hay forma de deshabilitar la selección de texto con solo CSS estándar (a partir de ahora).

Si observa que el desbordamiento de pila no deshabilita la selección de texto para sus botones de navegación, y recomendaría no hacerlo en la mayoría de los casos, ya que modifica el comportamiento de selección normal y hace que entre en conflicto con las expectativas del usuario.

hbw
fuente
Aunque estoy de acuerdo que cambia el comportamiento de los usuarios Espera, que tendría sentido para cosas como el botón "Añadir comentario" que está sentado al lado de este campo de formulario ...
X-tencia
¿Pero eso no expone detalles de implementación innecesarios? No se puede seleccionar una entrada o el texto del botón.
@anon: La mayoría de los usuarios probablemente no intentarán seleccionar el texto de su botón, por lo que en la práctica, realmente no debería importar mucho. Además, para hacerlo, deberán comenzar a seleccionar fuera del botón; si hacen clic dentro del botón, se activará el controlador onclick. Además, algunos navegadores (por ejemplo, Safari) en realidad le permiten seleccionar el texto de los botones normales ...
hbw
66
Si está seleccionando un conjunto de comentarios de un hilo de chat y cada comentario tiene un botón de voto a favor y voto a favor al lado, sería bueno seleccionar el texto sin las otras cosas. Eso es lo que el usuario espera o quiere. No quiere copiar / pegar las etiquetas de los botones con cada comentario.
Mnebuerquo
2
¿Y si, por ejemplo, hace doble clic en un botón que, en lugar de redirigirlo a otra página, abre un div? entonces el texto para el botón será seleccionado debido al doble clic!
Gigala
34

Esto funciona en algunos navegadores:

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

Simplemente agregue los elementos / identificadores deseados frente a los selectores separados por comas sin espacios, de esta manera:

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

Las otras respuestas son mejores; Esto probablemente debería verse como un último recurso / catchall.

r3wt
fuente
3
Hay algunas cosas que se pueden saber con certeza, pero esta solución definitivamente no funciona en todos los navegadores.
Volker E.
33

Supongamos que hay dos divs como este:

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

Establezca el cursor en predeterminado para que le dé una sensación no seleccionable al usuario.

El prefijo debe usarse para admitirlo en todos los navegadores. Sin un prefijo, esto puede no funcionar en todas las respuestas.

Gaurav Aggarwal
fuente
30

Esto será útil si la selección de color tampoco es necesaria:

::-moz-selection { background:none; color:none; }
::selection { background:none; color:none; }

... todas las otras correcciones del navegador. Funcionará en Internet Explorer 9 o posterior.

karthipan raj
fuente
1
Haz eso color: inherit;tal vez.
Yaakov Ainspan
sí, lo amo. Es el selector de CSS nivel 3 según los documentos de Mozilla
Bariq Dharmawan
29

Agregue esto al primer div en el que desea deshabilitar la selección de texto:

onmousedown='return false;' 
onselectstart='return false;'
JIT1986
fuente
28

NOTA:

La respuesta correcta es correcta porque le impide poder seleccionar el texto. Sin embargo, no impide que pueda copiar el texto, como lo mostraré con las siguientes capturas de pantalla (a partir del 7 de noviembre de 2014).

Antes de que hayamos seleccionado algo

Después de haber seleccionado

Los números han sido copiados

Como puede ver, no pudimos seleccionar los números, pero pudimos copiarlos.

Probado en: Ubuntu , Google Chrome 38.0.2125.111.

Luke Madhanga
fuente
1
He tenido el mismo problema En Mac Chrome 48.0.2564.116 y en Mac Safari 9.0.3. En particular, Mac Firefox 43.0 no copia el personaje, pero coloca líneas finales adicionales entre ellos. ¿Qué se debe hacer al respecto?
NHDaly
26

Para obtener el resultado que necesitaba, descubrí que tenía que usar ambos ::selectionyuser-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;
}
SemánticaZen
fuente
finalyyyyyyy una respuesta que funciona
oldboy
23

Se hace fácilmente con:

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

Alternativamente:

Digamos que tienes un <h1 id="example">Hello, World!</h1>. Tendrás que eliminar el innerHTML de eso h1, en este caso Hello, World . Luego tendrás que ir a CSS y hacer esto:

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

Ahora simplemente piensa que es un elemento de bloque y no un texto.

codeWithMe
fuente
21

Comprueba mi solución sin 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>

Menú emergente con mi técnica aplicada: http://jsfiddle.net/y4Lac/2/

apocalipsis
fuente
21

Aunque este pseudo-elemento estaba en los borradores del Selector CSS Nivel 3, se eliminó durante la fase de Recomendación del candidato, ya que parecía que su comportamiento estaba subespecificado, especialmente con elementos anidados, y no se logró la interoperabilidad.

Se discute en Cómo :: selección funciona en elementos anidados .

A pesar de que se está implementando en los navegadores, puede crear una ilusión de que el texto no se selecciona utilizando el mismo color y color de fondo en la selección que en el diseño de la pestaña (en su caso).

Diseño CSS normal

p { color: white;  background: black; }

En la selección

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

No permitir que los usuarios seleccionen el texto generará problemas de usabilidad.

Suraj Naik
fuente
¡Esta debe ser la razón por la que el autocompletado de Netbeans no tiene idea de lo que estoy hablando!
halfer