Mit etwas HTML wie diesem:
<p>Some Text</p>
Dann einige CSS wie folgt:
p {
color:black;
}
p:hover {
color:red;
}
Wie kann ich zulassen, dass eine lange Berührung eines berührungsfähigen Geräts den Schwebeflug repliziert? Ich kann Markup ändern / JS usw. verwenden, kann mir aber keinen einfachen Weg vorstellen, dies zu tun.
Antworten:
OK, ich habe es geschafft! Dazu muss das CSS leicht geändert und JS hinzugefügt werden.
Verwenden Sie jQuery, um es einfach zu machen:
Auf Englisch: Wenn Sie eine Berührung beginnen oder beenden, schalten Sie die Klasse
hover_effect
ein oder aus.Fügen Sie dann in Ihrem HTML-Code einen Klassen-Hover zu allem hinzu, mit dem dies funktionieren soll. Ersetzen Sie in Ihrem CSS eine beliebige Instanz von:
mit
Und nur für zusätzlichen Nutzen, fügen Sie dies auch Ihrem CSS hinzu:
Um den Browser zu stoppen, werden Sie aufgefordert, das Bild oder was auch immer zu kopieren / speichern / auswählen.
Einfach!
quelle
toggle
die Dinge durcheinander bringt, wenn der Benutzer ein Element berührt und zu einem anderen zieht (z. B. wenn er das falsche Element berührt und versucht, die Berührung abzubrechen)touchend
undpreventDefault()
in meiner Website entfernt und es funktioniert gut, aber jetzt werden Menüs nicht automatisch durch Tippen außerhalb des Ziels geschlossen.touchstart
Zuhörer am Körper geben (oder ähnliches), aber ich fragte mich, ob es einen besseren Weg gibt. Vielen Dank!Alles, was Sie tun müssen, ist Touchstart an ein Elternteil zu binden. So etwas wird funktionieren:
Sie müssen nichts in der Funktion tun, lassen Sie es leer. Dies reicht aus, um den Schwebeflug in Berührung zu bringen, sodass sich eine Berührung eher wie Schwebeflug und weniger wie Aktiv verhält. iOS Magie.
quelle
Versuche dies:
Und in Ihrem CSS:
Mit diesem Code benötigen Sie keine zusätzliche .hover-Klasse!
quelle
Um Ihre Hauptfrage zu beantworten: "Wie simuliere ich einen Schwebeflug mit einem Touch-in-Touch-fähigen Browser?"
Erlauben Sie einfach das Klicken auf das Element (durch Tippen auf den Bildschirm) und lösen Sie das
hover
Ereignis dann mit JavaScript aus.Dies sollte funktionieren, solange sich
hover
auf Ihrem Gerät ein Ereignis befindet (obwohl es normalerweise nicht verwendet wird).Update: Ich habe diese Technik gerade auf meinem iPhone getestet und sie scheint gut zu funktionieren. Probieren Sie es hier aus: http://jsfiddle.net/mathias/YS7ft/show/light/
Wenn Sie stattdessen eine 'lange Berührung' verwenden möchten, um den Schwebeflug auszulösen, können Sie das obige Code-Snippet als Ausgangspunkt verwenden und Spaß mit Timern und anderen Dingen haben;)
quelle
Weitere verbesserte Lösung
Zuerst habe ich mich für den Ansatz von Rich Bradshaw entschieden , aber dann traten Probleme auf. Durch Ausführen von e.preventDefault () beim 'Touchstart'- Ereignis wird die Seite nicht mehr gescrollt, und weder das lange Drücken des Optionsmenüs noch das Doppelklicken des Zooms können die Ausführung beenden.
Eine Lösung könnte darin bestehen, herauszufinden, welches Ereignis aufgerufen wird, und nur e.preventDefault () im späteren 'touchend' . Da der 'touchmove' von scroll vor 'touchend' steht , bleibt er standardmäßig erhalten, und 'click' wird ebenfalls verhindert, da es sich um Nachwörter in der Ereigniskette handelt, die auf Mobilgeräte angewendet werden, wie folgt:
Wenn dann das Optionsmenü angezeigt wird, wird kein "Touchend" mehr ausgelöst, das für das Ausschalten der Klasse verantwortlich ist, und beim nächsten Mal ist das Schwebeverhalten umgekehrt, völlig durcheinander.
Eine Lösung wäre dann wiederum, unter bestimmten Bedingungen herauszufinden, in welchem Ereignis wir uns befinden, oder nur separate Ereignisse durchzuführen und addClass () bzw. removeClass () für 'touchstart' und 'touchend' zu verwenden , um sicherzustellen, dass es immer beginnt und endet jeweils hinzufügen und entfernen, anstatt sich bedingt dafür zu entscheiden. Zum Abschluss binden wir den Rückruf zum Entfernen auch an den Ereignistyp "focusout" und bleiben dafür verantwortlich , die Schwebeklasse eines Links zu löschen, die möglicherweise aktiviert bleibt und nie wieder besucht wird, wie folgt :
Achtung: Einige Fehler treten immer noch in den beiden vorherigen Lösungen auf, und denken Sie (nicht getestet), dass der Doppelklick-Zoom auch immer noch fehlschlägt.
Ordentliche und hoffentlich fehlerfreie (nicht :)) Javascript-Lösung
Nun , für eine zweite, sauberer, aufgeräumter und reaktions Ansatz nur mit Hilfe von Javascript (kein zwischen .hover Klasse und Pseudo mischen: Hover) und von wo aus Sie direkt Ihr Ajax - Verhalten auf der universellen nennen könnte (mobile und Desktop) ‚Klick‘ Event Ich habe eine ziemlich gut beantwortete Frage gefunden, anhand derer ich endlich verstanden habe, wie ich Berührungs- und Mausereignisse miteinander mischen kann, ohne dass mehrere Ereignisrückrufe zwangsläufig die Ereignisse in der Ereigniskette ändern. Hier ist wie:
quelle
Der Mauseffekt
hover
kann nicht in Touch-Geräten implementiert werden. Wenn ich mit der gleichen Situation in erschienensafari
ios
bin, habe ich verwendet:active
in CSS verwendet, um Wirkung zu erzielen.dh.
In meinem Fall funktioniert es. Möglicherweise ist dies auch der Fall, der ohne Verwendung von Javascript verwendet werden kann. Probieren Sie es einfach aus.
quelle
Fügen Sie diesen Code hinzu und setzen Sie die Klasse "tapHover" auf Elemente, die Sie auf diese Weise arbeiten möchten. Wenn Sie zum ersten Mal auf ein Element tippen, erhält es die Pseudoklasse ": hover" und die Klasse "tapped". Klickereignis wird verhindert. Wenn Sie zum zweiten Mal auf dasselbe Element tippen, wird ein Klickereignis ausgelöst.
quelle
Ohne gerätespezifisches (oder besser Browser) JS bin ich mir ziemlich sicher, dass Sie kein Glück haben.
Bearbeiten: dachte, Sie wollten das vermeiden, bis ich Ihre Frage erneut las. Im Falle von Mobile Safari können Sie sich registrieren, um alle Berührungsereignisse zu erhalten, die denen mit nativen UIView-s ähneln. Ich kann die Dokumentation momentan nicht finden, werde es aber versuchen.
quelle
Eine Möglichkeit besteht darin, den Hover-Effekt zu starten, wenn die Berührung beginnt, und dann den Hover-Effekt zu entfernen, wenn sich die Berührung bewegt oder endet.
Dies ist, was Apple über das Touch-Handling im Allgemeinen zu sagen hat , da Sie das iPhone erwähnen.
quelle
Mein persönlicher Geschmack ist es, die
:hover
Stile auch dem:focus
Staat zuzuschreiben , wie:Dann mit folgendem HTML:
Und das folgende JavaScript:
quelle
Gelöst 2019 - Hover on Touch
Es scheint jetzt am besten zu sein, Hover nicht ganz mit ios oder touch im Allgemeinen zu verwenden. Der folgende Code wendet Ihr CSS an, solange die Berührung beibehalten wird, und ohne andere ios-Flyouts. Mach das;
Jquery add: $ ("p"). On ("touchstart", Funktion (e) {$ (this) .focus (); e.preventDefault ();});
CSS: Ersetzen Sie p: hover durch p: focus und fügen Sie p: active hinzu
Optionen;
Ersetzen Sie den jquery p-Selektor durch eine beliebige Klasse usw.
Um den Effekt beizubehalten, halten Sie auch p: hover und fügen Sie body {cursor: ponter;} hinzu, sodass ein Tippen irgendwo darauf endet
Versuchen Sie Click & Mouseover-Ereignisse sowie Touchstart im selben Code (aber nicht getestet).
entferne e.preventDefault (); um Benutzern die Verwendung von ios-Flyouts zu ermöglichen, z. B. Kopieren
Anmerkungen
Nur auf Textelemente getestet, kann ios Eingaben usw. unterschiedlich behandeln
Nur auf dem iPhone XR ios 12.1.12 und dem ipad 3 ios 9.3.5 mit Safari oder Chrome getestet.
quelle
Eine Mischung aus nativem Javascript und jQuery:
quelle
Die einfachste Lösung, die ich gefunden habe: Ich hatte einige <span> -Tags mit: hover css-Regeln. Ich wechselte zu <a href = "javascript: void (0 )"> und voilà. Die Schwebestile in iOS begannen zu funktionieren.
quelle
Die Verwendung kann auch CSS verwenden, dem versteckten Link Fokus und Aktiv (für IE7 und darunter) hinzufügen. Beispiel eines ul-Menüs in einem div mit Klassenmenü:
Es ist spät und ungetestet, sollte funktionieren ;-)
quelle