¿Hay alguna manera de hacer que un DIV no sea seleccionable?


140

¡Aquí hay unas preguntas CSS interesantes para ti!

Tengo un área de texto con un fondo transparente que superpone algunos TEXTOS que me gustaría usar como una especie de marca de agua. El texto es grande y ocupa la mayoría del área de texto. Se ve bien, el problema es que cuando el usuario hace clic en el área de texto, a veces selecciona el texto de la marca de agua. Quiero que el texto de la marca de agua nunca sea seleccionable. Esperaba que si algo estuviera más bajo en el índice z no sería seleccionable, pero los navegadores no parecen preocuparse por las capas de índice z al seleccionar elementos. ¿Hay algún truco o forma de hacerlo para que este DIV nunca sea seleccionable?


¿Estaría contento con una solución de JavaScript?
joshcomley

Respuestas:


203

Escribí una extensión simple de jQuery para deshabilitar la selección hace algún tiempo: deshabilitar selección en jQuery . Puedes invocarlo a través de$('.button').disableSelection();

Alternativamente, 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 gracias por señalar eso. actualizado el fragmento.
aleemb

@kasperTaeymans Pero está en un borrador de trabajo del W3C ... Lo incluiría por si acaso.
Camilo Martin

2
Para no quitarle nada a la respuesta original, que voté positivamente, pero tiene más de 3 años. Así que agregué una respuesta a continuación ( stackoverflow.com/questions/924916/… ) con una configuración adicional para la interfaz táctil.
Anne Gunn

¡Eso es lo que quería para el encabezado modal de bootstrap móvil! ¡Gracias!
Desarrollador

62

El siguiente código CSS funciona navegador casi moderno:

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

Para IE, debe usar JS o insertar atributo en la etiqueta html.

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

¿Para qué sirve unselectable="on"? ¿Puede dar una referencia por favor
Usuario

44
Encontré aquí: msdn.microsoft.com/en-us/library/hh801966(v=vs.85).aspx Pero en realidad lo probé en IE y funciona correctamente.
KimKha

1
No estoy seguro. Pero <code> unselectable = "on" </code> podría estar incluido en IE, y el validador W3C no acepta ese atributo.
KimKha

Si bien funciona en navegadores modernos, aún no está especificado por W3C.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

41

Simplemente actualizo la respuesta original y muy votada de aleemb con un par de adiciones al CSS.

Hemos estado usando el siguiente combo:

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

Recibimos la sugerencia para agregar la entrada webkit-touch de:
http://phonegap-tips.com/articles/essential-phonegap-css-webkit-touch-callout.html

Abril de 2015: solo actualizo mi propia respuesta con una variación que puede ser útil. Si necesita hacer que el DIV sea seleccionable / no seleccionable sobre la marcha y esté dispuesto a utilizar Modernizr , lo siguiente funciona perfectamente en javascript:

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

aplicar user-select: nonea un divno tiene efecto alguno. Estoy bastante seguro de que user-selectes solo para texto. ¿Hay otras formas de hacer un divno seleccionable?
oldboy

22

Como Johannes ya ha sugerido, una imagen de fondo es probablemente la mejor manera de lograr esto solo en CSS.

Una solución de JavaScript también debería afectar el "arrastre" para que sea eficaz en todos los navegadores populares.

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

Rico


13

Puedes usar pointer-events: none;en tu CSS

div {
  pointer-events: none;
}

6

puedes probar esto:

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

1
Todavía es posible seleccionar con doble clic.
ceving

6

¿No sería suficiente una simple imagen de fondo para el área de texto?


1
Bueno, más bien me refería a la marca de agua, pero una imagen de fondo transparente también podría funcionar. También se debe imágenes no baldosas muy pequeñas, ya que algunos navegadores obtener abismalmente lentos en ese caso :)
Joey

Especialmente porque un png (o gif) transparente de 1000x1000 es de solo 4kb.
Ryan Florence

Más como 1 KiB, en realidad :-)
Joey

4

Los navegadores WebKit (es decir, Google Chrome y Safari) tienen una solución CSS similar a la de Mozilla -moz-user-select: none

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

2

También en IOS si desea deshacerse de las superposiciones semitransparentes grises que aparecen en el tacto, agregue css:

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

-1

Utilizar

onselectstart = "return false"

Impide copiar tu contenido.


44
Esta solución ha sido publicada por otros.
dazedconfused

-1

Asegúrese de establecer la posición explícitamente como absoluta o relativa para que el índice z funcione para la selección. Tuve un problema similar y esto lo resolvió por mí.


-2

No estoy seguro de su caso de uso, pero podría hacerlo arrastrable.


Es una respuesta desagradable pero válida.
Oxidado
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.