Jak stwierdziły inne odpowiedzi, iOS Safari nie wyzwala :active
pseudoklasy, chyba że zdarzenie dotykowe jest dołączone do elementu, ale jak dotąd to zachowanie było „magiczne”. Natknąłem się na tę małą notkę w bibliotece programistów Safari, która to wyjaśnia (moje wyróżnienie):
Możesz również użyć -webkit-tap-highlight-color
właściwości CSS w połączeniu z ustawieniem zdarzenia dotyku, aby skonfigurować przyciski tak, aby zachowywały się podobnie do pulpitu. W systemie iOS zdarzenia myszy są wysyłane tak szybko, że stan nieaktywny lub nieaktywny nigdy nie jest odbierany. Dlatego :active
pseudo stan jest wyzwalany tylko wtedy, gdy istnieje zdarzenie dotykowe ustawione w elemencie HTML - na przykład, gdy ontouchstart jest ustawiony na elemencie w następujący sposób:
<button class="action" ontouchstart=""
style="-webkit-tap-highlight-color: rgba(0,0,0,0);">
Testing Touch on iOS
</button>
Teraz po dotknięciu i przytrzymaniu przycisku w systemie iOS przycisk zmienia się na określony kolor bez pojawienia się otaczającego przezroczystego szarego koloru.
Innymi słowy, ustawienie ontouchstart
zdarzenia (nawet jeśli jest ono puste) wyraźnie mówi przeglądarce, aby reagowała na zdarzenia dotykowe.
Moim zdaniem jest to błędne zachowanie i prawdopodobnie sięga czasów, gdy „mobilna” sieć praktycznie nie istniała (spójrz na te zrzuty ekranu na połączonej stronie, aby zobaczyć, co mam na myśli), a wszystko było zorientowane na mysz. Warto zauważyć, że inne, nowsze przeglądarki mobilne, takie jak Android, wyświetlają `: active 'pseudo-stan po dotknięciu, bez żadnych hacków, takich jak to, co jest potrzebne w iOS.
(Uwaga boczna: jeśli chcesz używać własnych niestandardowych stylów na iOS, możesz również wyłączyć domyślne szare półprzezroczyste pole, którego system iOS używa zamiast :active
pseudo-stanu, używając -webkit-tap-highlight-color
właściwości CSS, jak wyjaśniono na tej samej połączonej stronie powyżej .)
Po pewnych eksperymentach oczekiwane rozwiązanie polegające na ustawieniu ontouchstart
zdarzenia na <body>
elemencie, do którego wszystkie zdarzenia dotykają się, nie działa w pełni. Jeśli element jest widoczny w rzutni podczas ładowania strony, to działa dobrze, ale przewijanie w dół i stukanie w element, który był poza rzutnią, nie wywołuje :active
pseudo-stanu, jak powinien. Więc zamiast
<!DOCTYPE html>
<html><body ontouchstart></body></html>
dołącz zdarzenie do wszystkich elementów zamiast polegać na zdarzeniu bulgotanym do ciała (używając jQuery):
$('body *').on('touchstart', function (){});
Nie jestem jednak świadomy konsekwencji tego dla wydajności, więc uważaj.
EDYCJA: Jest jedna poważna wada tego rozwiązania: nawet dotknięcie elementu podczas przewijania strony aktywuje :active
pseudo stan. Wrażliwość jest zbyt silna. Android rozwiązuje ten problem, wprowadzając bardzo małe opóźnienie przed wyświetleniem stanu, które jest anulowane, jeśli strona jest przewijana. W związku z tym proponuję używać tego tylko na wybranych elementach. W moim przypadku tworzę aplikację internetową do użytku w terenie, która jest w zasadzie listą przycisków do nawigacji po stronach i przesyłania działań. Ponieważ w niektórych przypadkach cała strona składa się z przycisków, to nie zadziała. Możesz jednak ustawić :hover
pseudo-stan, aby zamiast tego wypełniał. Po wyłączeniu domyślnego szarego pola działa to idealnie.
ontouchstart
bez=""
? (HTML5)