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):
Sie können die -webkit-tap-highlight-color
CSS-Eigenschaft auch in Kombination mit dem Festlegen eines Berührungsereignisses verwenden, um Schaltflächen so zu konfigurieren, dass sie sich ähnlich wie der Desktop verhalten. Unter iOS werden Mausereignisse so schnell gesendet, dass der Status "Aus" oder "Aktiv" nie empfangen wird. Daher wird der :active
Pseudo-Status nur ausgelöst, wenn für das HTML-Element ein Berührungsereignis festgelegt ist, z. B. wenn für das Element ontouchstart wie folgt festgelegt ist:
<button class="action" ontouchstart=""
style="-webkit-tap-highlight-color: rgba(0,0,0,0);">
Testing Touch on iOS
</button>
Wenn die Schaltfläche unter iOS getippt und gehalten wird, ändert sich die Schaltfläche in die angegebene Farbe, ohne dass die umgebende transparente graue Farbe angezeigt wird.
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 statt
<!DOCTYPE html>
<html><body ontouchstart></body></html>
Hängen Sie das Ereignis an alle Elemente an, anstatt sich darauf zu verlassen, dass das Ereignis in den Körper sprudelt (mithilfe von jQuery):
$('body *').on('touchstart', function (){});
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.
ontouchstart
ohne das hinzuzufügen=""
? (HTML5)