He creado un carrusel con un botón anterior y otro siguiente que siempre están visibles. Estos botones tienen un estado de desplazamiento, se vuelven azules. En dispositivos táctiles, como iPad, el estado de desplazamiento es fijo, por lo que el botón permanece azul después de tocarlo. No quiero eso
Podría agregar una
no-hover
claseontouchend
para cada botón y hacer que mi CSS sea así:button:not(.no-hover):hover { background-color: blue; }
pero eso probablemente sea bastante malo para el rendimiento, y no maneja dispositivos como el Chromebook Pixel (que tiene una pantalla táctil y un mouse) correctamente.Podría agregar una
touch
clase aldocumentElement
y hacer mi CSS de esta manera:html:not(.touch) button:hover { background-color: blue; }
Pero eso tampoco funciona bien en dispositivos con toque y mouse.
Lo que preferiría es eliminar el estado de desplazamiento ontouchend
. Pero no parece que eso sea posible. Enfocar otro elemento no elimina el estado de desplazamiento. Tocar otro elemento manualmente, pero parece que no puedo activar eso en JavaScript.
Todas las soluciones que he encontrado parecen imperfectas. ¿Hay una solución perfecta?
fuente
Una vez que se implemente CSS Media Queries Nivel 4 , podrá hacer esto:
O en inglés: "Si el navegador admite el desplazamiento apropiado / verdadero / real / no emulado (por ejemplo, tiene un dispositivo de entrada principal similar a un mouse), aplique este estilo cuando
button
se desplace el mouse sobre".Dado que esta parte del Nivel 4 de Consultas de medios hasta ahora solo se ha implementado en Chrome de última generación , escribí un polyfill para tratar esto. Utilizándolo, puede transformar el CSS futurista anterior en:
(Una variación de la
.no-touch
técnica) Y luego, usando JavaScript del lado del cliente del mismo polyfill que detecta el soporte para el desplazamiento, puede alternar la presencia de lamy-true-hover
clase en consecuencia:fuente
Este es un problema común sin una solución perfecta. El comportamiento de desplazamiento es útil con un mouse y en su mayoría perjudicial con el tacto. Para agravar el problema están los dispositivos que admiten el tacto y el mouse (¡simultáneamente, no menos!) Como Chromebook Pixel y Surface.
La solución más limpia que he encontrado es habilitar solo el comportamiento de desplazamiento si no se considera que el dispositivo admite entrada táctil.
Por supuesto, pierdes el control sobre dispositivos que pueden soportarlo. Sin embargo, a veces el cursor pasa más que el enlace en sí mismo, por ejemplo, tal vez desee mostrar un menú cuando se coloca un elemento. Este enfoque le permite probar la existencia del tacto y quizás adjuntar condicionalmente un evento diferente.
He probado esto en iPhone, iPad, Chromebook Pixel, Surface y una variedad de dispositivos Android. No puedo garantizar que funcionará cuando se agregue una entrada táctil USB genérica (como un lápiz) a la mezcla.
fuente
Con Modernizr puedes apuntar tus hovers específicamente para dispositivos no táctiles:
(Nota: esto no se ejecuta en el sistema de fragmentos de StackOverflow, verifique el jsfiddle en su lugar)
Tenga en cuenta que
:active
no es necesario enfocarlo.no-touch
porque funciona como se espera tanto en dispositivos móviles como en computadoras de escritorio.fuente
.no-touch
está presente en lahtml
etiqueta. De lo contrario, esta respuesta obtiene mi sello de aprobación.Puede anular el efecto de desplazamiento para dispositivos que no admiten el desplazamiento. Me gusta:
Probado y verificado en iOS 12
Sugerencia para https://stackoverflow.com/a/50285058/178959 por señalar esto.
fuente
fuente
A partir de 4 formas de lidiar con el desplazamiento flotante en dispositivos móviles : Aquí hay una manera de agregar o quitar dinámicamente una "
can touch
" clase al documento en función del tipo de entrada actual del usuario. También funciona con dispositivos híbridos donde el usuario puede cambiar entre el tacto y un mouse / trackpad:fuente
Iba a publicar mi propia solución, pero comprobando si alguien ya la había publicado, encontré que @Rodney casi lo hizo. Sin embargo, lo perdió un último elemento crucial que lo hizo inflexible, al menos en mi caso. Quiero decir, yo también tomé la misma
.fakeHover
clase de adición / eliminación víamouseenter
ymouseleave
detección de eventos, pero eso solo, per se , actúa casi exactamente como "genuino":hover
. Quiero decir: cuando tocas un elemento en tu tabla, no detectará que lo has "dejado", manteniendo así el estado "falso".Lo que hice fue simplemente escuchar
click
, también, así que cuando "toco" el botón, disparo manualmente amouseleave
.Si este es mi código final:
De esta manera, mantienes tu
hover
funcionalidad habitual cuando usas un mouse cuando simplemente "pasas el mouse" sobre tus botones. Bueno, casi todo: el único inconveniente de alguna manera es que, después de hacer clic en el botón con el mouse, no estará enhover
estado. Al igual que si hicieras clic y rápidamente quitaras el puntero del botón. Pero en mi caso puedo vivir con eso.fuente
Esto es lo que se me ocurrió hasta ahora después de estudiar el resto de las respuestas. Debería ser capaz de admitir usuarios táctiles, de mouse o híbridos.
Cree una clase de desplazamiento independiente para el efecto de desplazamiento. Por defecto, agregue esta clase de desplazamiento a nuestro botón.
No queremos detectar la presencia de soporte táctil y deshabilitar todos los efectos de desplazamiento desde el principio. Como mencionan otros, los dispositivos híbridos están ganando popularidad; las personas pueden tener soporte táctil pero quieren usar un mouse y viceversa. Por lo tanto, solo elimine la clase de desplazamiento cuando el usuario realmente toque el botón.
El siguiente problema es, ¿qué pasa si el usuario quiere volver a usar el mouse después de tocar el botón? Para resolver eso, necesitamos encontrar un momento oportuno para volver a agregar la clase de desplazamiento que hemos eliminado.
Sin embargo, no podemos volver a agregarlo inmediatamente después de eliminarlo, porque el estado de desplazamiento todavía está activo. Es posible que no queramos destruir y recrear todo el botón también.
Entonces, pensé en usar un algoritmo de espera ocupada (usando setInterval) para verificar el estado de desplazamiento. Una vez que el estado de desplazamiento está desactivado, podemos volver a agregar la clase de desplazamiento y detener la espera ocupada, volviendo al estado original donde el usuario puede usar el mouse o el tacto.
Sé que la espera ocupada no es tan buena, pero no estoy seguro si hay un evento apropiado. He considerado agregarlo nuevamente en el evento mouseleave, pero no fue muy robusto. Por ejemplo, cuando aparece una alerta después de tocar el botón, la posición del mouse cambia pero el evento mouseleave no se activa.
Editar: Otro enfoque que probé es llamar
e.preventDefault()
dentro de ontouchstart o ontouchend. Parece detener el efecto de desplazamiento al tocar el botón, pero también detiene la animación de clic del botón y evita que se llame a la función de clic cuando se toca el botón, por lo que debe llamarlos manualmente en el controlador ontouchstart o ontouchend. No es una solución muy limpia.fuente
Fue útil para mí: enlace
fuente
Agregue este código JS a su página:
ahora en su CSS antes de cada desplazamiento, agregue la clase de desplazamiento así:
Si el dispositivo es táctil, la clase de cuerpo estará vacía, de lo contrario, su clase se desplazará y se aplicarán las reglas.
fuente
document.body.className = 'ontouchstart' in window ? '' : 'hover';
Este es el punto de partida correcto. Siguiente paso: aplicar / eliminar la clase nohover en los siguientes eventos (demostración con jQuery)
Aviso: si desea aplicar otras clases al elemento de tono, el: not (.nohover) en el CSS ya no funcionará como se esperaba. Luego, debe agregar una definición separada con el valor predeterminado y una etiqueta importante para sobrescribir el estilo de desplazamiento: .nohover {background-color: white! Important}
¡Esto incluso debería manejar dispositivos como el Chromebook Pixel (que tiene una pantalla táctil y un mouse) correctamente! Y no creo que este sea un gran asesino de rendimiento ...
fuente
Una solución que me ha funcionado:
Agregue este código a su hoja de estilo.
Quería deshacerme del fondo gris que aparece en iOS Safari cuando se hace clic en un enlace. Pero parece hacer más. ¡Ahora hacer clic en un botón (con una
:hover
pseudoclase!) Se abre de inmediato! Solo lo probé en un iPad, no sé si funcionará en otros dispositivos.fuente
Creo que he encontrado una solución elegante (mínimo js) para un problema similar:
Usando jQuery, puede activar el desplazamiento sobre el cuerpo (o cualquier otro elemento), usando
.mouseover()
Así que simplemente adjunto este controlador al
ontouchend
evento del elemento de esta manera:Esto, sin embargo, solo elimina: suspender la pseudoclase del elemento después de que se haya activado algún otro evento táctil, como deslizar u otro toque
fuente
Tengo una buena solución que me gustaría compartir. Primero debe detectar si el usuario está en un dispositivo móvil como este:
Luego solo agrega:
Y en CSS:
fuente
Pasé por un problema similar, mi aplicación era compatible para todos los tamaños de pantalla, tenía muchos efectos de desplazamiento en el tamaño de la pantalla del escritorio dispositivos basados en el / mouse, y más tarde me di cuenta de que los dispositivos táctiles estaban causando una condición conocida como pegajosa -hover y fue un obstáculo para que la aplicación funcione correctamente para los usuarios de dispositivos táctiles.
Estábamos haciendo uso de SCSS en nuestra aplicación. y definí un mixin para cuidar el dispositivo táctil.
y luego coloqué todas mis clases de css bajo el fragmento mencionado a continuación.
Por ejemplo, teníamos una clase para animar un ícono, y que solía activarse una vez que pasamos el cursor sobre el ícono como se puede ver desde css, pero en un dispositivo táctil se vio afectado por el efecto de desplazamiento y luego lo coloqué dentro de @ incluir hover-support () para garantizar que el hover solo se aplique a aquellos dispositivos que lo soporten.
fuente
Aquí hay un código JavaScript simple que no requiere que el desarrollador edite CSS o escriba nuevas reglas CSS. Escribí esto para los botones Bootstrap con
class="btn"
, pero funcionará con cualquier botón que tenga un nombre de clase específico.Los pasos son:
document.styleSheets
.btn
y:hover
La eliminación de todas las
.btn :hover
reglas CSS garantiza que no habrá un efecto de desplazamiento visual en un botón.Paso 1: Detectar dispositivo táctil
Verifique la consulta de medios para detectar la presencia de
(hover: none)
:Paso 2: Eliminar las reglas CSS que contienen `btn` y`: hover`
El código completo está en GitHub y npm .
Demostración en vivo en terrymorse.com .
fuente
@media (hover:none)
o cuando el usuario toca la pantalla por primera vez. Puede probarlo en la página de demostración en vivo para estar seguro.Puede establecer el color de fondo en el
:active
estado y proporcionar:focus
el fondo predeterminado.si establece el color de fondo a través de
onfocus/ontouch
, el estilo de color permanece una vez que el:focus
estado ha desaparecido.También necesita reiniciar
onblur
para restaurar el valor predeterminado bg cuando se pierde el foco.fuente
Esto funcionó para mí: poner el estilo de desplazamiento en una nueva clase
Luego agregue / elimine la clase cuando sea necesario
Repita para eventos de inicio táctil y toque. O cualquier evento que desee para obtener el resultado deseado, por ejemplo, quería que el efecto de desplazamiento se activara en una pantalla táctil.
fuente
Basado en la respuesta de Darren Cooks, que también funciona si mueve el dedo sobre otro elemento.
Consulte Buscar dedo del elemento encendido durante un evento de toque
Codepen Demo
fuente
Puedes intentarlo de esta manera.
javascript:
css:
fuente
Lo que hice hasta ahora en mis proyectos fue revertir los
:hover
cambios en los dispositivos táctiles:Todos los nombres de clase y colores con nombre solo para fines de demostración ;-)
fuente
Esto funciona perfectamente en 2 pasos.
Configure su etiqueta corporal para que sea así
<body ontouchstart="">
. No soy fanático de este "hack", pero permite que Safari en iOS reaccione a los toques al instante. No estoy seguro de cómo, pero funciona.Configure su clase táctil de esta manera:
Es posible que también desee eliminar cualquier animación en su clase táctil. Android Chrome parece ser un poco más lento que iOS.
Esto también dará como resultado que se aplique el estado activo si el usuario se desplaza por la página mientras toca su clase.
fuente
Algunos de los
:hover
:focus
:active
problemas pegajosos o atascados en los dispositivos móviles pueden ser causados por la falta,<meta name="viewport" content="width=device-width">
ya que los navegadores intentan manipular la pantalla.fuente
La solución para mí fue después de tocar el dedo, clonar y reemplazar el nodo ... odio hacer esto, pero incluso tratar de volver a pintar el elemento con offsetHeight no funcionaba
fuente
Se puede lograr intercambiando una clase HTML. Debería ser menos propenso a fallas técnicas que eliminar todo el elemento, especialmente con enlaces de imágenes grandes, etc.
También podemos decidir si queremos flotar estados de desplazamiento al desplazarse con el tacto (touchmove) o incluso agregar un tiempo de espera para retrasarlos.
El único cambio significativo en nuestro código será usar clases HTML adicionales, como
<a class='hover'></a>
elementos que implementan el nuevo comportamiento.HTML
CSS
JS (con jQuery)
Ejemplo
https://codepen.io/mattrcouk/pen/VweajZv
-
Sin embargo, no tengo ningún dispositivo con mouse y táctil para probarlo correctamente.
fuente
Desde 2020 Puede agregar estilos de desplazamiento dentro de la consulta de medios
Esta consulta de medios indica que los estilos funcionarán en navegadores que no emulan: desplace el mouse para que NO funcione en navegadores táctiles.
fuente