javascript - 2019年如何检测触摸设备?
问题描述
对于我的应用程序,我需要彻底改变使用屏幕键盘(例如移动设备、触摸电视)与鼠标/kbd 设备(例如台式机、带有蓝牙鼠标/kbd 的移动设备)的触摸设备的整个用户体验。
注意。我已经用 CSS 网格和媒体查询了解了响应式布局,因此处理了这方面的问题。我的问题不在于布局,而是整个用户体验需要完全不同。到目前为止,我最好的选择是在整个视口上监听鼠标移动。
如何使用现代浏览器做到这一点?
请注意,我已经阅读了已有数年的现有答案,并且通常得出的结论是无法完成。
解决方案
这非常简单,只需一行代码:
const touch = matchMedia('(hover: none)').matches;
- 什么?matchMedia
?
- 这只是一个用于执行 CSS @media 查询的 JS API。现代浏览器支持它:https ://caniuse.com/#feat=matchmedia 。当然,你可以直接在 CSS 中使用这样的查询:
@media (hover: none){
/* touch stuff goes here */
}
- 好的,什么@media 查询也可能有用?
@media (hover: none) and (pointer: coarse) {
/* touchscreens */
}
@media (hover: none) and (pointer: fine) {
/* stylus */
}
@media (hover: hover) and (pointer: coarse) {
/* controllers */
}
@media (hover: hover) and (pointer: fine) {
/* mouse or touchpad */
}
但这只会查询主要输入法。如果你想更深入,你可以使用any-hover
andany-pointer
来查询所有输入设备。
UPD:删除旧浏览器的黑客攻击,似乎大多数旧浏览器也不支持hover
媒体pointer
查询。navigator
您可以使用其他答案中的触摸事件检测和仅触摸属性
UPD2:在您的情况下,最好使用
const touch = matchMedia('(hover: none), (pointer: coarse)').matches;
推荐阅读
- jenkins - Jenkins 流水线执行顺序
- autodesk-forge - 如何获取包含空格的衍生文件?
- java - postgresql JDBC 驱动程序使用客户端时区
- uwp - UWP(桌面桥)应用程序和用户可下载的可执行文件
- stata - xt_tis 是做什么的?
- javascript - 如何在浏览器上运行 node.js 项目?
- java - 如何在 jsf 表单页面中强制执行 reCAPTCHA
- android - CoordinatorLayout 末尾的浮动操作按钮
- amazon-web-services - 如何在 AWS Route53 中将 WWW 添加到域?
- javascript - 为什么此返回不适用于 ajax