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):
También puede usar la -webkit-tap-highlight-color
propiedad CSS en combinación con la configuración de un evento táctil para configurar los botones para que se comporten de manera similar al escritorio. En iOS, los eventos del mouse se envían tan rápido que nunca se recibe el estado inactivo o activo. Por lo tanto, el :active
pseudoestado se activa solo cuando hay un evento táctil establecido en el elemento HTML, por ejemplo, cuando ontouchstart está configurado en el elemento de la siguiente manera:
<button class="action" ontouchstart=""
style="-webkit-tap-highlight-color: rgba(0,0,0,0);">
Testing Touch on iOS
</button>
Ahora, cuando se toca y se mantiene presionado el botón en iOS, el botón cambia al color especificado sin que aparezca el color gris transparente circundante.
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 de
<!DOCTYPE html>
<html><body ontouchstart></body></html>
adjunte el evento a todos los elementos en lugar de confiar en el evento que se propaga al cuerpo (usando jQuery):
$('body *').on('touchstart', function (){});
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.
ontouchstart
sin el=""
? (HTML5)