En Webkit en iPhone / iPad / iPod, especificar el estilo de una pseudoclase activa para una <a>
etiqueta no se activa cuando toca el elemento. ¿Cómo puedo hacer que esto se active? Código de ejemplo:
<style>
a:active {
background-color: red;
}
</style>
<!-- snip -->
<a href="#">Click me</a>
iphone
css
webkit
mobile-safari
pseudo-class
Jesse Rusak
fuente
fuente
ontouchstart
sin el=""
? (HTML5)Como han dicho otras respuestas, iOS Safari no activa la
:active
pseudoclase a menos que se adjunte un evento táctil al elemento, pero hasta ahora este comportamiento ha sido "mágico". Encontré esta pequeña propaganda en la Biblioteca de desarrolladores de Safari que lo explica (el énfasis es mío):En otras palabras, configurar un
ontouchstart
evento (incluso si está vacío) le dice explícitamente al navegador que reaccione a los eventos táctiles.En mi opinión, este es un comportamiento defectuoso y probablemente se remonta a la época en que la web "móvil" era básicamente inexistente (eche un vistazo a esas capturas de pantalla en la página vinculada para ver a qué me refiero), y todo estaba orientado al mouse. Es interesante observar que otros navegadores móviles más nuevos, como los de Android, muestran el pseudo-estado `: active 'en el tacto muy bien, sin ningún tipo de trucos como los que se necesitan para iOS.
(Nota al margen: si desea usar sus propios estilos personalizados en iOS, también puede deshabilitar el cuadro gris translúcido predeterminado que usa iOS en lugar del
:active
pseudo-estado usando la-webkit-tap-highlight-color
propiedad CSS, como se explica en la misma página vinculada arriba .)Después de un poco de experimentación, la solución esperada de configurar un
ontouchstart
evento en el<body>
elemento al que todos los eventos táctiles luego burbujean no funciona completamente. Si el elemento está visible en la ventana gráfica cuando se carga la página, entonces funciona bien, pero desplazarse hacia abajo y tocar un elemento que estaba fuera de la ventana gráfica no activa el:active
pseudoestado como debería. Entonces, en lugar deadjunte el evento a todos los elementos en lugar de confiar en el evento que se propaga al cuerpo (usando jQuery):
Sin embargo, no estoy al tanto de las implicaciones de rendimiento de esto, así que tenga cuidado.
EDITAR: Hay una falla seria con esta solución: incluso tocar un elemento mientras se desplaza por la página activará el
:active
pseudoestado. La sensibilidad es demasiado fuerte. Android resuelve esto introduciendo una pequeña demora antes de que se muestre el estado, que se cancela si se desplaza la página. A la luz de esto, sugiero usar esto solo en elementos seleccionados. En mi caso, estoy desarrollando una aplicación web para usar en el campo que es básicamente una lista de botones para navegar por las páginas y enviar acciones. Debido a que la página completa es prácticamente botones en algunos casos, esto no funcionará para mí. Sin embargo, puede configurar el:hover
pseudo-estado para que lo complete. Después de desactivar el cuadro gris predeterminado, esto funciona perfectamente.fuente
Agregue un controlador de eventos para ontouchstart en su etiqueta <a>. Esto hace que el CSS funcione mágicamente.
fuente
Esto funciona para mi:
Nota: si hace este truco, también vale la pena eliminar el color de toque y resaltado predeterminado que aplica Mobile Safari usando la siguiente regla CSS.
fuente
A partir del 8 de diciembre de 2016, la respuesta aceptada (
<body ontouchstart="">...</body>
) no me funciona en Safari 10 (iPhone 5s): ese truco solo funciona para aquellos elementos que eran visibles al cargar la página.Sin embargo, agregando:
la
head
hace funcionar de la manera que quiero, con la desventaja de que ahora todos los eventos de toque durante el desplazamiento también desencadenan la:active
pseudo-estado en los elementos tocados. (Si esto es un problema para usted, podría considerar la:hover
solución alternativa de FighterJet ).fuente
Esto funciona para mí, agregue a su CSS en el elemento que desea resaltar
fuente
¿Estás usando todas las pseudoclases o solo una? Si está usando al menos dos, asegúrese de que estén en el orden correcto o todos se romperán:
..en ese orden. Además, si solo está usando: active, agregue un enlace:, incluso si no lo está modificando.
fuente
He publicado una herramienta que debería solucionar este problema.
A primera vista, el problema parece simple, pero en realidad el comportamiento de tocar y hacer clic debe personalizarse bastante, incluidas las funciones de tiempo de espera y cosas como "qué sucede cuando se desplaza por una lista de vínculos" o "qué sucede cuando presiona el vínculo y luego alejar el mouse / dedo del área activa "
Esto debería resolverlo todo a la vez: https://www.npmjs.com/package/active-touch
Deberá tener sus: estilos activos asignados a la clase .active o elegir su propio nombre de clase. De forma predeterminada, el script funcionará con todos los elementos del enlace, pero puede sobrescribirlo con su propia matriz de selectores.
¡Comentarios y contribuciones honestas y útiles muy apreciadas!
fuente
Para aquellos que no quieran usar ontouchstart, pueden usar este código
fuente
Probé esta respuesta y sus variantes, pero ninguna parecía funcionar de manera confiable (y no me gusta confiar en la 'magia' para cosas como esta). Así que hice lo siguiente en su lugar, que funciona perfectamente en todas las plataformas, no solo en Apple:
:active
hacerlo.active
.Hizo una lista de todos los elementos afectados y se agregaron
pointerdown/mousedown/touchstart
controladores de eventos para aplicar la.active
clase y lospointerup/mouseup/touchend
controladores de eventos para eliminarlos. Usando jQuery:Esto fue un poco tedioso, pero ahora tengo una solución que es menos vulnerable a la rotura entre las versiones del sistema operativo Apple. (¿Y quién necesita algo como esto para romper?)
fuente
Una solución es confiar en en
:target
lugar de:active
:El estilo se activará cuando la URL actual apunte al ancla, que es sólida incluso en dispositivos móviles. El inconveniente es que necesita otro enlace para borrar el ancla en la URL. Ejemplo completo:
fuente
No está 100% relacionado con esta pregunta, pero también puede usar css sibling hack para lograr esto
HTML
SCSS
Si desea utilizar información sobre herramientas html / css pura
fuente
fuente