tl; dr використовувати це: https://jsfiddle.net/57tmy8j3/
Якщо вас цікавить, чому або які інші варіанти існують, читайте далі.
Quick'n'dirty - delete: наведіть курсор стилів за допомогою JS
Ви можете видалити всі правила CSS, що містять :hover
Javascript. Це має перевагу в тому, що не потрібно торкатися CSS та бути сумісним навіть із старими браузерами.
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) {}
}
Обмеження: таблиці стилів повинні розміщуватися на одному домені (це означає, що немає CDN). Вимикає наведення курсора на змішаних пристроях миші та дотику такі як Surface або iPad Pro, що шкодить UX.
Тільки CSS - використовуйте медіа-запити
Розмістіть у @media
блоці всі свої правила :
@media (hover: hover) {
a:hover { color: blue; }
}
або ж замініть усі правила наведення курсора (сумісні зі старими браузерами):
a:hover { color: blue; }
@media (hover: none) {
a:hover { color: inherit; }
}
Обмеження: працює лише на iOS 9.0+, Chrome для Android або Android 5.0+ під час використання WebView. hover: hover
порушує ефекти наведення на старі веб-переглядачі та hover: none
потребує перегляду всіх раніше визначених правил CSS. Обидва несумісні із змішаними пристроями миші та сенсорного пристрою .
Найбільш надійний - виявляйте дотик за допомогою JS та додайте CSS: правила наведення курсора
Цей метод потребує попереднього встановлення всіх правил наведення body.hasHover
. (або назва вашого класу)
body.hasHover a:hover { color: blue; }
hasHover
Клас може бути доданий з допомогою hasTouch()
з першого прикладу:
if (!hasTouch()) document.body.className += ' hasHover'
Однак це може мати ті ж недоліки із змішаними сенсорними пристроями, що і попередні приклади, що підводить нас до остаточного рішення. Увімкніть наведення ефектів під час переміщення курсору миші, відключіть ефекти наведення курсора кожного разу, коли буде виявлено дотик.
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()
Це має працювати в основному в будь-якому веб-переглядачі та вмикати / вимикати стилі наведення в міру необхідності.
Ось повний приклад - сучасний: https://jsfiddle.net/57tmy8j3/
Спадщина (для використання зі старими браузерами): https://jsfiddle.net/dkz17jc5/19/