Ich habe ein Karussell mit einer vorherigen und einer nächsten Schaltfläche erstellt, die immer sichtbar sind. Diese Schaltflächen haben einen Schwebezustand und werden blau. Auf Touch-Geräten wie dem iPad bleibt der Schwebezustand bestehen, sodass die Taste nach dem Tippen blau bleibt. Das will ich nicht
Ich könnte für jede Schaltfläche eine
no-hover
Klasse hinzufügenontouchend
und mein CSS so gestalten:button:not(.no-hover):hover { background-color: blue; }
Aber das ist wahrscheinlich ziemlich schlecht für die Leistung und behandelt Geräte wie das Chromebook Pixel (das sowohl einen Touchscreen als auch eine Maus hat) nicht richtig.Ich könnte dem eine
touch
Klasse hinzufügendocumentElement
und mein CSS so gestalten:html:not(.touch) button:hover { background-color: blue; }
Aber das funktioniert auch nicht auf Geräten mit Touch und Maus.
Was ich bevorzugen würde, ist das Entfernen des Schwebezustands ontouchend
. Aber das scheint nicht möglich zu sein. Durch das Fokussieren eines anderen Elements wird der Schwebezustand nicht entfernt. Das manuelle Tippen auf ein anderes Element funktioniert, aber ich kann das in JavaScript nicht auslösen.
Alle Lösungen, die ich gefunden habe, scheinen unvollkommen zu sein. Gibt es eine perfekte Lösung?
quelle
Sobald CSS Media Queries Level 4 implementiert ist, können Sie Folgendes tun:
Oder auf Englisch: "Wenn der Browser das richtige / wahre / echte / nicht emulierte Schweben unterstützt (z. B. ein mausähnliches primäres Eingabegerät), wenden Sie diesen Stil an, wenn Sie den Mauszeiger
button
darüber halten."Da dieser Teil von Media Queries Level 4 bisher nur in Chrome auf dem neuesten Stand der Technik implementiert wurde, habe ich eine Polyfüllung geschrieben , um dies zu beheben . Mit ihm können Sie das oben genannte futuristische CSS in Folgendes umwandeln:
(Eine Variation der
.no-touch
Technik) Wenn Sie dann clientseitiges JavaScript aus derselben Polyfüllung verwenden, die die Unterstützung für das Schweben erkennt, können Sie das Vorhandensein dermy-true-hover
Klasse entsprechend umschalten :quelle
Dies ist ein häufiges Problem ohne perfekte Lösung. Das Schwebeverhalten ist bei einer Maus nützlich und bei Berührung meist schädlich. Das Problem wird durch Geräte wie Chromebook Pixel und Surface verschärft, die Touch und Maus unterstützen (nicht weniger!).
Die sauberste Lösung, die ich gefunden habe, besteht darin, das Schwebeverhalten nur zu aktivieren, wenn das Gerät keine Berührungseingabe unterstützt.
Zugegeben, Sie verlieren den Schwebeflug auf Geräten, die dies möglicherweise unterstützen. Manchmal wirkt sich der Hover jedoch stärker aus als der Link selbst, z. B. möchten Sie möglicherweise ein Menü anzeigen, wenn sich ein Element im Hover befindet. Mit diesem Ansatz können Sie das Vorhandensein von Berührungen testen und möglicherweise ein anderes Ereignis bedingt anhängen.
Ich habe dies auf dem iPhone, iPad, Chromebook Pixel, Surface und einer Vielzahl von Android-Geräten getestet. Ich kann nicht garantieren, dass es funktioniert, wenn dem Mix ein generischer USB-Touch-Eingang (z. B. ein Stift) hinzugefügt wird.
quelle
Mit Modernizr können Sie Ihre Hover gezielt auf berührungslose Geräte ausrichten:
(Hinweis: Dies läuft nicht auf dem Snippet-System von StackOverflow. Überprüfen Sie stattdessen die jsfiddle. )
Beachten Sie, dass
:active
dies nicht zielgerichtet sein muss,.no-touch
da es sowohl auf Mobilgeräten als auch auf Desktops wie erwartet funktioniert.quelle
.no-touch
auf demhtml
Tag vorhanden ist. Andernfalls erhält diese Antwort meinen Gütesiegel.quelle
Es gibt vier Möglichkeiten, um mit dem Sticky Hover auf Mobilgeräten umzugehen : Hier finden Sie eine Möglichkeit
can touch
, dem Dokument basierend auf dem aktuellen Eingabetyp des Benutzers dynamisch eine Klasse hinzuzufügen oder zu entfernen . Es funktioniert auch mit Hybridgeräten, bei denen der Benutzer möglicherweise zwischen Touch und Maus / Trackpad wechselt:quelle
Sie können den Hover-Effekt für Geräte überschreiben, die Hover nicht unterstützen. Mögen:
Getestet und verifiziert unter iOS 12
Hutspitze zu https://stackoverflow.com/a/50285058/178959, um darauf hinzuweisen.
quelle
Ich wollte meine eigene Lösung veröffentlichen, aber als ich überprüfte, ob jemand sie bereits veröffentlicht hatte, stellte ich fest, dass @Rodney es fast geschafft hätte. Er vermisste es jedoch als letzten entscheidenden Punkt, der es zumindest in meinem Fall unpassend machte. Ich meine, auch ich habe die gleiche
.fakeHover
Klassenaddition / -entfernung übermouseenter
undmouseleave
Ereigniserkennung genommen, aber das allein wirkt per se fast genau wie "echt":hover
. Ich meine: Wenn Sie auf ein Element in Ihrer Tabelle tippen, wird nicht erkannt, dass Sie es "verlassen" haben - und somit den Status "Fakehover" beibehalten.Was ich getan habe, war einfach zuzuhören.
click
Wenn ich also auf die Schaltfläche "tippe", feuere ich manuell a abmouseleave
.Si das ist mein endgültiger Code:
Auf diese Weise behalten Sie Ihre gewohnte
hover
Funktionalität bei, wenn Sie eine Maus verwenden, wenn Sie einfach auf Ihren Tasten "schweben". Nun, fast alles: Der einzige Nachteil ist, dass es nach dem Klicken auf die Schaltfläche mit der Maus nicht in seinemhover
Zustand ist. Ähnlich wie wenn Sie geklickt und den Zeiger schnell aus der Schaltfläche genommen haben. Aber in meinem Fall kann ich damit leben.quelle
Dies ist, was ich mir bisher ausgedacht habe, nachdem ich den Rest der Antworten studiert habe. Es sollte in der Lage sein, Nur-Touch-, Nur-Maus- oder Hybrid-Benutzer zu unterstützen.
Erstellen Sie eine separate Hover-Klasse für den Hover-Effekt. Fügen Sie diese Hover-Klasse standardmäßig unserer Schaltfläche hinzu.
Wir möchten das Vorhandensein von Touch-Unterstützung nicht erkennen und alle Hover-Effekte von Anfang an deaktivieren. Wie von anderen erwähnt, werden Hybridgeräte immer beliebter. Menschen haben möglicherweise Touch-Unterstützung, möchten aber eine Maus verwenden und umgekehrt. Entfernen Sie daher die Hover-Klasse nur, wenn der Benutzer die Schaltfläche tatsächlich berührt.
Das nächste Problem ist, was ist, wenn der Benutzer nach dem Berühren der Taste wieder eine Maus verwenden möchte? Um dies zu lösen, müssen wir einen geeigneten Moment finden, um die von uns entfernte Schwebeklasse wieder hinzuzufügen.
Wir können es jedoch nicht sofort nach dem Entfernen wieder hinzufügen, da der Schwebezustand noch aktiv ist. Möglicherweise möchten wir nicht auch den gesamten Button zerstören und neu erstellen.
Daher habe ich mir überlegt, einen Algorithmus zum Warten auf Besetzt (mit setInterval) zu verwenden, um den Schwebezustand zu überprüfen. Sobald der Schwebezustand deaktiviert ist, können wir die Schwebeklasse wieder hinzufügen und das Warten beenden, um zum ursprünglichen Zustand zurückzukehren, in dem der Benutzer entweder Maus oder Berührung verwenden kann.
Ich weiß, dass das Warten beschäftigt nicht so toll ist, aber ich bin mir nicht sicher, ob es ein geeignetes Ereignis gibt. Ich habe überlegt, es im Mouseleave-Event wieder hinzuzufügen, aber es war nicht sehr robust. Wenn beispielsweise nach dem Berühren der Taste eine Warnung angezeigt wird, verschiebt sich die Mausposition, aber das Mausblattereignis wird nicht ausgelöst.
Bearbeiten: Ein anderer Ansatz, den ich versucht habe, ist das Aufrufen von
e.preventDefault()
ontouchstart oder ontouchend. Es scheint den Hover-Effekt zu stoppen, wenn die Schaltfläche berührt wird, aber es stoppt auch die Schaltfläche-Klick-Animation und verhindert, dass die Onclick-Funktion aufgerufen wird, wenn die Schaltfläche berührt wird. Sie müssen diese also manuell im ontouchstart- oder ontouchend-Handler aufrufen. Keine sehr saubere Lösung.quelle
Es war hilfreich für mich: Link
quelle
Fügen Sie diesen JS-Code Ihrer Seite hinzu:
Fügen Sie jetzt in Ihrem CSS vor jedem Hover die Hover-Klasse wie folgt hinzu:
Wenn das Gerät berührt wird, ist die Körperklasse leer, andernfalls schwebt die Klasse und die Regeln werden angewendet!
quelle
document.body.className = 'ontouchstart' in window ? '' : 'hover';
Dies ist der richtige Ausgangspunkt. Nächster Schritt: Anwenden / Entfernen der Nohover-Klasse auf folgende Ereignisse (Demo mit jQuery)
Hinweis: Wenn Sie andere Klassen auf das Schaltflächenelement anwenden möchten, funktioniert das: not (.nohover) im CSS nicht mehr wie erwartet. Dann müssen Sie stattdessen eine separate Definition mit Standardwert und! Wichtigem Tag hinzufügen, um den Schwebestil zu überschreiben: .nohover {Hintergrundfarbe: weiß! Wichtig}
Dies sollte sogar Geräte wie das Chromebook Pixel (das sowohl einen Touchscreen als auch eine Maus hat) korrekt handhaben! Und ich denke nicht, dass dies ein großer Leistungskiller ist ...
quelle
Eine Lösung, die für mich funktioniert hat:
Fügen Sie diesen Code Ihrem Stylesheet hinzu.
Ich wollte den grauen Hintergrund entfernen, der auf iOS Safari angezeigt wird, wenn auf einen Link geklickt wird. Aber es scheint mehr zu tun. Jetzt wird das Klicken auf eine Schaltfläche (mit einer
:hover
Pseudoklasse!) Sofort geöffnet! Ich habe es nur auf einem iPad getestet, ich weiß nicht, ob es auf anderen Geräten funktioniert.quelle
Ich denke, ich habe eine elegante (Minimum js) Lösung für ein ähnliches Problem gefunden:
Mit jQuery können Sie mithilfe von jover einen Hover auf dem Körper (oder einem anderen Element) auslösen
.mouseover()
Also füge ich dem
ontouchend
Ereignis des Elements einfach einen solchen Handler hinzu :Dies entfernt jedoch nur: Schweben Sie die Pseudoklasse aus dem Element, nachdem ein anderes Berührungsereignis ausgelöst wurde, z. B. Wischen oder eine andere Berührung
quelle
Ich habe eine schöne Lösung, die ich gerne teilen möchte. Zuerst müssen Sie feststellen, ob der Benutzer wie folgt mobil ist:
Dann fügen Sie einfach hinzu:
Und in CSS:
quelle
Ich ging durch das ähnliche Problem, meine Anwendung war für alle Bildschirmgrößen kompatibel und hatte eine Menge Hover-Effekte bei Geräten mit Desktop-Bildschirmgröße / Maus. Später stellte ich fest, dass berührungsbasierte Geräte einen als klebrig bezeichneten Zustand verursachten -Hover und es war eine Hürde für die App, für Benutzer von berührungsbasierten Geräten ordnungsgemäß zu funktionieren.
Wir haben SCSS in unserer App verwendet. und ich habe ein Mixin definiert , das sich um Touch-basierte Geräte kümmert.
und dann habe ich alle meine CSS-Klassen unter das unten genannte Snippet gestellt.
Zum Beispiel hatten wir eine Klasse zum Animieren eines Symbols, die ausgelöst wurde, sobald wir mit der Maus über das Symbol fahren, wie Sie es in CSS sehen können. Bei berührungsbasierten Geräten wurde es jedoch durch einen Sticky-Hover-Effekt beeinflusst, und dann habe ich es in @ platziert Fügen Sie hover-support () hinzu , um sicherzustellen, dass hover nur für Geräte gilt, die hover unterstützen.
quelle
Hier ist ein einfacher JavaScript-Code, bei dem der Entwickler kein CSS bearbeiten oder neue CSS-Regeln schreiben muss. Ich habe dies für Bootstrap-Schaltflächen mit geschrieben
class="btn"
, aber es funktioniert mit jeder Schaltfläche, die einen bestimmten Klassennamen hat.Die Schritte sind:
document.styleSheets
.btn
als als auch enthalten:hover
Durch das Eliminieren aller
.btn :hover
CSS-Regeln wird sichergestellt, dass auf einer Schaltfläche kein visueller Hover-Effekt auftritt.Schritt 1: Touch-Gerät erkennen
Überprüfen Sie die Medienabfrage auf Folgendes
(hover: none)
:Schritt 2: Löschen Sie CSS-Regeln, die "btn" und ": hover" enthalten
Der vollständige Code ist auf GitHub und npm .
Live-Demo auf terrymorse.com .
quelle
@media (hover:none)
oder wenn der Benutzer den Bildschirm zum ersten Mal berührt. Sie können es auf der Live-Demo-Seite ausprobieren, um sicherzugehen.Sie können die Hintergrundfarbe
:active
für:focus
den Status festlegen und den standardmäßigen Hintergrund angeben.Wenn Sie die Hintergrundfarbe über einstellen
onfocus/ontouch
, bleibt der Farbstil erhalten, sobald der:focus
Status abgelaufen ist.Sie müssen ebenfalls zurücksetzen
onblur
, um defaut bg wiederherzustellen, wenn der Fokus verloren geht.quelle
Das hat bei mir funktioniert: Setzen Sie das Hover-Styling in eine neue Klasse
Fügen Sie dann die Klasse nach Bedarf hinzu oder entfernen Sie sie
Wiederholen Sie diesen Vorgang für Touchstart- und Touchend-Ereignisse. Oder welche Ereignisse Sie möchten, um das gewünschte Ergebnis zu erzielen, zum Beispiel wollte ich, dass der Hover-Effekt auf einem Touchscreen umgeschaltet wird.
quelle
Basierend auf der Antwort von Darren Cooks, die auch funktioniert, wenn Sie Ihren Finger über ein anderes Element bewegen.
Siehe Finger suchen Element ist während eines Touchend-Ereignisses aktiviert
Codepen Demo
quelle
Sie können diesen Weg versuchen.
Javascript:
CSS:
quelle
Was ich bisher in meinen Projekten getan habe, war, die
:hover
Änderungen auf Touch-Geräten rückgängig zu machen:Alle Klassennamen und benannten Farben nur zu Demonstrationszwecken ;-)
quelle
Dies funktioniert perfekt in 2 Schritten.
Stellen Sie Ihr Body-Tag so ein
<body ontouchstart="">
. Ich bin kein Fan dieses "Hacks", aber es ermöglicht Safari unter iOS, sofort auf Berührungen zu reagieren. Ich weiß nicht wie, aber es funktioniert.Richten Sie Ihre berührbare Klasse folgendermaßen ein:
Möglicherweise möchten Sie auch Animationen in Ihrer berührbaren Klasse entfernen. Android Chrome scheint etwas langsamer zu sein als iOS.
Dies führt auch dazu, dass der aktive Status angewendet wird, wenn der Benutzer die Seite scrollt, während er Ihre Klasse berührt.
quelle
Einige der klebrigen oder feststeckenden
:hover
:focus
:active
Probleme auf Mobilgeräten können durch fehlende Probleme verursacht werden,<meta name="viewport" content="width=device-width">
wenn die Browser versuchen, den Bildschirm zu manipulieren.quelle
Die Lösung für mich war nach dem Touchend, den Knoten zu klonen und zu ersetzen ... Ich hasse es, dies zu tun, aber selbst der Versuch, das Element mit offsetHeight neu zu malen, funktionierte nicht
quelle
Dies kann durch Austauschen einer HTML-Klasse erreicht werden. Es sollte weniger störanfällig sein als das Entfernen des gesamten Elements, insbesondere bei großen Bildverknüpfungen usw.
Wir können auch entscheiden, ob wir schweben wollen Zustände ausgelöst werden , wenn sie mit Berührung (Berührungsbewegungs ) oder sogar fügen Sie ein Timeout Scrollen sie zu verzögern.
Die einzige wesentliche Änderung in unserem Code ist die Verwendung zusätzlicher HTML-Klassen, z. B.
<a class='hover'></a>
für Elemente, die das neue Verhalten implementieren.HTML
CSS
JS (mit jQuery)
Beispiel
https://codepen.io/mattrcouk/pen/VweajZv
- -
Ich habe jedoch kein Gerät mit Maus und Touch, um es richtig zu testen.
quelle