:active pseudo-class在移动safari中不起作用

Jes*_*sak 103 css iphone webkit mobile-safari pseudo-class

在iPhone/iPad/iPod上的Webkit中,<a>当您点击元素时,不会触发为标记指定样式:活动伪类.我该如何触发?示例代码:

<style> 
a:active { 
    background-color: red;
}
</style>
<!-- snip -->
<a href="#">Click me</a>
Run Code Online (Sandbox Code Playgroud)

wil*_*age 230

<body ontouchstart="">
    ...
</body>
Run Code Online (Sandbox Code Playgroud)

应用一次,而不是每个按钮元素似乎修复页面上的所有按钮.或者,您可以使用名为" Fastclick "的小型JS库.它可以加快触摸设备上的点击事件并处理这个问题.

  • 仅仅在没有`=""`的情况下添加`ontouchstart`是不够的?(HTML5) (17认同)
  • 任何想法它是如何以这种方式实际工作的? (11认同)
  • 你能解释为什么你把一个空的听众应用到身体上吗?它是如何工作的? (5认同)
  • 对于任何未来的读者,我在这里发布了一个演示:[http://jsbin.com/EjiWILe/3/](http://jsbin.com/EjiWILe/3/).检查iOS设备上的功能. (2认同)
  • 我正在使用:focus,这也适用。感谢魔术。 (2认同)

use*_*216 49

正如其他答案所述,iOS Safari不会触发:active伪类,除非触摸事件附加到元素,但到目前为止这种行为一直是"神奇的".我在Safari开发者库中找到了这个小小的模糊解释它(强调我的):

您还可以将-webkit-tap-highlight-colorCSS属性与设置触摸事件结合使用,以将按钮配置为与桌面类似.在iOS上,鼠标事件发送得如此之快,以至于永远不会收到关闭或活动状态.因此,:active只有在HTML元素上设置了触摸事件时才会触发伪状态 - 例如,在元素上设置ontouchstart时,如下所示:

<button class="action" ontouchstart=""
        style="-webkit-tap-highlight-color: rgba(0,0,0,0);">
    Testing Touch on iOS
</button>
Run Code Online (Sandbox Code Playgroud)

现在,当按下按钮并保持在iOS上时,按钮会变为指定的颜色,而不会出现周围的透明灰色.

换句话说,设置ontouchstart事件(即使它是空的)明确告诉浏览器对触摸事件做出反应.

在我看来,这是有缺陷的行为,可能追溯到"移动"网络基本上不存在的时候(看看链接页面上的那些截图,看看我的意思),一切都是面向鼠标的.值得注意的是,其他更新的移动浏览器,例如在Android上,触摸时显示`:active'伪状态就好了,没有像iOS所需的任何黑客.

(旁注:如果你想在iOS上使用你自己的自定义样式,你也可以:active通过使用-webkit-tap-highlight-colorCSS属性禁用iOS使用的默认灰色半透明框来代替伪状态,如上面相同的链接页面中所述.)


经过一些实验,在所有触摸事件随后冒泡到ontouchstart<body>元素上设置事件的预期解决方案不能完全发挥作用.如果元素中视可见的页面加载时,那么它工作正常,但向下滚动和攻丝那是出了视口的元素并不会引发像它应该伪状态.所以,而不是:active

<!DOCTYPE html>
<html><body ontouchstart></body></html>
Run Code Online (Sandbox Code Playgroud)

将事件附加到所有元素,而不是依赖于冒泡到正文的事件(使用jQuery):

$('body *').on('touchstart', function (){});
Run Code Online (Sandbox Code Playgroud)

但是,我不知道这对性能的影响,所以要小心.


编辑:此解决方案存在一个严重缺陷:在滚动页面时触摸元素将激活:active伪状态.灵敏度太强了.Android通过在显示状态之前引入非常小的延迟来解决此问题,如果页面滚动则会取消.鉴于此,我建议仅在选择元素上使用它.就我而言,我正在开发一个在该领域使用的网络应用程序,它基本上是一个按钮列表,用于导航页面和提交动作.因为在某些情况下整个页面几乎都是按钮,这对我来说不起作用.但是,您可以设置:hover伪状态来填充此内容.禁用默认灰色框后,这非常有效.

  • 很好的解释了**为什么**而不仅仅是**如何**!谢谢! (5认同)
  • 倾向于让开发者理解,而不仅仅是一个"神奇"的食谱.这比其他人的信息量大得多; 谢谢你为我们写这篇文章. (5认同)

Jes*_*sak 39

在<a>标记中为ontouchstart添加事件处理程序.这会导致CSS神奇地工作.

<a ontouchstart="">Click me</a>
Run Code Online (Sandbox Code Playgroud)

  • 对不起,这是旧答案,但为什么这样做呢?我不介意"神奇地"作为一个理由,但如果你能解释它为何起作用,我想读更多细节. (3认同)

dhq*_*inh 7

对我有用:

document.addEventListener("touchstart", function() {},false);
Run Code Online (Sandbox Code Playgroud)

注意:如果您执行此操作,还可以使用以下CSS规则删除Mobile Safari应用的默认点击突出显示颜色.

html {
    -webkit-tap-highlight-color: rgba(0,0,0,0);
}
Run Code Online (Sandbox Code Playgroud)


Ali*_*Ali 6

截至 2016 年 12 月 8 日,已接受的答案 ( <body ontouchstart="">...</body>) 在 Safari 10 (iPhone 5s) 上对我不起作用:该 hack 仅适用于在页面加载时可见的那些元素。

但是,添加:

<script type='application/javascript'>
  document.addEventListener("touchstart", function() {}, false);
</script>
Run Code Online (Sandbox Code Playgroud)

head不工作的方式我想,与缺点,现在还滚动在所有触摸事件触发:active的感动元素伪状态。(如果这对您来说是个问题,您可以考虑使用FighterJet 的 :hover解决方法。)


小智 5

//hover for ios
-webkit-tap-highlight-color: #ccc;
Run Code Online (Sandbox Code Playgroud)

这对我有用,将 CSS 添加到您想要突出显示的元素上