Estoy creando una interfaz de usuario HTML con algunos elementos de texto, como los nombres de las pestañas, que se ven mal cuando se seleccionan. Desafortunadamente, es muy fácil para un usuario hacer doble clic en el nombre de una pestaña, que lo selecciona de forma predeterminada en muchos navegadores.
Podría ser capaz de resolver esto con un truco de JavaScript (también me gustaría ver esas respuestas), pero realmente espero que haya algo en CSS/HTML directamente que funcione en todos los navegadores.
En la mayoría de los navegadores, esto se puede lograr usando CSS:
*.unselectable {
-moz-user-select: -moz-none;
-khtml-user-select: none;
-webkit-user-select: none;
/*
Introduced in IE 10.
See http://ie.Microsoft.com/testdrive/HTML5/msUserSelect/
*/
-ms-user-select: none;
user-select: none;
}
Para IE <10 y Opera, deberá usar el atributo unselectable
del elemento que desea que no se pueda seleccionar. Puedes configurarlo 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, en su lugar, podría usar JavaScript para hacer esto recursivamente 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"));
<script type="text/javascript">
/***********************************************
* Disable Text Selection script- © Dynamic Drive DHTML code library (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code
***********************************************/
function disableSelection(target){
if (typeof target.onselectstart!="undefined") //IE route
target.onselectstart=function(){return false}
else if (typeof target.style.MozUserSelect!="undefined") //Firefox route
target.style.MozUserSelect="none"
else //All other route (ie: Opera)
target.onmousedown=function(){return false}
target.style.cursor = "default"
}
//Sample usages
//disableSelection(document.body) //Disable text selection on entire body
//disableSelection(document.getElementById("mydiv")) //Disable text selection on element with id="mydiv"
</script>
EDITAR
El código aparentemente proviene de http://www.dynamicdrive.com
Todas las variaciones correctas de CSS son:
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
Prueba esto:
<div onselectstart="return false">some stuff</div>
Simple, pero efectivo ... funciona en versiones actuales de todos los principales navegadores.
Para Firefox, puede aplicar la declaración CSS "-moz-user-select" a "none". Revise su documentación,SELECCIÓN DE USUARIO.
Es una "vista previa" del futuro "selección de usuario" como dicen, por lo que tal vez Opera o WebKit navegadores basados en _ _ sean compatibles con eso. También recuerdo haber encontrado algo para Internet Explorer, pero no recuerdo qué :).
De todos modos, a menos que sea una situación específica en la que la selección de texto haga que algunas funciones dinámicas falle, no deberías anular lo que los usuarios esperan de una página web, y eso es poder seleccionar el texto que desee.
Estoy encontrando cierto nivel de éxito con el CSS que se describe aquí http://www.quirksmode.org/css/selection.html :
::selection {
background-color: transparent;
}
Se encargó de la mayoría de los problemas que tenía con algunos elementos ThemeRoller ul
en una aplicación de AIR (motor de WebKit). Sigue obteniendo un pequeño parche de nada (aprox. 15 x 15) que se selecciona, pero antes se seleccionaba la mitad de la página.
Ubique absolutamente las divs sobre el área de texto con un índice z más alto y otorgue a estas divs un gráfico transparente GIF background.
Tenga en cuenta después de reflexionar un poco más: tendría que tener estas 'cubiertas' vinculadas, de modo que hacer clic en ellas lo llevaría al lugar donde debía estar la pestaña, lo que significa que podría/debería hacer esto con el elemento delimitador configurado en display:box
, conjunto de anchura y altura, así como la imagen de fondo transparente.
Para Safari, -khtml-user-select: none
, al igual que Mozilla -moz-user-select
(o, en JavaScript, target.style.KhtmlUserSelect="none";
).
Para ver un ejemplo de por qué podría ser conveniente suprimir la selección, vea SIMILE TImeline , que usa la función de arrastrar y soltar para explorar la línea de tiempo, durante la cual el movimiento vertical accidental del mouse hace que las etiquetas se resalten inesperadamente, lo que parece extraño .
Aquí hay un Sass mixin (scss) para aquellos interesados. Compass / CSS 3 no parece tener una mezcla de selección de usuario.
// @usage use within a rule
// ex. img {@include user-select(none);}
// @param assumed valid user-select value
@mixin user-select($value)
{
& {
-webkit-touch-callout: $value;
-webkit-user-select: $value;
-khtml-user-select: $value;
-moz-user-select: $value;
-ms-user-select: $value;
user-select: $value;
}
}
Aunque Compass lo haría de una manera más robusta, es decir, solo agregará soporte para los proveedores que haya elegido.
"Si tu contenido es realmente interesante, entonces hay poco que puedas hacer para protegerlo"
Eso es cierto, pero la mayoría de las copias, en mi experiencia, no tienen nada que ver con "en última instancia" o frikis o determinados plagiarios o algo así. Por lo general, las personas despistadas copian de forma casual, e incluso una protección simple y fácilmente derrotada (es decir, es fácilmente derrotada por personas como nosotros) funciona bastante bien para detenerlos. No saben nada acerca de "ver código fuente" o cachés o cualquier otra cosa ... diablos, ni siquiera saben qué es un navegador web o que están usando uno.
Si se ve mal, puedes usar CSS para cambiar la apariencia de las secciones seleccionadas.
Las imágenes pueden ser seleccionadas también.
Hay límites para usar JavaScript para deseleccionar texto, ya que puede ocurrir incluso en lugares donde desea seleccionar. Para garantizar una carrera rica y exitosa, manténgase alejado de todos los requisitos que necesitan capacidad para influir o administrar el navegador más allá de lo normal ... a menos que, por supuesto, le estén pagando extremadamente bien.
Cualquier método de JavaScript o CSS se puede burlar fácilmente con Firebug (como el caso de Flickr).
Puede usar el pseudo-elemento ::selection
en CSS para modificar el color de resaltado.
Si las pestañas son enlaces y el rectángulo de puntos en estado activo es una preocupación, puede eliminar eso también (considere la usabilidad, por supuesto).
Hay muchas ocasiones en que desactivar la seleccionabilidad mejora la experiencia del usuario.
Por ejemplo, permitir que el usuario copie un bloque de texto en la página sin copiar el texto de ningún elemento de interfaz asociado con él (que se intercalaría dentro del texto que se está copiando).
Lo siguiente funciona de manera interesante en Firefox si elimino la línea de escritura, no funciona. Alguien tiene alguna idea de por qué se necesita la línea de escritura.
<script type="text/javascript">
document.write(".");
document.body.style.MozUserSelect='none';
</script>