Answers:
我建议使用modernizr并使用其媒体查询功能。
if (Modernizr.touch){
// bind to touchstart, touchmove, etc and watch `event.streamId`
} else {
// bind to normal click, mousemove, etc
}
但是,使用CSS时,存在伪类,例如Firefox。您可以使用:-moz-system-metric(touch-enabled)。但是,并非所有浏览器都提供这些功能。
对于Apple设备,您可以简单地使用:
if(window.TouchEvent) {
//.....
}
特别是对于Ipad:
if(window.Touch) {
//....
}
但是,这些在Android上不起作用。
Modernizr提供了功能检测功能,并且检测功能是一种很好的编码方式,而不是基于浏览器进行编码。
为此,Modernizer将类添加到HTML标记中。在这种情况下,touch
并且no-touch
使您可以通过.touch前缀您选择风格你触摸相关的方面。例如.touch .your-container
。鸣谢:Ben Swinburne
modernizr
完美的地方:)
Modernizr.touch
测试仅指示浏览器是否支持触摸事件,这不一定反映触摸屏设备。例如,Palm Pre / WebOS(触摸)电话不支持触摸事件,因此无法通过此测试。
touch
和no-touch
让您可以风格你触摸用前缀您选择相关的方面.touch
。例如.touch .your-container
实际上,CSS4媒体查询草稿中有一个属性。
“指针”媒体功能用于查询指针设备(例如鼠标)的存在和准确性。如果设备具有多种输入机制,则建议UA报告主要输入机制中功能最弱的定点设备的特征。该媒体查询采用以下值:
'none'-
设备的输入机制不包括定点设备。“粗略”
-设备的输入机制包括精度有限的定点设备。'精细'
-设备的输入机制包括一个精确的指点设备。
可以这样使用:
/* Make radio buttons and check boxes larger if we have an inaccurate pointing device */
@media (pointer:coarse) {
input[type="checkbox"], input[type="radio"] {
min-width:30px;
min-height:40px;
background:transparent;
}
}
浏览器兼容性可以在以下位置进行测试 Quirksmode下。这些是我的结果(2013年1月22日):
截至2013年中,CSS解决方案似乎尚未广泛使用。代替...
Nicholas Zakas解释说,no-touch
当浏览器不支持触摸时,Modernizr将应用CSS类。
或使用一段简单的代码在JavaScript中进行检测,从而使您能够实现自己的类似Modernizr的解决方案:
<script>
document.documentElement.className +=
(("ontouchstart" in document.documentElement) ? ' touch' : ' no-touch');
</script>
然后,您可以将CSS编写为:
.no-touch .myClass {
...
}
.touch .myClass {
...
}
媒体类型不允许您将触摸功能检测为标准的一部分:
http://www.w3.org/TR/css3-mediaqueries/
因此,无法通过CSS或媒体查询一致地执行此操作,您将不得不求助于JavaScript。
无需使用Modernizr,您只需使用普通的JavaScript:
<script type="text/javascript">
var is_touch_device = 'ontouchstart' in document.documentElement;
if(is_touch_device) alert("touch is enabled!");
</script>
window.touch
&& window.TouchEvent
仅适用于Apple设备。
在2017年,来自第二个答案的CSS媒体查询仍无法在Firefox上运行。我为此找到了一个解决方案:-moz-touch-enabled
因此,这是跨浏览器的媒体查询:
@media (-moz-touch-enabled: 1), (pointer:coarse) {
.something {
its: working;
}
}
-moz-touch-enabled
将不再需要
-moz-touch-enabled
Firefox 58+可能不支持。同样,此解决方案不涵盖Firefox 58-63(因为Firefox 64+支持指针查询)。来源:developer.mozilla.org/en-US/docs/Web/CSS/@media/…–
实际上有一个媒体查询:
@media (hover: none) { … }
除了Firefox之外,它还受到很好的支持。Safari和Chrome是移动设备上最常见的浏览器,它可能需要足够的使用才能被广泛采用。
在所有浏览器都全局支持CSS4之前,此解决方案将一直有效。当那一天到来时,请使用CSS4。但是直到那时,这对于当前的浏览器仍然有效。
browser-util.js
export const isMobile = {
android: () => navigator.userAgent.match(/Android/i),
blackberry: () => navigator.userAgent.match(/BlackBerry/i),
ios: () => navigator.userAgent.match(/iPhone|iPad|iPod/i),
opera: () => navigator.userAgent.match(/Opera Mini/i),
windows: () => navigator.userAgent.match(/IEMobile/i),
any: () => (isMobile.android() || isMobile.blackberry() ||
isMobile.ios() || isMobile.opera() || isMobile.windows())
};
负载:
旧方法:
isMobile.any() ? document.getElementsByTagName("body")[0].className += 'is-touch' : null;
较新的方式:
isMobile.any() ? document.body.classList.add('is-touch') : null;
如果设备具有触摸屏,则上面的代码会将“ is-touch”类添加到body标签。现在,您的Web应用程序中将有CSS用于:hover的任何位置都可以调用body:not(.is-touch) the_rest_of_my_css:hover
例如:
button:hover
变成:
body:not(.is-touch) button:hover
该解决方案避免使用现代化器,因为现代化器库是一个很大的库。如果您要做的就是检测触摸屏,那么当需要最终编译源的大小时,这将是最好的选择。
我可以使用此方法解决此问题
@media (hover:none), (hover:on-demand) {
Your class or ID{
attributes
}
}
on-demand
:已经从规范,从浏览器删除github.com/w3c/csswg-drafts/commit/...