tl; dr sử dụng cái này: https://jsfiddle.net/57tmy8j3/
Nếu bạn quan tâm tại sao hoặc có những lựa chọn nào khác, hãy đọc tiếp.
Quick'n'denty - remove: kiểu di chuột bằng cách sử dụng JS
Bạn có thể xóa tất cả các quy tắc CSS có chứa :hover
bằng Javascript. Điều này có lợi thế là không phải chạm CSS và tương thích ngay cả với các trình duyệt cũ hơn.
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) {}
}
Hạn chế: bảng định kiểu phải được lưu trữ trên cùng một tên miền (điều đó có nghĩa là không có CDN). Vô hiệu hóa dao động trên các thiết bị chuột và cảm ứng hỗn hợp như Surface hoặc iPad Pro, làm tổn thương UX.
Chỉ CSS - sử dụng truy vấn phương tiện
Đặt tất cả: quy tắc di chuột của bạn trong một @media
khối:
@media (hover: hover) {
a:hover { color: blue; }
}
hoặc cách khác, ghi đè tất cả các quy tắc di chuột của bạn (tương thích với các trình duyệt cũ hơn):
a:hover { color: blue; }
@media (hover: none) {
a:hover { color: inherit; }
}
Hạn chế: chỉ hoạt động trên iOS 9.0+, Chrome cho Android hoặc Android 5.0+ khi sử dụng WebView. hover: hover
phá vỡ các hiệu ứng di chuột trên các trình duyệt cũ hơn, hover: none
cần ghi đè tất cả các quy tắc CSS được xác định trước đó. Cả hai đều không tương thích với các thiết bị chuột và cảm ứng hỗn hợp .
Mạnh mẽ nhất - phát hiện cảm ứng thông qua JS và thêm CSS: quy tắc di chuột
Phương pháp này cần chuẩn bị trước tất cả các quy tắc di chuột với body.hasHover
. (hoặc tên lớp bạn chọn)
body.hasHover a:hover { color: blue; }
Các hasHover
lớp có thể được thêm vào sử dụng hasTouch()
từ ví dụ đầu tiên:
if (!hasTouch()) document.body.className += ' hasHover'
Tuy nhiên, điều này có những nhược điểm tương tự với các thiết bị cảm ứng hỗn hợp như các ví dụ trước, điều này đưa chúng ta đến giải pháp tối ưu. Bật hiệu ứng di chuột bất cứ khi nào con trỏ chuột được di chuyển, vô hiệu hóa hiệu ứng di chuột bất cứ khi nào phát hiện thấy cảm ứng.
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()
Điều này sẽ hoạt động cơ bản trong bất kỳ trình duyệt nào và cho phép / vô hiệu hóa các kiểu di chuột khi cần thiết.
Dưới đây là ví dụ đầy đủ - hiện đại: https://jsfiddle.net/57tmy8j3/
Legacy (để sử dụng với các trình duyệt cũ): https://jsfiddle.net/dkz17jc5/19/