Iphone :活动伪类不';我不能在移动狩猎中工作
在iPhone/iPad/iPod上的Webkit中,为Iphone :活动伪类不';我不能在移动狩猎中工作,iphone,css,webkit,mobile-safari,pseudo-class,Iphone,Css,Webkit,Mobile Safari,Pseudo Class,在iPhone/iPad/iPod上的Webkit中,为在标记中添加ontouchstart的事件处理程序。这使得CSS神奇地工作 点击我 您使用的是所有的伪类还是只有一个?如果您至少使用了两个,请确保它们的顺序正确,否则它们都会损坏: a:link a:visited a:hover a:active …按顺序。此外,如果您只是使用:active,请添加一个:链接,即使您没有对其进行样式设置。 ... 只应用一次,而不是每个按钮元素似乎修复了页面上的所有按钮。或者,您可以使用这个名为“”的
在标记中添加ontouchstart的事件处理程序。这使得CSS神奇地工作
点击我
您使用的是所有的伪类还是只有一个?如果您至少使用了两个,请确保它们的顺序正确,否则它们都会损坏:
a:link
a:visited
a:hover
a:active
…按顺序。此外,如果您只是使用:active,请添加一个:链接,即使您没有对其进行样式设置。
...
只应用一次,而不是每个按钮元素似乎修复了页面上的所有按钮。或者,您可以使用这个名为“”的小JS库。它加快了触摸设备上的点击事件并解决了这个问题。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title></title>
<style>
a{color: red;}
a:hover{color: blue;}
</style>
</head>
<body>
<div class="main" role="main">
<a href="#">Hover</a>
</div>
</body>
</html>
a{颜色:红色;}
a:悬停{颜色:蓝色;}
这对我来说很有效,添加到你想要突出显示的元素的CSS中。正如其他答案所述,iOS Safari不会触发
:active
伪类,除非元素上附加了触摸事件,但到目前为止,这种行为是“神奇的”。我在网站上看到了这个小广告,它解释了这一点(我的重点):
您还可以使用-webkit tap highlight color
CSS属性,结合设置触摸事件来配置按钮,使其行为类似于桌面在iOS上,鼠标事件发送得如此之快,以至于从未接收到“关闭”或“活动”状态。因此,只有在HTML元素上设置了触摸事件时才会触发:active
伪状态,例如,在元素上设置了ontouchstart,如下所示:
<button class="action" ontouchstart=""
style="-webkit-tap-highlight-color: rgba(0,0,0,0);">
Testing Touch on iOS
</button>
将事件附加到所有元素,而不是依赖于冒泡到主体的事件(使用jQuery):
然而,我不知道这对性能的影响,所以要小心
编辑:此解决方案存在一个严重缺陷:即使在滚动页面时触摸元素,也会激活
:active
伪状态。敏感性太强了。Android通过在状态显示之前引入一个非常小的延迟来解决这个问题,如果页面被滚动,这个延迟就会被取消。有鉴于此,我建议仅在选定的元素上使用此选项。在我的例子中,我正在开发一个web应用程序,用于该领域,它基本上是一个按钮列表,用于导航页面和提交操作。因为在某些情况下,整个页面几乎都是按钮,这对我不起作用。但是,您可以将:hover
伪状态改为填充此状态。禁用默认灰色框后,此选项将非常有效。没有100%与此问题相关,
但您也可以使用css同级黑客来实现这一点
HTML
如果您想使用纯html/css工具提示
span {
display: none;
}
input {
&:checked ~ span {
display: block;
}
}
截至2016年12月8日,公认的答案(
…
)对我在Safari 10(iPhone 5s)上不起作用:这种破解只适用于页面加载时可见的元素
不过,加入:
addEventListener(“touchstart”,function(){},false);
到头部
确实按照我想要的方式工作,缺点是现在滚动期间的所有触摸事件也会触发被触摸元素上的:active
伪状态。(如果这对你来说是个问题,你可能会考虑<代码>:悬停解决方法。)为我工作:
document.addEventListener("touchstart", function() {},false);
注意:如果您使用此技巧,还需要删除默认的点击-高亮显示颜色Mobile Safari,使用以下CSS规则
html {
-webkit-tap-highlight-color: rgba(0,0,0,0);
}
我已经发布了一个工具,可以为您解决这个问题 从表面上看,这个问题看起来很简单,但实际上,触摸和点击行为需要大量定制,包括超时功能和类似“滚动链接列表时会发生什么”或“按下链接然后将鼠标/手指从活动区域移开时会发生什么”之类的事情 这应该一次解决所有问题: 您需要将:活动样式分配给.active类,或者选择自己的类名。默认情况下,脚本将使用所有链接元素,但您可以使用自己的选择器数组覆盖它
非常感谢诚实、有益的反馈和贡献 解决方案是依靠
:target
而不是:active
:
<style>
a:target {
background-color: red;
}
</style>
<!-- snip -->
<a id="click-me" href="#click-me">Click me</a>
对于不想使用ontouchstart的用户,您可以使用此代码
<script>
document.addEventListener("touchstart", function(){}, true);
</script>
addEventListener(“touchstart”,function(){},true);
我尝试了它的各种版本,但似乎没有一个能可靠地工作(我不喜欢用“魔法”来处理这样的东西)。因此,我做了以下工作,这在所有平台上都能完美运行,不仅仅是苹果公司:
:active
的css声明重命名为.active
pointerdown/mousedown/touchtstart
事件处理程序以应用.active
类和pointerup/mouseup/touchend
事件处理程序以将其删除。使用jQuery:
$('body *').on('touchstart', function (){});
let controlActivationEvents = window.PointerEvent ? "pointerdown" : "touchstart mousedown";
let controlDeactivationEvents = window.PointerEvent ? "pointerup pointerleave" : "touchend mouseup mouseleave";
let clickableThings = '<comma separated list of selectors>';
$(clickableThings).on(controlActivationEvents,function (e) {
$(this).addClass('active');
}).on(controlDeactivationEvents, function (e) {
$(this).removeClass('active');
});
让controlActivationEvents=window.PointerEvent?“指针向下”:“touchstart mousedown”;
让controlDeactivationEvents=window.PointerEvent?“pointerup pointerleave”:“touchend mouseup mouseleave”;
让clickableThings='';
$(clickableThings).on(controlActivationEvents,函数(e){
$(this.addClass('active');
}).on(控制停用事件,功能(e){
$(this.removeClass('active');
});
这有点乏味,但现在我有了一个解决方案,它不太容易在苹果操作系统版本之间被破坏。(谁需要这样的中断?在没有
=”
的情况下,简单地将添加到TouchStart
就足够了吗?(HTML5)对于未来的读者,我在这里发布了一个演示:。检查你的iOS设备上的功能。你能解释一下为什么你对body应用了一个空的侦听器吗?它是如何工作的?我用了:focus和t
html {
-webkit-tap-highlight-color: rgba(0,0,0,0);
}
<style>
a:target {
background-color: red;
}
</style>
<!-- snip -->
<a id="click-me" href="#click-me">Click me</a>
<script>
document.addEventListener("touchstart", function(){}, true);
</script>
let controlActivationEvents = window.PointerEvent ? "pointerdown" : "touchstart mousedown";
let controlDeactivationEvents = window.PointerEvent ? "pointerup pointerleave" : "touchend mouseup mouseleave";
let clickableThings = '<comma separated list of selectors>';
$(clickableThings).on(controlActivationEvents,function (e) {
$(this).addClass('active');
}).on(controlDeactivationEvents, function (e) {
$(this).removeClass('active');
});