tl; dr użyj tego: https://jsfiddle.net/57tmy8j3/
Jeśli interesuje Cię dlaczego lub jakie są inne opcje, czytaj dalej.
Quick'n'dirty - usuń: najedź stylami za pomocą JS
Możesz usunąć wszystkie reguły CSS zawierające :hover
za pomocą Javascript. Ma to tę zaletę, że nie trzeba dotykać CSS i jest kompatybilne nawet ze starszymi przeglądarkami.
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) {}
}
Ograniczenia: arkusze stylów muszą znajdować się w tej samej domenie (co oznacza brak sieci CDN). Wyłącza kursory na mieszanych urządzeniach myszy i dotykowych, takich jak Surface lub iPad Pro, co szkodzi UX.
Tylko CSS - używaj zapytań o media
Umieść wszystkie swoje reguły: najechanie kursorem w @media
bloku:
@media (hover: hover) {
a:hover { color: blue; }
}
lub alternatywnie, zastąp wszystkie reguły najechania kursorem (zgodne ze starszymi przeglądarkami):
a:hover { color: blue; }
@media (hover: none) {
a:hover { color: inherit; }
}
Ograniczenia: działa tylko na iOS 9.0+, Chrome na Androida lub Android 5.0+ podczas korzystania z WebView. hover: hover
przerywa efekty najechania na starsze przeglądarki, hover: none
wymaga zastąpienia wszystkich wcześniej zdefiniowanych reguł CSS. Oba są niekompatybilne z mieszanymi urządzeniami myszą i dotykową .
Najbardziej niezawodny - wykrywaj dotyk za pomocą JS i dołącz CSS: reguły najechania kursorem
Ta metoda wymaga poprzedzenia wszystkich reguł dymka body.hasHover
. (lub dowolna nazwa klasy)
body.hasHover a:hover { color: blue; }
hasHover
Klasy mogą być dodane za pomocą hasTouch()
od pierwszego np
if (!hasTouch()) document.body.className += ' hasHover'
Jednak miałoby to takie same wady w przypadku mieszanych urządzeń dotykowych, jak w poprzednich przykładach, co prowadzi nas do ostatecznego rozwiązania. Włącz efekty najechania po każdym przesunięciu kursora myszy, wyłącz efekty najechania po wykryciu dotyku.
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()
Powinno to działać w zasadzie w każdej przeglądarce i włączać / wyłączać style najechania w razie potrzeby.
Oto pełny przykład - nowoczesny: https://jsfiddle.net/57tmy8j3/
Legacy (do użytku ze starymi przeglądarkami): https://jsfiddle.net/dkz17jc5/19/