Verwenden Sie dies: https://jsfiddle.net/57tmy8j3/
Wenn Sie interessiert sind, warum oder welche anderen Optionen es gibt, lesen Sie weiter.
Quick'n'dirty - entfernen: Hover-Stile mit JS
Sie können alle CSS-Regeln entfernen, :hover
die Javascript enthalten. Dies hat den Vorteil, dass Sie CSS nicht berühren müssen und auch mit älteren Browsern kompatibel sind.
function hasTouch() {
return 'ontouchstart' in document.documentElement
|| navigator.maxTouchPoints > 0
|| navigator.msMaxTouchPoints > 0;
}
if (hasTouch()) { // remove all the :hover stylesheets
try { // prevent exception on browsers not supporting DOM styleSheets properly
for (var si in document.styleSheets) {
var styleSheet = document.styleSheets[si];
if (!styleSheet.rules) continue;
for (var ri = styleSheet.rules.length - 1; ri >= 0; ri--) {
if (!styleSheet.rules[ri].selectorText) continue;
if (styleSheet.rules[ri].selectorText.match(':hover')) {
styleSheet.deleteRule(ri);
}
}
}
} catch (ex) {}
}
Einschränkungen: Stylesheets müssen in derselben Domain gehostet werden (dh keine CDNs). Deaktiviert das Schweben auf gemischten Maus- und Touch-Geräten wie Surface oder iPad Pro, was die UX verletzt.
Nur CSS - Verwenden Sie Medienabfragen
Platzieren Sie alle Ihre: Hover-Regeln in einem @media
Block:
@media (hover: hover) {
a:hover { color: blue; }
}
oder überschreiben Sie alternativ alle Ihre Hover-Regeln (kompatibel mit älteren Browsern):
a:hover { color: blue; }
@media (hover: none) {
a:hover { color: inherit; }
}
Einschränkungen: Funktioniert nur unter iOS 9.0+, Chrome für Android oder Android 5.0+, wenn WebView verwendet wird. hover: hover
Unterbricht Hover-Effekte in älteren Browsern und hover: none
muss alle zuvor definierten CSS-Regeln überschreiben. Beide sind nicht mit gemischten Maus- und Touch-Geräten kompatibel .
Am robustesten: Erkennen Sie Berührungen über JS und stellen Sie CSS: Hover-Regeln voran
Diese Methode muss allen Hover-Regeln vorangestellt werden body.hasHover
. (oder ein Klassenname Ihrer Wahl)
body.hasHover a:hover { color: blue; }
Die hasHover
Klasse kann hasTouch()
aus dem ersten Beispiel hinzugefügt werden :
if (!hasTouch()) document.body.className += ' hasHover'
Dies hätte jedoch die gleichen Nachteile bei Mixed-Touch-Geräten wie bei den vorherigen Beispielen, was uns zur ultimativen Lösung bringt. Aktivieren Sie Hover-Effekte, wenn ein Mauszeiger bewegt wird. Deaktivieren Sie Hover-Effekte, wenn eine Berührung erkannt wird.
function watchForHover() {
// lastTouchTime is used for ignoring emulated mousemove events
let lastTouchTime = 0
function enableHover() {
if (new Date() - lastTouchTime < 500) return
document.body.classList.add('hasHover')
}
function disableHover() {
document.body.classList.remove('hasHover')
}
function updateLastTouchTime() {
lastTouchTime = new Date()
}
document.addEventListener('touchstart', updateLastTouchTime, true)
document.addEventListener('touchstart', disableHover, true)
document.addEventListener('mousemove', enableHover, true)
enableHover()
}
watchForHover()
Dies sollte grundsätzlich in jedem Browser funktionieren und Hover-Stile nach Bedarf aktivieren / deaktivieren.
Hier ist das vollständige Beispiel - modern: https://jsfiddle.net/57tmy8j3/
Legacy (zur Verwendung mit alten Browsern): https://jsfiddle.net/dkz17jc5/19/