In Webkit auf iPhone / iPad / iPod wird das Festlegen des Stils für eine: aktive Pseudoklasse für ein <a>
Tag nicht ausgelöst, wenn Sie auf das Element tippen. Wie kann ich das auslösen? Beispielcode:
<style>
a:active {
background-color: red;
}
</style>
<!-- snip -->
<a href="#">Click me</a>
iphone
css
webkit
mobile-safari
pseudo-class
Jesse Rusak
quelle
quelle
ontouchstart
ohne das hinzuzufügen=""
? (HTML5)Wie in anderen Antworten angegeben, löst iOS Safari die Pseudoklasse nur aus,
:active
wenn dem Element ein Berührungsereignis zugeordnet ist. Bisher war dieses Verhalten jedoch "magisch". Ich bin auf diesen kleinen Klappentext in der Safari Developer Library gestoßen , der ihn erklärt (Hervorhebung von mir):Mit anderen Worten, das Festlegen eines
ontouchstart
Ereignisses (auch wenn es leer ist) weist den Browser explizit an, auf Berührungsereignisse zu reagieren.Meiner Meinung nach handelt es sich hierbei um ein fehlerhaftes Verhalten, das wahrscheinlich auf die Zeit zurückgeht, als das "mobile" Web im Grunde nicht existierte (sehen Sie sich diese Screenshots auf der verlinkten Seite an, um zu sehen, was ich meine), und alles war mausorientiert. Es ist interessant festzustellen, dass andere, neuere mobile Browser, wie z. B. Android, den Pseudo-Status ": active" bei Berührung problemlos anzeigen, ohne Hacks, wie sie für iOS erforderlich sind.
(Randnotiz: Wenn Sie unter iOS Ihre eigenen benutzerdefinierten Stile verwenden möchten, können Sie auch das standardmäßige graue durchscheinende Feld deaktivieren, das iOS anstelle des
:active
Pseudostatus verwendet, indem Sie die-webkit-tap-highlight-color
CSS-Eigenschaft verwenden, wie auf derselben verknüpften Seite oben erläutert .)Nach einigen Experimenten funktioniert die erwartete Lösung, ein
ontouchstart
Ereignis für das<body>
Element festzulegen, zu dem alle Berührungsereignisse sprudeln, nicht vollständig. Ist das Element im Ansichtsfenster sichtbar , wenn die Seite geladen wird , dann funktioniert es in Ordnung, aber nach unten scrollen und tippe ein Element , das in der Ansicht war aus nicht nicht löst den:active
Pseudostaat wie es sollte. Also stattHängen Sie das Ereignis an alle Elemente an, anstatt sich darauf zu verlassen, dass das Ereignis in den Körper sprudelt (mithilfe von jQuery):
Ich bin mir jedoch der Auswirkungen auf die Leistung nicht bewusst, seien Sie also vorsichtig.
BEARBEITEN: Diese Lösung weist einen schwerwiegenden Fehler auf: Selbst das Berühren eines Elements beim Scrollen der Seite aktiviert den
:active
Pseudo-Status. Die Empfindlichkeit ist zu stark. Android löst dieses Problem, indem es eine sehr kleine Verzögerung einführt, bevor der Status angezeigt wird. Diese wird abgebrochen, wenn die Seite gescrollt wird. In Anbetracht dessen empfehle ich, dies nur für ausgewählte Elemente zu verwenden. In meinem Fall entwickle ich eine Web-App für den Einsatz vor Ort, bei der es sich im Grunde um eine Liste von Schaltflächen handelt, mit denen Sie durch Seiten navigieren und Aktionen senden können. Da die gesamte Seite in einigen Fällen so ziemlich Schaltflächen enthält, funktioniert dies bei mir nicht. Sie können jedoch:hover
stattdessen den Pseudo-Status festlegen, der ausgefüllt werden soll. Nach dem Deaktivieren der grauen Standardbox funktioniert dies einwandfrei.quelle
Fügen Sie Ihrem <a> -Tag einen Ereignishandler für ontouchstart hinzu. Dies bewirkt, dass das CSS auf magische Weise funktioniert.
quelle
Das funktioniert bei mir:
Hinweis: Wenn Sie diesen Trick ausführen, sollten Sie auch die Standardfarbe entfernen, die Mobile Safari mithilfe der folgenden CSS-Regel anzeigt.
quelle
Ab dem 8. Dezember 2016
<body ontouchstart="">...</body>
funktioniert die akzeptierte Antwort ( ) auf Safari 10 (iPhone 5s) nicht mehr für mich: Dieser Hack funktioniert nur für die Elemente, die beim Laden der Seite sichtbar waren.Hinzufügen von:
Das
head
funktioniert so, wie ich es möchte, mit dem Nachteil, dass jetzt alle Berührungsereignisse während des Bildlaufs auch den:active
Pseudozustand der berührten Elemente auslösen . (Wenn dies ein Problem für Sie ist, können Sie die Problemumgehung von FighterJet in Betracht ziehen:hover
.)quelle
Dies funktioniert bei mir. Fügen Sie Ihrem CSS das Element hinzu, das Sie hervorheben möchten
quelle
Verwenden Sie alle Pseudoklassen oder nur die eine? Wenn Sie mindestens zwei verwenden, stellen Sie sicher, dass sie in der richtigen Reihenfolge sind oder alle kaputt gehen:
..in dieser Reihenfolge. Wenn Sie nur: active verwenden, fügen Sie einen: link hinzu, auch wenn Sie ihn nicht stylen.
quelle
Ich habe ein Tool veröffentlicht, das dieses Problem für Sie lösen soll.
Oberflächlich betrachtet sieht das Problem einfach aus, aber in Wirklichkeit muss das Touch & Click-Verhalten ziemlich umfassend angepasst werden, einschließlich Timeout-Funktionen und Dingen wie "Was passiert, wenn Sie durch eine Liste von Links scrollen" oder "Was passiert, wenn Sie auf Link klicken und dann" Maus / Finger vom aktiven Bereich entfernen "
Dies sollte alles auf einmal lösen: https://www.npmjs.com/package/active-touch
Sie müssen entweder Ihre: aktiven Stile der .active-Klasse zuweisen oder Ihren eigenen Klassennamen auswählen. Standardmäßig funktioniert das Skript mit allen Linkelementen, Sie können es jedoch mit Ihrem eigenen Array von Selektoren überschreiben.
Ehrliches, hilfreiches Feedback und Beiträge sehr geschätzt!
quelle
Für diejenigen, die den ontouchstart nicht verwenden möchten, können Sie diesen Code verwenden
quelle
Ich habe diese Antwort und ihre Varianten ausprobiert , aber keine schien zuverlässig zu funktionieren (und ich mag es nicht, mich bei solchen Dingen auf "Magie" zu verlassen). Also habe ich stattdessen Folgendes gemacht, das auf allen Plattformen perfekt funktioniert, nicht nur auf Apple:
:active
zu.active
.Erstellte eine Liste aller betroffenen Elemente und fügte
pointerdown/mousedown/touchstart
Ereignishandler hinzu , um die.active
Klassen- undpointerup/mouseup/touchend
Ereignishandler anzuwenden , um sie zu entfernen. Verwenden von jQuery:Das war ein bisschen langweilig, aber jetzt habe ich eine Lösung, die weniger anfällig für Brüche zwischen Apple OS-Versionen ist. (Und wer braucht so etwas zu brechen?)
quelle
Eine Lösung besteht darin, sich auf
:target
Folgendes zu verlassen:active
:Der Stil wird ausgelöst, wenn der Anker von der aktuellen URL als Ziel ausgewählt wird, die auch auf Mobilgeräten robust ist. Der Nachteil ist, dass Sie einen anderen Link benötigen, um den Anker in der URL zu löschen. Vollständiges Beispiel:
quelle
Keine 100% im Zusammenhang mit dieser Frage, aber Sie können CSS-Geschwister-Hack verwenden, um dies ebenfalls zu erreichen
HTML
SCSS
Wenn Sie einen reinen HTML / CSS-Tooltip verwenden möchten
quelle
quelle