Dans Webkit sur iPhone / iPad / iPod, la spécification du style d'une pseudo-classe: active pour une <a>
balise ne se déclenche pas lorsque vous appuyez sur l'élément. Comment puis-je déclencher cela? Exemple de code:
<style>
a:active {
background-color: red;
}
</style>
<!-- snip -->
<a href="#">Click me</a>
iphone
css
webkit
mobile-safari
pseudo-class
Jesse Rusak
la source
la source
ontouchstart
sans le=""
? (HTML5)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):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 deattachez l'événement à tous les éléments au lieu de vous fier à l'événement remontant au corps (en utilisant jQuery):
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.la source
Ajoutez un gestionnaire d'événements pour ontouchstart dans votre balise <a>. Cela fait fonctionner le CSS comme par magie.
la source
Cela fonctionne pour moi:
Remarque: si vous faites cette astuce, il vaut également la peine de supprimer la couleur de mise en surbrillance par défaut que Mobile Safari applique en utilisant la règle CSS suivante.
la source
Depuis le 8 décembre 2016, la réponse acceptée (
<body ontouchstart="">...</body>
) ne fonctionne pas pour moi sur Safari 10 (iPhone 5s): ce hack ne fonctionne que pour les éléments qui étaient visibles au chargement de la page.Cependant, en ajoutant:
le
head
fonctionne comme je le souhaite, avec l'inconvénient que désormais tous les événements tactiles pendant le défilement déclenchent également le:active
pseudo-état sur les éléments touchés. (Si cela pose un problème pour vous, vous pouvez envisager de FighterJet:hover
solution contournement .)la source
Cela fonctionne pour moi, ajoutez à votre CSS sur l'élément que vous souhaitez mettre en évidence
la source
Utilisez-vous toutes les pseudo-classes ou une seule? Si vous en utilisez au moins deux, assurez-vous qu'ils sont dans le bon ordre ou qu'ils se cassent tous:
..dans cet ordre. De plus, si vous utilisez simplement: active, ajoutez un lien:, même si vous ne le stylisez pas.
la source
J'ai publié un outil qui devrait résoudre ce problème pour vous.
En apparence, le problème semble simple, mais en réalité, le comportement tactile et clic doit être personnalisé de manière assez approfondie, y compris les fonctions de délai d'expiration et des choses comme «ce qui se passe lorsque vous faites défiler une liste de liens» ou «ce qui se passe lorsque vous appuyez sur le lien, puis éloignez la souris / le doigt de la zone active "
Cela devrait tout résoudre en même temps: https://www.npmjs.com/package/active-touch
Vous devrez soit affecter vos styles: actifs à la classe .active, soit choisir votre propre nom de classe. Par défaut, le script fonctionnera avec tous les éléments de lien, mais vous pouvez l'écraser avec votre propre tableau de sélecteurs.
Commentaires et contributions honnêtes et utiles très appréciés!
la source
Pour ceux qui ne souhaitent pas utiliser ontouchstart, vous pouvez utiliser ce code
la source
J'ai essayé cette réponse et ses variantes, mais aucune ne semblait fonctionner de manière fiable (et je n'aime pas me fier à la «magie» pour des choses comme celle-ci). J'ai donc fait ce qui suit à la place, qui fonctionne parfaitement sur toutes les plates-formes, pas seulement Apple:
:active
pour.active
.Création d'une liste de tous les éléments affectés et ajout de
pointerdown/mousedown/touchstart
gestionnaires d'événements pour appliquer la.active
classe et lespointerup/mouseup/touchend
gestionnaires d'événements pour le supprimer. Utilisation de jQuery:C'était un peu fastidieux, mais maintenant j'ai une solution qui est moins vulnérable à la casse entre les versions d'Apple OS. (Et qui a besoin de quelque chose comme cette rupture?)
la source
Une solution consiste à s'appuyer sur
:target
au lieu de:active
:Le style sera déclenché lorsque l'ancre est ciblée par l'url actuelle, qui est robuste même sur mobile. L'inconvénient est que vous avez besoin d'un autre lien pour effacer l'ancre dans l'url. Exemple complet:
la source
Pas de 100% lié à cette question, mais vous pouvez également utiliser le hack des frères et sœurs css pour y parvenir
HTML
SCSS
Si vous souhaitez utiliser une info-bulle html / css pure
la source
la source