Quiero ignorar todas las :hover
declaraciones CSS si un usuario visita nuestro sitio web a través de un dispositivo táctil. Debido a que el :hover
CSS no tiene sentido, e incluso puede ser molesto si una tableta lo activa al hacer clic / tocar, ya que podría quedarse hasta que el elemento pierda el foco. Para ser honesto, no sé por qué los dispositivos táctiles sienten la necesidad de activarse :hover
en primer lugar, pero esta es la realidad, por lo que este problema también es la realidad.
a:hover {
color:blue;
border-color:green;
// etc. > ignore all at once for touch devices
}
Entonces, ¿cómo puedo eliminar / ignorar todas las :hover
declaraciones CSS a la vez (sin tener que conocer cada una) para dispositivos táctiles después de haberlos declarado?
Respuestas:
tl; dr usa esto: https://jsfiddle.net/57tmy8j3/
Si le interesa por qué o qué otras opciones hay, siga leyendo.
Quick'n'dirty - eliminar: estilos de desplazamiento con JS
Puede eliminar todas las reglas CSS que contienen el
:hover
uso de Javascript. Esto tiene la ventaja de no tener que tocar CSS y ser compatible incluso con navegadores antiguos.Limitaciones: las hojas de estilo deben estar alojadas en el mismo dominio (eso significa que no hay CDN). Deshabilita los movimientos del mouse sobre dispositivos táctiles y de mouse mixtos como Surface o iPad Pro, lo que perjudica a UX.
Solo CSS: use consultas de medios
Coloque todas sus reglas de desplazamiento en un
@media
bloque:o, alternativamente, anule todas sus reglas de desplazamiento (compatible con navegadores antiguos):
Limitaciones: funciona solo en iOS 9.0+, Chrome para Android o Android 5.0+ cuando se usa WebView.
hover: hover
rompe los efectos de desplazamiento en navegadores antiguos,hover: none
necesita anular todas las reglas CSS previamente definidas. Ambos son incompatibles con dispositivos mixtos de mouse y táctiles .El más robusto: detecta el tacto a través de JS y antepone CSS: reglas de desplazamiento
Este método necesita anteponer todas las reglas de desplazamiento con
body.hasHover
. (o un nombre de clase de su elección)La
hasHover
clase se puede agregar usandohasTouch()
el primer ejemplo:Sin embargo, esto tendría los mismos inconvenientes con los dispositivos táctiles mixtos que los ejemplos anteriores, lo que nos lleva a la solución definitiva. Habilite los efectos de desplazamiento cada vez que mueva el cursor del mouse, desactive los efectos de desplazamiento siempre que se detecte un toque.
Esto debería funcionar básicamente en cualquier navegador y habilita / deshabilita los estilos de desplazamiento según sea necesario.
Aquí está el ejemplo completo: moderno: https://jsfiddle.net/57tmy8j3/
Legacy (para usar con navegadores antiguos): https://jsfiddle.net/dkz17jc5/19/
fuente
document.styleSheets
existe en lugar de usar eltry/catch
?try/catch
en caso de que aparezca algún error extraño, que podría bloquear el script, como deleteRule no funciona debido a la política del mismo origen o el soporte escaso en IE (editó el comentario para reflejar eso). Pero sí, en la mayoría de los casos, solo una simple verificación debería ser suficiente.Adaptación de puntero al rescate!
Como esto no se ha tocado en un tiempo, puede usar:
Vea esta demostración tanto en su navegador de escritorio como en el navegador de su teléfono . Compatible con dispositivos táctiles modernos .
Nota : Tenga en cuenta que, dado que la entrada (capacidad) primaria de una PC de Surface es un mouse, terminará siendo un enlace azul, incluso si se trata de una pantalla separada (tableta). Los navegadores siempre (deberían) predeterminan la capacidad de entrada más precisa.
fuente
He encontrado el mismo problema (en mi caso con los navegadores móviles Samsung) y, por lo tanto, me topé con esta pregunta.
Gracias a la respuesta de Calsal, encontré algo que creo que excluirá prácticamente todos los navegadores de escritorio porque parece ser reconocido por los navegadores móviles que probé (vea la captura de pantalla de una tabla compilada: tabla de detección de funciones de puntero CSS ).
Los documentos web de MDN indican que
.
Lo que descubrí es que puntero: grueso es algo que todos los navegadores de escritorio de la tabla adjunta desconocen pero que todos los navegadores móviles de la misma tabla conocen. Esta parece ser la opción más efectiva porque todos los demás valores de palabras clave de puntero dan resultados inconsistentes.
Por lo tanto, podría construir una consulta de medios como Calsal, descrita pero ligeramente modificada. Utiliza una lógica inversa para descartar todos los dispositivos táctiles.
Sass mixin:
CSS compilado:
También se describe en esta esencia que creé después de investigar el problema. Codepen para la investigación empírica.
ACTUALIZACIÓN : Al escribir esta actualización, 2018-08-23, y señalado por @DmitriPavlutin, esta técnica ya no parece funcionar con el escritorio de Firefox.
fuente
De acuerdo con la respuesta de Jason , podemos abordar solo los dispositivos que no admiten el desplazamiento con consultas puras de medios css. También podemos abordar solo dispositivos que admiten el desplazamiento , como la respuesta de moogal en una pregunta similar, con
@media not all and (hover: none)
. Se ve raro pero funciona.Hice un Sass mixin con esto para un uso más fácil:
Actualización 2019-05-15 : recomiendo este artículo de Medium que pasa por todos los dispositivos diferentes a los que podemos dirigirnos con CSS. Básicamente es una combinación de estas reglas de medios, combínelas para objetivos específicos:
Ejemplo para objetivos específicos:
Me encantan los mixins, así es como uso mi hover mixin para apuntar solo a dispositivos que lo admiten:
fuente
Estoy lidiando con un problema similar actualmente.
Hay dos opciones principales que se me ocurren de inmediato: (1) comprobación de cadenas de usuario o (2) mantenimiento de páginas móviles separadas usando una URL diferente y hacer que los usuarios elijan lo que es mejor para ellos.
<link rel="mobile.css" />
estilo diferente al normal.Las cadenas de usuario tienen información de identificación sobre el navegador, el procesador, el sistema operativo, etc. Depende de usted decidir qué dispositivos son "táctiles" versus no táctiles. Es posible que pueda encontrar esta información disponible en algún lugar y asignarla a su sistema.
R. Si puede ignorar los navegadores antiguos , solo tiene que agregar una sola regla al CSS normal, no móvil, a saber:EDITAR : Erk. Después de experimentar un poco, descubrí que la siguiente regla también deshabilita la capacidad de seguir enlaces en los navegadores webkit, además de causar que los efectos estéticos se deshabiliten; consulte http://jsfiddle.net/3nkcdeao/Como tal, tendrá para ser un poco más selectivo en cuanto a cómo modificar las reglas para el caso móvil que lo que muestro aquí, pero puede ser un punto de partida útil:
Como nota al margen, deshabilitar los eventos de puntero en un elemento primario y luego habilitarlos explícitamente en un elemento secundario hace que los efectos de desplazamiento en el elemento primario se activen nuevamente si entra un elemento secundario
:hover
.Ver http://jsfiddle.net/38Lookhp/5/
B. Si admite renderizadores web heredados, tendrá que trabajar un poco más en la línea de eliminar cualquier regla que establezca estilos especiales durante
:hover
. Para ahorrar tiempo a todos, es posible que solo desee crear un comando de copiado + sed automatizado que ejecute en sus hojas de estilo estándar para crear las versiones móviles. Eso le permitiría simplemente escribir / actualizar el código estándar y eliminar cualquier regla de estilo que use:hover
para la versión móvil de sus páginas.De nuevo aquí, puede agregar una o dos reglas adicionales a las hojas de estilo o verse obligado a hacer algo un poco más complicado usando sed o una utilidad similar. Probablemente sería más fácil de aplicar: no a sus reglas de estilo como
div:not(.disruptive):hover {...
en las que agregaríaclass="disruptive"
elementos que hacen cosas molestas para usuarios móviles que usan js o el idioma del servidor, en lugar de mezclar el CSS.(II) En realidad, puede combinar los dos primeros y (si sospecha que un usuario se ha desviado a la versión incorrecta de una página) puede sugerir que cambien dentro / fuera de la pantalla de tipo móvil, o simplemente tener un enlace en algún lugar permite a los usuarios pasar de un lado a otro. Como ya se indicó, las consultas de @media también podrían ser útiles para determinar qué se está visitando.
(III) Si está preparado para una solución jQuery una vez que sepa qué dispositivos son "táctiles" y cuáles no, es posible que le resulte útil ignorar el desplazamiento del CSS en dispositivos con pantalla táctil .
fuente
pointer-events
- ¡eso es increíble! Eso es exactamente lo que estaba buscando, ¡muchas gracias!<a>
enlaces pueden ser inaccesibles enpointer-events:none
. Con suerte, eso cambiará más tarde, o CSS 3.xo 4.0+ tendrápointer-events:navigation-only
o similar.prueba esto:
ACTUALIZACIÓN: desafortunadamente, W3C ha eliminado esta propiedad de las especificaciones ( https://github.com/w3c/csswg-drafts/commit/2078b46218f7462735bb0b5107c9a3e84fb4c4b1 ).
fuente
Puede usar Modernizr JS (consulte también esta respuesta de StackOverflow ) o crear una función JS personalizada:
para detectar el soporte del evento táctil en el navegador, y luego asignar una
CSS
propiedad regular , atravesando el elemento con lahtml.no-touch
clase, así:fuente
html
etiqueta en lugar de labody
etiqueta puede hacer que sea un poco mejor leer. Esa es en realidad la solución que estoy usando actualmente. Gracias de todos modos.Fue útil para mí: enlace
fuente
Esta también es una posible solución, pero tendrá que pasar por su CSS y agregar una
.no-touch
clase antes de sus estilos de desplazamiento.Javascript:
Ejemplo de CSS:
Fuente
Ps Pero debemos recordar que cada vez hay más dispositivos táctiles en el mercado, que también admiten la entrada del mouse al mismo tiempo.
fuente
Es posible que todavía no sea una solución perfecta (y es con jQuery), pero tal vez sea una dirección / concepto para trabajar: ¿qué hay de hacerlo al revés? Lo que significa desactivar los estados: hover css por defecto y activarlos si se detecta un evento mousemove en cualquier parte del documento. Por supuesto, esto no funciona si alguien desactiva js. ¿Qué más podría hablar en contra de hacerlo de esta manera?
Tal vez así:
CSS:
jQuery:
fuente
$('body').one.('mousemove', ...)
Pruebe esto (yo uso background y background-color en este ejemplo):
css:
fuente
La manera sucia ... No es elegante, pero es la forma más fácil que puede salvarte.
Elimine todo lo que caracterice el vuelo estacionario.
fuente
Si su problema es cuando toca / toca en Android y todo div cubierto por un color azul transparente. Entonces solo necesitas cambiar el
CURSOR: PUNTERO; al CURSOR: POR DEFECTO;
use mediaQuery para esconderse en el teléfono móvil / tableta.
Esto funciona para mi.
fuente
Pruebe esta solución fácil de jquery 2019, aunque ha existido por un tiempo;
agregue este complemento a la cabeza:
src = "https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"
agregue esto a js:
$ ("*"). on ("touchend", función (e) {$ (this) .focus ();}); // se aplica a todos los elementos
Algunas variaciones sugeridas a esto son:
$ (": input,: checkbox,"). on ("touchend", function (e) {(this) .focus);}); // especifica elementos
$ ("*"). on ("click, touchend", function (e) {$ (this) .focus ();}); // incluye evento click
css: body {cursor: puntero; } // toca cualquier lugar para finalizar un foco
Notas
Referencias
https://code.jquery.com/ui/
https://api.jquery.com/category/selectors/jquery-selector-extensions/
fuente