Comme d'autres réponses l'ont indiqué, iOS Safari ne déclenche pas la :active
pseudo-classe à moins qu'un événement tactile ne soit attaché à l'élément, mais jusqu'à présent, ce comportement a été "magique". Je suis tombé sur ce petit texte de présentation de la bibliothèque des développeurs Safari qui l'explique (c'est moi qui souligne):
Vous pouvez également utiliser la -webkit-tap-highlight-color
propriété CSS en combinaison avec la définition d'un événement tactile pour configurer les boutons afin qu'ils se comportent de la même manière que le bureau. Sur iOS, les événements de souris sont envoyés si rapidement que l'état actif ou actif n'est jamais reçu. Par conséquent, le :active
pseudo état est déclenché uniquement lorsqu'un événement tactile est défini sur l'élément HTML, par exemple lorsque ontouchstart est défini sur l'élément comme suit:
<button class="action" ontouchstart=""
style="-webkit-tap-highlight-color: rgba(0,0,0,0);">
Testing Touch on iOS
</button>
Désormais, lorsque le bouton est appuyé et maintenu sur iOS, le bouton prend la couleur spécifiée sans que la couleur grise transparente environnante n'apparaisse.
En d'autres termes, définir un ontouchstart
événement (même s'il est vide) indique explicitement au navigateur de réagir aux événements tactiles.
À mon avis, c'est un comportement imparfait, et remonte probablement à l'époque où le Web «mobile» était pratiquement inexistant (jetez un œil à ces captures d'écran sur la page liée pour voir ce que je veux dire), et tout était orienté souris. Il est intéressant de noter que d'autres navigateurs mobiles plus récents, comme sur Android, affichent très bien le pseudo-état `: actif 'au toucher, sans aucun piratage comme ce qui est nécessaire pour iOS.
(Remarque: si vous souhaitez utiliser vos propres styles personnalisés sur iOS, vous pouvez également désactiver la boîte translucide grise par défaut qu'iOS utilise à la place du :active
pseudo-état en utilisant la -webkit-tap-highlight-color
propriété CSS, comme expliqué dans la même page liée ci-dessus .)
Après quelques expérimentations, la solution attendue consistant à définir un ontouchstart
événement sur l' <body>
élément vers lequel tous les événements tactiles se retrouvent ensuite ne fonctionne pas pleinement. Si l'élément est visible dans la fenêtre lorsque la page se charge, cela fonctionne bien, mais faire défiler vers le bas et appuyer sur un élément qui était hors de la fenêtre ne déclenche pas le :active
pseudo-état comme il se doit. Donc, au lieu de
<!DOCTYPE html>
<html><body ontouchstart></body></html>
attachez l'événement à tous les éléments au lieu de vous fier à l'événement remontant au corps (en utilisant jQuery):
$('body *').on('touchstart', function (){});
Cependant, je ne suis pas conscient de ses implications sur les performances, alors méfiez-vous.
EDIT: Il y a un sérieux défaut avec cette solution: même toucher un élément en faisant défiler la page activera le :active
pseudo état. La sensibilité est trop forte. Android résout ce problème en introduisant un très petit délai avant l'affichage de l'état, qui est annulé si la page défile. À la lumière de cela, je suggère de ne l'utiliser que sur certains éléments. Dans mon cas, je développe une application Web à utiliser sur le terrain, qui consiste essentiellement en une liste de boutons pour parcourir les pages et soumettre des actions. Parce que la page entière est à peu près des boutons dans certains cas, cela ne fonctionnera pas pour moi. Vous pouvez cependant définir le :hover
pseudo-état à remplir pour cela à la place. Après avoir désactivé la boîte grise par défaut, cela fonctionne parfaitement.
ontouchstart
sans le=""
? (HTML5)