tl; dr usa questo: https://jsfiddle.net/57tmy8j3/
Se ti interessa perché o quali altre opzioni ci sono, continua a leggere.
Quick'n'dirty: rimuovi: passa il mouse con gli stili usando JS
Puoi rimuovere tutte le regole CSS che contengono :hover
usando Javascript. Questo ha il vantaggio di non dover toccare CSS ed essere compatibile anche con i browser più vecchi.
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) {}
}
Limitazioni: i fogli di stile devono essere ospitati sullo stesso dominio (ciò significa che non sono presenti CDN). Disabilita i passaggi su mouse e dispositivi touch misti come Surface o iPad Pro, danneggiando la UX.
Solo CSS: utilizza le query multimediali
Inserisci tutte le tue regole: hover in un @media
blocco:
@media (hover: hover) {
a:hover { color: blue; }
}
o in alternativa, sovrascrivere tutte le regole al passaggio del mouse (compatibile con i browser più vecchi):
a:hover { color: blue; }
@media (hover: none) {
a:hover { color: inherit; }
}
Limitazioni: funziona solo su iOS 9.0+, Chrome per Android o Android 5.0+ quando si utilizza WebView. hover: hover
interrompe gli effetti al passaggio del mouse sui browser più vecchi,hover: none
deve sovrascrivere tutte le regole CSS precedentemente definite. Entrambi sono incompatibili con mouse e dispositivi touch misti .
Il più robusto: rileva il tocco tramite JS e antepone CSS: regole al passaggio del mouse
Questo metodo ha bisogno di anteporre tutte le regole al passaggio del mouse con body.hasHover
. (o un nome di classe a tua scelta)
body.hasHover a:hover { color: blue; }
La hasHover
classe può essere aggiunta usando hasTouch()
dal primo esempio:
if (!hasTouch()) document.body.className += ' hasHover'
Tuttavia, ciò dovrebbe avere gli stessi inconvenienti con i dispositivi a tocco misto degli esempi precedenti, il che ci porta alla soluzione definitiva. Abilita gli effetti al passaggio del mouse ogni volta che si sposta un cursore del mouse, disabilita gli effetti al passaggio del mouse ogni volta che viene rilevato un tocco.
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()
Questo dovrebbe funzionare sostanzialmente in qualsiasi browser e abilitare / disabilitare gli stili al passaggio del mouse, se necessario.
Ecco l'esempio completo - moderno: https://jsfiddle.net/57tmy8j3/
Legacy (per l'utilizzo con i browser precedenti): https://jsfiddle.net/dkz17jc5/19/