媒体查询以检测设备是否为触摸屏

JJJ*_*jim 117 css touch media-queries

使用媒体查询时最安全的方法是什么,以便在不在触摸屏设备上时发生某些事情?如果没有办法,你建议使用像!window.TouchModernizr 这样的JavaScript解决方案吗?

Zna*_*kus 156

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我还在Chromium项目中找到与此相关的票.

可以在Quirksmode上测试浏览器兼容性.这些是我的结果(2013年1月22日):

  • Chrome/Win:有效
  • Chrome/iOS:不起作用
  • Safari/iOS6:不起作用

  • 当所提供的解决方案即使根据海报不起作用时,如何能够得到最多的答案? (3认同)
  • 浏览器对此的支持不再那么糟糕:Edge,Chrome,Safari,iOS和Android.请参阅:http://caniuse.com/#feat=css-media-interaction (3认同)
  • 今天在 Chrome、Firefox 和 Safari 应用程序 (iOS 14.4) 上进行了测试,一切正常 (3认同)
  • 好答案。另外:https://developer.mozilla.org/zh-CN/docs/Web/CSS/@media/hover (2认同)

Sim*_*ast 49

截至2013年中期,CSS解决方案似乎没有广泛使用.代替...

  1. Nicholas Zakas解释说,no-touch当浏览器不支持触摸时,Modernizr会应用CSS类.

  2. 或者使用简单的代码在JavaScript中检测,允许您实现自己的类似Modernizr的解决方案:

    <script>
        document.documentElement.className += 
        (("ontouchstart" in document.documentElement) ? ' touch' : ' no-touch');
    </script>
    
    Run Code Online (Sandbox Code Playgroud)

    然后你可以把你的CSS写成:

    .no-touch .myClass {
        ...
    }
    .touch .myClass {
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)


Sta*_*arx 37

我建议使用modernizr并使用其媒体查询功能.

if (Modernizr.touch){
   // bind to touchstart, touchmove, etc and watch `event.streamId`
} else {
   // bind to normal click, mousemove, etc
}
Run Code Online (Sandbox Code Playgroud)

但是,使用CSS,有类似的伪类,例如在Firefox中.您可以使用:-moz-system-metric(启用触摸).但是这些功能并非适用于所有浏览器.

对于Apple设备,您可以简单地使用:

if(window.TouchEvent) {
   //.....
}
Run Code Online (Sandbox Code Playgroud)

特别是对于Ipad:

if(window.Touch) {
    //....
}
Run Code Online (Sandbox Code Playgroud)

但是,这些在Android上不起作用.

Modernizr提供了功能检测功能,检测功能是一种很好的编码方式,而不是基于浏览器的编码.

造型触摸元素

为了这个目的,Modernizer为HTML标记添加了类.在这种情况下,touch并且no-touch使您可以通过.touch前缀您选择风格你触摸相关的方面.例如.touch .your-container.致谢:Ben Swinburne

  • "Modernizr.touch"测试仅指示浏览器是否支持触摸事件,触摸事件不一定反映触摸屏设备.例如,Palm Pre/WebOS(触摸)手机不支持触摸事件,因此无法通过此测试. (18认同)
  • 只是为了补充一点,如果你还要包括现代化者; 为了这个目的,Modernizer为body标签添加了类.在这种情况下,"触摸"和"不触摸",这样您就可以通过在选择器前添加".touch"来设置触摸相关方面的样式.例如`.touch .your-container` (5认同)
  • 对我来说,似乎modernizr将触摸类添加到html标记,而不是body标记. (2认同)
  • 在悬停:无查询中使用 :hover 有意义吗?在那种情况下它什么也做不了,对吧?也许你想要悬停:悬停? (2认同)

Ale*_*x W 34

媒体类型不允许您将触摸功能检测为标准的一部分:

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>
Run Code Online (Sandbox Code Playgroud)

  • @vsync Modernizr是一个很好的方法,可以让所有测试对于一个有色的库中的开发人员有用,因为他们每次需要测试特定功能时都不需要Google,比如触摸事件并且必须找到这个页面.仅供参考,我们有一个自定义的Modernizr版本,您可以使用所需的测试进行自定义.这是在项目之间以相同的方式测试功能的好方法,要么使用JS语法(即:Modernizr.touch),要么使用CSS类(.touch .my-element {}).我认为这是对人类智能的侮辱,并没有意识到我们每次都可以在不重新发明轮子的情况下做事. (21认同)
  • 好吧,我已经完成了数百个项目,而且我从来不需要这样的东西,在大多数情况下,你需要的只是一小组测试,我想说的(在大多数情况下)不超过5个,所以只需查找这5个并直接将它们放入您的代码中,无需实际访问Modernizer网站,进行自定义构建,将其包含在您的页面中,或其他任何内容.开发人员不应该那么懒惰.Web开发人员应始终具有"如何使代码更轻?"的思维模式.恕我直言,多年的经验.现在开发人员似乎喜欢包括大量的脚本:/ (10认同)
  • 有人说懒惰.我说为什么重新发明轮子?当新设备/版本/平台出现并且您的特殊情况需要更改时怎么办?您是否a)尝试自己计算特殊情况检测代码,并向后移植到您的自定义代码,在此过程中重新认识自己,或者b)下载更新版本的Modernizr并将其放入?我知道我会做什么.+1到GarciaWebDev. (2认同)

小智 26

2017年,第二个答案的CSS媒体查询仍无法在Firefox上运行.我找到了一个解决方案:-moz-touch-enabled


所以,这里是跨浏览器媒体查询:

@media (-moz-touch-enabled: 1), (pointer:coarse) {
    .something {
        its: working;
    }
}
Run Code Online (Sandbox Code Playgroud)


Buz*_*zut 17

实际上有一个媒体查询:

@media (hover: none) { … }
Run Code Online (Sandbox Code Playgroud)

除了Firefox之外,它得到了相当好的支持.Safari和Chrome是移动设备上最常见的浏览器,它可能足够采用.

  • ... FF在接下来的几周内也将提供支持。 (2认同)

小智 10

这将起作用。如果它不让我知道

@media (hover: none) and (pointer: coarse) {
    /* Touch screen device style goes here */
}
Run Code Online (Sandbox Code Playgroud)

编辑:不再支持按需悬停