触摸屏设备上的 CSS 悬停不会被忽略

Posted

技术标签:

【中文标题】触摸屏设备上的 CSS 悬停不会被忽略【英文标题】:CSS hover not being ignored on touch-screen devices 【发布时间】:2012-12-05 20:46:14 【问题描述】:

我添加了一个带有 html 按钮的 div:

$('.nav').append('<button class="restart">Restart</button>');

该按钮具有用于悬停的 css 属性。我的问题是,当点击触摸屏设备上的按钮时,按钮会保持悬停状态,直到点击另一个元素。

在使用触屏设备浏览时,有什么方法可以忽略悬停属性?

【问题讨论】:

你有type="button"这个属性吗?如果没有,则该按钮默认成为提交按钮。 @Neal 是的,看看规范。 whatwg.org/specs/web-apps/current-work/multipage/… "缺失值默认为提交按钮状态。" @PatrickJamesMcDougle 是的什么是? 什么时候提交过任何形式的表格? @PatrickJamesMcDougle 你错了。一个按钮提交它的表单。如果按钮不在表单中,则无法提交,因为没有可以提交的“默认表单”。所以它不会做任何事情。 【参考方案1】:

我最近遇到了这个确切的问题,ios 似乎将悬停伪视为额外点击,因此链接需要点击两次等。

如果你使用modernizr,你可以通过应用于html标签的.no-touch类来应用你的:hover psuedos。

所以:

html a  color:#222; 

html.no-touch a:hover  color:#111; 

【讨论】:

这里是关于如何在可点击元素上触发事件的 iOS 文档:developer.apple.com/library/IOs/#documentation/…【参考方案2】:

不是一个理想的解决方案,但感谢 @dualed 提供的先机!

@media screen and (min-device-width:768px) and (max-device-width:1024px) /*catch touch screen devices */

    button.restart:hover
    
        /* replicate 'up' state of element */
    

【讨论】:

在纵向插入鼠标的小型笔记本电脑(例如 MS Surface)怎么样?这是一种不太理想的方法。【参考方案3】:

您可以在 CSS 规则中指定媒体类型。

@media handheld 
  button.restart:hover 
    /* undo hover styling */
  

但是,请注意,手持设备不一定有触摸屏。

(顺便说一句。这是 CSS 而不是 jQuery)

【讨论】:

Handheld 不太好用,但是通过在查询中指定 device-width,我有一个解决方案。 @rhastings 可能有效,但可能有其他副作用。您可能必须指定确切的设备大小。遗憾的是 mozilla -moz-touch-enabled 在 webkit 上没有等效的实现。另外,我假设我们正在谈论移动产品的 i-range,请看这里developer.apple.com/library/safari/#documentation/…【参考方案4】:

也许这不是你想要的,但你可以根据媒体指定不同的 css 样式表:

 <link rel="stylesheet" media="screen,projection,tv" href="main.css" type="text/css">
 <link rel="stylesheet" media="print" href="print.css" type="text/css">
 <link rel="stylesheet" media="handheld" href="smallscreen.css" type="text/css">

在上面的例子中,main.css 将用于计算机屏幕,但对于手持设备,它将是 smallscreen.css

【讨论】:

正确,尽管目前几乎所有的触摸设备都将自己报告为“屏幕”,而不是手持设备。【参考方案5】:

一个不错的简单方法是使用Modernizr。

Modernizr 运行时,会在 HTML 的 class 属性中添加一个条目 为它检测到的每个功能添加标签,在该功能前面加上 no- 如果浏览器 不支持。

现在将以下几行添加到您的 css 样式表中

.touch *:hover 
    display: none;

并随意使用 :hover 任意次数。当您在触摸屏中查看您的网站时,所有元素的悬停效果都将被禁用。

【讨论】:

另外,css 中的 * 令人难以置信效率低下。但是,从技术角度来看,这种技术应该可行。

以上是关于触摸屏设备上的 CSS 悬停不会被忽略的主要内容,如果未能解决你的问题,请参考以下文章

jquery防止触摸悬停功能

悬停菜单在触摸设备上不起作用,因为链接被触发

悬停菜单无法在触摸设备上运行,因为链接被触发

移动触摸设备(iPhone、Android、Windows)上的悬停效果

悬停 CSS 上的 iPad/iPhone 触摸事件

基于触摸的设备上的下拉菜单