简短版:使用https://jsfiddle.net/57tmy8j3/
如果您想了解为什么或其他选项,请继续阅读。
快速且有效 - 使用JS删除:hover样式
您可以使用Javascript删除所有包含:hover
的CSS规则。这样做的优点是无需更改CSS,即使在旧浏览器中也兼容。
function hasTouch() {
return 'ontouchstart' in document.documentElement
|| navigator.maxTouchPoints > 0
|| navigator.msMaxTouchPoints > 0;
}
if (hasTouch()) {
try {
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,这会损害用户体验。
CSS-only - 使用媒体查询
将所有的:hover规则放在一个@media
块中:
@media (hover: hover) {
a:hover { color: blue; }
}
或者,替代方式是覆盖所有的悬停规则(兼容旧版浏览器):
a:hover { color: blue; }
@media (hover: none) {
a:hover { color: inherit; }
}
限制:仅在使用iOS 9.0+、Chrome for Android或Android 5.0+的WebView时工作。 hover: hover
在旧浏览器上会导致悬停效果中断,hover: none
需要覆盖先前定义的所有CSS规则。两者都与混合鼠标和触摸设备不兼容。
最稳健的方法 - 通过JS检测触摸并添加CSS :hover规则
使用此方法需要将所有悬停规则与body.hasHover
(或您选择的类名)一起添加在前面。
body.hasHover a:hover { color: blue; }
可以使用第一个示例中的 hasTouch()
方法添加 hasHover
类:
if (!hasTouch()) document.body.className += ' hasHover'
然而,这种方法在使用混合触摸设备时会出现与之前示例相同的缺点,这就引出了最终解决方案:只有在鼠标光标移动时启用悬停效果,在检测到触摸时禁用悬停效果。
function watchForHover() {
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/