CSS 媒体查询
CSS
/* 只在非触摸设备上显示 hover 效果 */
@media (hover: hover) and (pointer: fine) {
.element:hover {
/* 桌面端的 hover 样式 */
background-color: #f0f0f0;
}
}
/* 针对触摸设备禁用 hover */
@media (hover: none) and (pointer: coarse) {
.element:hover {
/* 重置或覆盖 hover 样式 */
background-color: inherit;
}
}
使用触摸事件检测
CSS
/* 基本方法:触摸时使用 active 状态替代 hover */
.element:active {
/* 触摸时的样式 */
opacity: 0.7;
}
JavaScript 检测设备类型
Javascript
// 检测是否为触摸设备
function isTouchDevice() {
return 'ontouchstart' in window ||
navigator.maxTouchPoints > 0 ||
navigator.msMaxTouchPoints > 0;
}
// 根据设备类型添加类名
if (isTouchDevice()) {
document.body.classList.add('touch-device');
} else {
document.body.classList.add('no-touch');
}
CSS
/* 根据类名控制 hover 效果 */
.touch-device .element:hover {
/* 触摸设备上禁用 hover 效果 */
pointer-events: none;
}
完全禁用 hover
CSS
/* 所有设备都禁用 hover */
.element:hover {
all: unset;
}
/* 或针对移动端使用媒体查询 */
@media (max-width: 768px) {
.element:hover {
/* 清除所有 hover 样式 */
background-color: inherit !important;
transform: none !important;
/* ... 其他需要重置的样式 */
}
}
使用 Modernizr 检测
Javascript
if (Modernizr.touchevents) {
// 触摸设备
$('body').addClass('touch');
} else {
// 非触摸设备
$('body').addClass('no-touch');
}
CSS
.touch .element:hover {
/* 触摸设备上的样式 */
}
最佳实践组合
CSS
/* 基础样式 */
.element {
transition: all 0.3s ease;
}
/* 桌面端 hover 效果 */
@media (hover: hover) {
.element:hover {
transform: scale(1.05);
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}
}
/* 移动端使用触摸反馈 */
@media (hover: none) {
.element:active {
opacity: 0.8;
transform: scale(0.98);
}
/* 防止意外触发 hover */
.element:hover {
transform: none;
box-shadow: none;
}
}
注意事项
- 优先级问题:确保移动端的样式有足够高的优先级覆盖桌面端样式
- 测试:在不同设备上测试效果
- 渐进增强:先确保基本功能正常,再添加 hover 效果
- 不要完全依赖 hover:重要的交互功能应该有其他访问方式
推荐使用 CSS 媒体查询方法,因为它不需要 JavaScript,性能更好,且更符合响应式设计原则。
文章目录
