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

Whozumommy
fuente
¿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;
} 
aleemb
fuente
@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>
KimKha
fuente
¿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';
Anne Gunn
fuente
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

kim3er
fuente
13

Puedes usar pointer-events: none;en tu CSS

div {
  pointer-events: none;
}
Presa Linh
fuente
6

puedes probar esto:

<div onselectstart="return false">your text</div>
Fortega
fuente
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?

Joey
fuente
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*/
}
James
fuente
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;
Artjom Kurapov
fuente
-1

Utilizar

onselectstart = "return false"

Impide copiar tu contenido.

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

Eric Grotke
fuente
-2

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

Costa
fuente
Es una respuesta desagradable pero válida.
Oxidado