tl; dr usa esto: https://jsfiddle.net/57tmy8j3/
Si le interesa por qué o qué otras opciones hay, siga leyendo.
Quick'n'dirty - eliminar: estilos de desplazamiento con JS
Puede eliminar todas las reglas CSS que contienen el :hover
uso de Javascript. Esto tiene la ventaja de no tener que tocar CSS y ser compatible incluso con navegadores antiguos.
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) {}
}
Limitaciones: las hojas de estilo deben estar alojadas en el mismo dominio (eso significa que no hay CDN). Deshabilita los movimientos del mouse sobre dispositivos táctiles y de mouse mixtos como Surface o iPad Pro, lo que perjudica a UX.
Solo CSS: use consultas de medios
Coloque todas sus reglas de desplazamiento en un @media
bloque:
@media (hover: hover) {
a:hover { color: blue; }
}
o, alternativamente, anule todas sus reglas de desplazamiento (compatible con navegadores antiguos):
a:hover { color: blue; }
@media (hover: none) {
a:hover { color: inherit; }
}
Limitaciones: funciona solo en iOS 9.0+, Chrome para Android o Android 5.0+ cuando se usa WebView. hover: hover
rompe los efectos de desplazamiento en navegadores antiguos, hover: none
necesita anular todas las reglas CSS previamente definidas. Ambos son incompatibles con dispositivos mixtos de mouse y táctiles .
El más robusto: detecta el tacto a través de JS y antepone CSS: reglas de desplazamiento
Este método necesita anteponer todas las reglas de desplazamiento con body.hasHover
. (o un nombre de clase de su elección)
body.hasHover a:hover { color: blue; }
La hasHover
clase se puede agregar usando hasTouch()
el primer ejemplo:
if (!hasTouch()) document.body.className += ' hasHover'
Sin embargo, esto tendría los mismos inconvenientes con los dispositivos táctiles mixtos que los ejemplos anteriores, lo que nos lleva a la solución definitiva. Habilite los efectos de desplazamiento cada vez que mueva el cursor del mouse, desactive los efectos de desplazamiento siempre que se detecte un toque.
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()
Esto debería funcionar básicamente en cualquier navegador y habilita / deshabilita los estilos de desplazamiento según sea necesario.
Aquí está el ejemplo completo: moderno: https://jsfiddle.net/57tmy8j3/
Legacy (para usar con navegadores antiguos): https://jsfiddle.net/dkz17jc5/19/