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"?


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 .


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.


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

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.


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

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.


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

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.


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


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.


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>


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

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

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

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


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

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.


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


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.


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.


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.



29

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

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

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.


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

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.



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/


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.


¡Esta debe ser la razón por la que el autocompletado de Netbeans no tiene idea de lo que estoy hablando!
halfer
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.