Jak inni odpowiedzi, iOS Safari nie wywoła :active
pesudo klasy, chyba że wydarzenie dotykowe jest dołączone do elementu, ale jak dotąd to zachowanie było "magiczne". Natknąłem się na tej małej notki na Safari Developer Library to wszystko wyjaśnia (Kopalnia nacisk):
Można również użyć właściwości -webkit-tap-highlight-color
CSS w połączeniu z ustawieniem dotykowy zdarzenie skonfigurowanie przycisków, aby zachowywać się podobnie do pulpitu. W systemie iOS zdarzenia myszy są wysyłane tak szybko, że nigdy nie są odbierane ani aktywne, ani nieaktywne. W związku z tym pseudo stan :active
jest wyzwalany tylko wtedy, gdy nie jest dotykowy zdarzenie ustawiony na element na przykład HTML, gdy ontouchstart jest ustawiony na elemencie następująco:
<button class="action" ontouchstart=""
style="-webkit-tap-highlight-color: rgba(0,0,0,0);">
Testing Touch on iOS
</button>
Teraz, gdy przycisk jest na podsłuchu i przytrzymał w systemie iOS przycisk zmienia się na określony kolor bez otaczającego go przezroczystego szarego koloru.
Innymi słowy, ustawienie ontouchstart
wydarzenie (nawet jeśli jest pusty) wyraźnie mówi przeglądarkę reagować na dotyk wydarzenia.
Uważam, że jest to nieprawidłowe zachowanie i prawdopodobnie pochodzi z czasów, gdy "mobilna" sieć praktycznie nie istniała (spójrz na zrzuty ekranu na połączonej stronie, aby zobaczyć, co mam na myśli), i wszystko było zorientowana na mysz. Warto zauważyć, że inne, nowsze przeglądarki mobilne, takie jak Android, wyświetlają pseudo-stan `` active '' po dotknięciu, bez żadnych hacków takich jak to, co jest potrzebne dla iOS.
(Side-uwaga: Jeśli chcesz użyć własnych stylów niestandardowych na iOS, można również wyłączyć półprzezroczyste okno domyślne szarą że iOS wykorzystuje zamiast pseudo-państwa :active
za pomocą właściwości -webkit-tap-highlight-color
CSS, jak wyjaśniono na tej samej linkowanej stronie powyżej.)
Po kilku eksperymentach, oczekiwane rozwiązanie ustawiania zdarzenie ontouchstart
na elemencie <body>
że wszystkie zdarzenia dotykowe następnie bańka na nie w pełni działać. Jeśli element jest widoczny w oknie roboczym podczas ładowania strony, to działa poprawnie, ale przewijanie w dół i stuknięcie elementu znajdującego się poza obszarem wyświetlania powoduje, że pseudo-stan :active
uruchamia się tak, jak powinien. Tak więc, zamiast
<!DOCTYPE html>
<html><body ontouchstart></body></html>
dołączyć zdarzenie do wszystkich elementów, zamiast opierania się na zdarzenie propagacji do ciała (przy użyciu jQuery):
$('body *').on('touchstart', function(){});
Jednak nie jestem świadomy wpływ na wydajność tego, więc uważaj.
Edycja: nie jest poważną wadą tego rozwiązania: dotykając element podczas przewijania strony uruchamia pseudo stanu :active
. Czułość jest zbyt silna. Android rozwiązuje ten problem, wprowadzając bardzo małe opóźnienie, zanim pojawi się stan, który zostanie anulowany, jeśli strona zostanie przewinięta. W związku z tym sugeruję użycie 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 stron i przesyłania działań. Ponieważ w niektórych przypadkach cała strona to przyciski, to nie będzie dla mnie działać. Możesz jednak ustawić pseudo-stan na :hover
, aby go wypełnić. Po wyłączeniu domyślnego szarego okna działa to idealnie.
Czy nie wystarczy dodać 'ontouchstart' bez' = "" '? (HTML5) – feklee
Każdy pomysł, jak to działa w ten sposób? – agaase
Dla przyszłych czytelników opublikowaliśmy tutaj wersję demo: [http://jsbin.com/EjiWILe/3/](http://jsbin.com/EjiWILe/3/). Sprawdź funkcjonalność urządzenia z systemem iOS. – mhulse