W Webkit na iPhonie / iPadzie / iPodzie określenie stylu dla pseudoklasy: active dla <a>
tagu nie jest wyzwalane po dotknięciu elementu. Jak mogę to spowodować? Przykładowy kod:
<style>
a:active {
background-color: red;
}
</style>
<!-- snip -->
<a href="#">Click me</a>
iphone
css
webkit
mobile-safari
pseudo-class
Jesse Rusak
źródło
źródło
ontouchstart
bez=""
? (HTML5)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):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 zamiastdołącz zdarzenie do wszystkich elementów zamiast polegać na zdarzeniu bulgotanym do ciała (używając jQuery):
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.źródło
Dodaj procedurę obsługi zdarzeń dla ontouchstart w tagu <a>. To powoduje, że CSS magicznie działa.
źródło
To działa dla mnie:
Uwaga: jeśli wykonasz tę sztuczkę, warto również usunąć domyślny kolor dotknięcia i podświetlenia, który stosuje Mobile Safari, używając następującej reguły CSS.
źródło
Od 8 grudnia 2016 r. Zaakceptowana odpowiedź (
<body ontouchstart="">...</body>
) nie działa dla mnie na Safari 10 (iPhone 5s): Ten hack działa tylko w przypadku tych elementów, które były widoczne podczas ładowania strony.Jednak dodając:
do
head
nie działa tak, jak chcesz, z drugiej jednak strony, że teraz wszystkie zdarzenia dotykowe podczas przewijania również wywołać:active
pseudo-stan na dotykanych elementów. (Jeśli jest to dla Ciebie problem, możesz rozważyć obejście rozwiązania FighterJet:hover
).źródło
To działa dla mnie, dodaj do swojego CSS na elemencie, który chcesz wyróżnić
źródło
Czy używasz wszystkich pseudoklas, czy tylko jednej? Jeśli używasz co najmniej dwóch, upewnij się, że są we właściwej kolejności lub wszystkie się zepsują:
..w tej kolejności. Ponadto, jeśli używasz tylko: active, dodaj: link, nawet jeśli go nie stylizujesz.
źródło
Opublikowałem narzędzie, które powinno rozwiązać ten problem za Ciebie.
Z pozoru problem wygląda na prosty, ale w rzeczywistości zachowanie dotknięcia i kliknięcia wymaga dość szerokiego dostosowania, w tym funkcji limitu czasu i rzeczy typu „co się dzieje, gdy przewijasz listę linków” lub „co się dzieje, gdy klikasz link, a następnie odsuń mysz / palec od obszaru aktywnego "
To powinno rozwiązać wszystko naraz: https://www.npmjs.com/package/active-touch
Musisz albo przypisać swoje: active style do klasy .active, albo wybrać własną nazwę klasy. Domyślnie skrypt będzie działał ze wszystkimi elementami linków, ale możesz nadpisać go własną tablicą selektorów.
Szczere, pomocne opinie i wkłady bardzo doceniane!
źródło
Dla tych, którzy nie chcą korzystać z ontouchstart, możesz użyć tego kodu
źródło
Wypróbowałem tę odpowiedź i jej warianty, ale żadna nie wydawała się działać niezawodnie (i nie lubię polegać na „magii” w takich sprawach). Więc zamiast tego wykonałem następujące czynności, które działają doskonale na wszystkich platformach, nie tylko na Apple:
:active
do.active
.Utworzono listę wszystkich elementów, których to dotyczy, i dodano
pointerdown/mousedown/touchstart
programy obsługi zdarzeń, aby zastosować.active
klasę ipointerup/mouseup/touchend
programy obsługi zdarzeń, aby je usunąć. Korzystanie z jQuery:To było trochę uciążliwe, ale teraz mam rozwiązanie, które jest mniej podatne na awarie między wersjami Apple OS. (A kto potrzebuje czegoś takiego zerwania?)
źródło
Rozwiązaniem jest poleganie
:target
zamiast:active
:Styl zostanie wywołany, gdy zakotwiczenie zostanie skierowane przez aktualny adres URL, który działa nawet na urządzeniach mobilnych. Wadą jest to, że potrzebujesz innego linku, aby wyczyścić kotwicę w adresie URL. Kompletny przykład:
źródło
Nie ma 100% związku z tym pytaniem, ale możesz też użyć hacka rodzeństwa CSS, aby to osiągnąć
HTML
SCSS
Jeśli chcesz używać czystej podpowiedzi html / css
źródło
źródło