Utworzyłem karuzelę z zawsze widocznymi przyciskami poprzedni i następny. Te przyciski mają stan najechania, zmieniają kolor na niebieski. Na urządzeniach dotykowych, takich jak iPad, stan najechania kursorem jest lepki, więc przycisk pozostaje niebieski po dotknięciu. Nie chcę tego.
Mógłbym dodać
no-hover
klasęontouchend
dla każdego przycisku i zrobić mój CSS w ten sposób:button:not(.no-hover):hover { background-color: blue; }
ale prawdopodobnie jest to dość złe dla wydajności i nie obsługuje poprawnie urządzeń takich jak Chromebook Pixel (który ma zarówno ekran dotykowy, jak i mysz).Mógłbym dodać
touch
klasę dodocumentElement
i zrobić mój CSS w ten sposób:html:not(.touch) button:hover { background-color: blue; }
Ale to też nie działa dobrze na urządzeniach z dotykiem i myszą.
Wolałbym usunąć stan najechania ontouchend
. Ale wydaje się, że nie jest to możliwe. Skupienie na innym elemencie nie usuwa stanu najechania. Ręczne dotknięcie innego elementu działa, ale nie wydaje się, żebym to wywołał w JavaScript.
Wszystkie znalezione przeze mnie rozwiązania wydają się niedoskonałe. Czy istnieje idealne rozwiązanie?
źródło
Po zaimplementowaniu CSS Media Queries Level 4 będziesz mógł to zrobić:
Lub po angielsku: „Jeśli przeglądarka obsługuje prawidłowe / prawdziwe / rzeczywiste / nieemulowane najechanie kursorem (np. Ma podstawowe urządzenie wejściowe przypominające mysz), zastosuj ten styl po najechaniu kursorem na
button
s.”Ponieważ ta część Media Queries Level 4 została do tej pory zaimplementowana tylko w najnowszej wersji Chrome, napisałem polyfill, aby sobie z tym poradzić. Używając go, możesz przekształcić powyższy futurystyczny CSS w:
(Odmiana tej
.no-touch
techniki) Następnie używając JavaScript po stronie klienta z tego samego polyfillu, który wykrywa obsługę zawisu, możesz odpowiednio przełączyć obecnośćmy-true-hover
klasy:źródło
To częsty problem bez idealnego rozwiązania. Zachowanie najechania kursorem jest przydatne w przypadku myszy i najczęściej szkodliwe w przypadku dotyku. Dodatkowym problemem są urządzenia obsługujące dotyk i mysz (jednocześnie, nie mniej!), Takie jak Chromebook Pixel i Surface.
Najczystszym rozwiązaniem, jakie znalazłem, jest włączenie zachowania najechania kursorem tylko wtedy, gdy urządzenie nie obsługuje wprowadzania dotykowego.
To prawda, tracisz najechanie na urządzeniach, które mogą go obsługiwać. Czasami jednak najechanie kursorem ma większy wpływ niż sam link, np. Być może chcesz wyświetlić menu po najechaniu kursorem na element. Takie podejście pozwala przetestować istnienie dotyku i być może warunkowo dołączyć inne zdarzenie.
Przetestowałem to na iPhonie, iPadzie, Chromebooku Pixel, Surface i różnych urządzeniach z Androidem. Nie mogę zagwarantować, że zadziała, gdy do miksu zostanie dodane standardowe wejście dotykowe USB (takie jak rysik).
źródło
Dzięki Modernizr możesz kierować najechania specjalnie dla urządzeń bezdotykowych:
(Uwaga: to nie działa w systemie fragmentów StackOverflow, zamiast tego sprawdź jsfiddle )
Pamiętaj, że
:active
nie musi być celem kierowania,.no-touch
ponieważ działa zgodnie z oczekiwaniami zarówno na urządzeniach mobilnych, jak i na komputerach stacjonarnych.źródło
.no-touch
jest obecny nahtml
tagu. W przeciwnym razie ta odpowiedź otrzyma moją pieczęć aprobaty.źródło
Od 4 sposoby radzenia sobie z lepkiej najechaniu na mobile : Oto sposób dynamicznie dodać lub usunąć „
can touch
” klasy do dokumentu w oparciu o bieżący typ wejściowego użytkownika. Działa również z urządzeniami hybrydowymi, w których użytkownik może przełączać się między dotykiem a myszą / gładzikiem:źródło
Możesz zastąpić efekt najechania na urządzenia, które nie obsługują wskaźnika. Lubić:
Przetestowane i zweryfikowane na iOS 12
Wskazówka na temat https://stackoverflow.com/a/50285058/178959, aby to wskazać.
źródło
Miałem zamieścić własne rozwiązanie, ale sprawdzając, czy ktoś już je opublikował, stwierdziłem, że @Rodney prawie to zrobił. Jednak brakowało mu tego ostatniego kluczowego elementu, który sprawił, że było to niesmaczne, przynajmniej w moim przypadku. To znaczy, ja też wziąłem ten sam
.fakeHover
dodatek klasa / usuwania pośrednictwemmouseenter
imouseleave
zdarzeń detekcji, ale że sam, per se , działa niemal identycznie jak „prawdziwy”:hover
. Mam na myśli: kiedy stukasz w element w swojej tabeli, nie wykryje on, że go „opuściłeś” - zachowując w ten sposób stan „fałszywego”.To, co zrobiłem, to po prostu nasłuchiwać
click
, więc kiedy „dotykam” przycisku, ręcznie uruchamiam plikmouseleave
.To jest mój ostateczny kod:
W ten sposób zachowujesz swoją zwykłą
hover
funkcjonalność podczas używania myszy po prostu „najeżdżając” na przyciski. Cóż, prawie wszystko: jedyną wadą jest to, że po kliknięciu myszką na przycisk nie będzie whover
stanie. Podobnie jak w przypadku kliknięcia i szybkiego usunięcia wskaźnika z przycisku. Ale w moim przypadku mogę z tym żyć.źródło
Oto, co wymyśliłem do tej pory po przestudiowaniu pozostałych odpowiedzi. Powinien być w stanie obsługiwać tylko użytkowników dotykowych, tylko myszy lub hybrydowych.
Utwórz osobną klasę najechania dla efektu najechania. Domyślnie dodaj tę klasę hover do naszego przycisku.
Nie chcemy wykrywać obecności obsługi dotyku i wyłączać od samego początku wszystkie efekty najechania kursorem. Jak wspominali inni, urządzenia hybrydowe zyskują na popularności; ludzie mogą mieć obsługę dotykową, ale chcą używać myszy i odwrotnie. Dlatego należy usuwać klasę aktywowania tylko wtedy, gdy użytkownik faktycznie dotknie przycisku.
Następnym problemem jest to, co jeśli użytkownik chce wrócić do korzystania z myszy po dotknięciu przycisku? Aby rozwiązać ten problem, musimy znaleźć odpowiedni moment, aby z powrotem dodać klasę dymienia, którą usunęliśmy.
Nie możemy jednak dodać go z powrotem natychmiast po jego usunięciu, ponieważ stan najechania jest nadal aktywny. Możemy też nie chcieć zniszczyć i odtworzyć całego przycisku.
Pomyślałem więc o użyciu algorytmu zajętości (za pomocą setInterval) do sprawdzenia stanu aktywowania. Po dezaktywacji stanu najechania możemy ponownie dodać klasę najechania i zatrzymać oczekiwanie zajętości, przywracając nas z powrotem do pierwotnego stanu, w którym użytkownik może używać myszy lub dotyku.
Wiem, że zajęty czekanie nie jest takie wspaniałe, ale nie jestem pewien, czy jest odpowiednie wydarzenie. Rozważałem dodanie go z powrotem podczas imprezy mouseleave, ale nie był on zbyt mocny. Na przykład, gdy alert pojawia się po naciśnięciu przycisku, pozycja myszy zmienia się, ale zdarzenie mouseleave nie jest wyzwalane.
Edycja: Innym podejściem, które próbowałem, jest wywołanie
e.preventDefault()
w ramach ontouchstart lub ontouchend. Wydaje się, że zatrzymuje efekt najechania po dotknięciu przycisku, ale także zatrzymuje animację kliknięcia przycisku i zapobiega wywoływaniu funkcji onclick po dotknięciu przycisku, więc musisz wywoływać je ręcznie w obsłudze ontouchstart lub ontouchend. Niezbyt czyste rozwiązanie.źródło
To było dla mnie pomocne: link
źródło
Dodaj ten kod JS do swojej strony:
teraz w twoim CSS przed każdym najechaniem dodaj klasę hover w ten sposób:
Jeśli urządzenie jest dotykane, klasa ciała będzie pusta, w przeciwnym razie jego klasa zostanie najechana, a reguły zostaną zastosowane!
źródło
document.body.className = 'ontouchstart' in window ? '' : 'hover';
To jest właściwy punkt wyjścia. Następny krok: zastosuj / usuń klasę nohover na kolejnych zdarzeniach (demo z jQuery)
Uwaga: Jeśli chcesz zastosować inne klasy do elementu przycisku, polecenie: not (.nohover) w CSS nie będzie już działać zgodnie z oczekiwaniami. Zamiast tego musisz dodać oddzielną definicję z wartością domyślną i znacznikiem! Important, aby nadpisać styl najechania: .nohover {background-color: white! Important}
Powinno to nawet poprawnie obsługiwać urządzenia takie jak Chromebook Pixel (który ma zarówno ekran dotykowy, jak i mysz)! I nie sądzę, żeby to był wielki zabójca wydajności ...
źródło
Rozwiązanie, które się sprawdziło:
Dodaj ten kod do swojego arkusza stylów.
Chciałem pozbyć się szarego tła, które pojawia się na iOS Safari po kliknięciu łącza. Ale wydaje się, że robi więcej. Teraz kliknięcie przycisku (z
:hover
pseudoklasą!) Otwiera się od razu! Przetestowałem to tylko na iPadzie, nie wiem, czy zadziała na innych urządzeniach.źródło
Myślę, że znalazłem eleganckie (minimum js) rozwiązanie podobnego problemu:
Korzystając z jQuery, możesz wyzwolić najechanie na ciało (lub dowolny inny element), używając
.mouseover()
Więc po prostu dołączam this handler do
ontouchend
zdarzenia elementu w następujący sposób:To jednak usuwa tylko: najedź na pseudoklasę z elementu po wywołaniu jakiegoś innego zdarzenia dotykowego, takiego jak przesunięcie lub inny dotyk
źródło
Mam fajne rozwiązanie, którym chciałbym się podzielić. Najpierw musisz wykryć, czy użytkownik korzysta z telefonu komórkowego w następujący sposób:
Następnie po prostu dodaj:
A w CSS:
źródło
Przeszedłem przez podobny problem, moja aplikacja była kompatybilna ze wszystkimi rozmiarami ekranu, miała cholernie dużo efektów najechania kursorem na urządzeniach opartych na rozmiarze ekranu / myszy, a później zdałem sobie sprawę, że urządzenia dotykowe powodują stan znany jako lepki - najechanie kursorem i było to przeszkodą, aby aplikacja działała poprawnie dla użytkowników urządzeń dotykowych.
W naszej aplikacji korzystaliśmy z SCSS . i zdefiniowałem mixin, aby zająć się urządzeniem dotykowym.
a następnie umieściłem wszystkie moje klasy css pod poniższym fragmentem.
Na przykład mieliśmy klasę do animowania ikony, która wyzwalała się po najechaniu kursorem na ikonę, jak widać z css, ale na urządzeniu dotykowym wpływał na nią efekt lepkiego najechania kursorem, a następnie umieściłem go wewnątrz @ Uwzględnij hover-support () , aby upewnić się, że hover dotyczy tylko tych urządzeń, które obsługują hover.
źródło
Oto prosty kod JavaScript, który nie wymaga od programisty edycji CSS ani pisania nowych reguł CSS. Napisałem to dla przycisków Bootstrap z
class="btn"
, ale będzie działać z każdym przyciskiem, który ma określoną nazwę klasy.Kroki są następujące:
document.styleSheets
.btn
i:hover
Wyeliminowanie wszystkich
.btn :hover
reguł CSS gwarantuje, że na przycisku nie będzie wizualnego efektu najechania kursorem.Krok 1: Wykryj urządzenie dotykowe
Sprawdź zapytanie o media pod kątem obecności
(hover: none)
:Krok 2: Usuń reguły CSS zawierające „btn” i „: hover”
Kompletny kod znajduje się na GitHub i npm .
Demo na żywo na terrymorse.com .
źródło
@media (hover:none)
lub gdy użytkownik po raz pierwszy dotknie ekranu. Możesz to wypróbować na stronie demonstracyjnej na żywo, aby mieć pewność.Możesz ustawić kolor tła na
:active
stan i nadać:focus
niewyraźne tło.jeśli ustawisz kolor tła za pomocą
onfocus/ontouch
, styl koloru pozostanie po zniknięciu:focus
stanu.Potrzebujesz również zresetowania,
onblur
aby przywrócić defaut bg po utracie ostrości.źródło
To zadziałało dla mnie: umieść stylizację na hover w nowej klasie
Następnie dodaj / usuń klasę w razie potrzeby
Powtórz dla zdarzeń Touchstart i Touchstart. Lub jakiekolwiek zdarzenia, które lubisz, aby uzyskać pożądany rezultat, na przykład chciałem, aby efekt najechania był przełączany na ekranie dotykowym.
źródło
Na podstawie odpowiedzi Darrena Cooksa, która działa również, jeśli przesuniesz palcem po innym elemencie.
Zobacz Znajdź palec elementu jest włączony podczas zdarzenia dotknięcia
Codepen Demo
źródło
Możesz spróbować w ten sposób.
javascript:
css:
źródło
Do tej pory w moich projektach cofałem
:hover
zmiany na urządzeniach dotykowych:Wszystkie nazwy klas i nazwane kolory tylko w celach demonstracyjnych ;-)
źródło
Działa to idealnie w 2 krokach.
Ustaw swój tag body tak, aby był taki
<body ontouchstart="">
. Nie jestem fanem tego „hackowania”, ale pozwala on Safari na iOS natychmiast reagować na dotyk. Nie wiem jak, ale to działa.Skonfiguruj swoją dotykalną klasę w następujący sposób:
Możesz również chcieć usunąć jakąkolwiek animację z klasy, którą można dotykać. Android Chrome wydaje się być nieco wolniejszy niż iOS.
Spowoduje to również zastosowanie stanu aktywnego, jeśli użytkownik przewinie stronę, dotykając zajęć.
źródło
Niektóre z lepkich lub blokowanych
:hover
:focus
:active
problemów na urządzeniach mobilnych mogą być spowodowane brakiem,<meta name="viewport" content="width=device-width">
gdy przeglądarki próbują manipulować ekranem.źródło
Rozwiązaniem dla mnie po touchend było sklonowanie i zastąpienie węzła ... nienawidzę tego robić, ale nawet próba przemalowania elementu za pomocą offsetHeight nie działała
źródło
Można to osiągnąć poprzez zamianę klasy HTML. Powinien być mniej podatny na usterki niż usuwanie całego elementu, szczególnie w przypadku dużych, graficznych linków itp.
Możemy również zdecydować, czy chcemy, aby stany najechania były wyzwalane podczas przewijania za pomocą dotyku (touchmove), czy nawet dodać limit czasu, aby je opóźnić.
Jedyną znaczącą zmianą w naszym kodzie będzie użycie dodatkowej klasy HTML, takiej jak
<a class='hover'></a>
na elementach implementujących nowe zachowanie.HTML
CSS
JS (z jQuery)
Przykład
https://codepen.io/mattrcouk/pen/VweajZv
-
Nie mam jednak żadnego urządzenia z myszą i dotykiem, aby poprawnie je przetestować.
źródło