:touch CSS伪类或类似的东西?


85

我正在尝试制作一个按钮,以便用户单击它时,按住鼠标按钮时它会更改其样式。如果在移动浏览器中触摸它,我也希望它以类似的方式更改其样式。对我来说,看似显而易见的事情是使用CSS:active伪类,但这没有用。我尝试了:focus,但是也没有用。我尝试:hover,它似乎起作用了,但是当我将手指从按钮上移开后,它仍然保持了样式。所有这些观察都是在iPhone 4和Droid 2上进行的。

是否有任何方法可以在移动浏览器(iPhone,iPad,Android和希望其他浏览器)上复制效果?现在,我正在做这样的事情:

<style type="text/css">
    #testButton {
        background: #dddddd;
    }
    #testButton:active, #testButton.active {
        background: #aaaaaa;
    }
</style>

...

<button type="button" id="testButton">test</button>

...

<script type='text/javascript' src='http://code.jquery.com/jquery-1.6.1.min.js'></script>
<script type='text/javascript'>
    $("*").live("touchstart", function() {
      $(this).addClass("active");
    }).live("touchend", function() {
      $(this).removeClass("active");
    });
</script>

:active伪类适用于桌面浏览器,而活动类适用于触摸式浏览器。

我想知道是否有一种更简单的方法,而无需涉及Javascript。


2
几乎每个触摸浏览器都处理诸如hovermousedown/或mouseup不同的事物,很难容纳所有事物。
乍得

Android和iOS都有:touchstart,:touchmove,:touchend和:touchcancel伪类,您可以使用它们。
保罗·汉伯里

2
我尝试为:touchstart和:touchend伪类设置样式,但它们在iPhone或Droid上不起作用。@Paul Hanbury,您确定不会将CSS伪类与Javascript事件混淆吗?
伊莱亚斯·扎马里亚

1
@ mikez302-我认为您的权利。 plugins.jquery.com/plugin-tags/touchstart
Doug Chamberlain

2
我觉得提交这个答案很愚蠢,但实际上,答案是“不,不可能,您必须使用Javascript。” 您要的不是CSS2或CSS3的一部分。我认为:active不起作用是一个用户代理问题,您可能会在iOS和Android浏览器中将其报告为错误,但是只是为了解决最终用户问题...是的,您必须使用JS 。您可以将兼容性代码包装在对ontouchstart支持检查中
joelhardi 2011年

Answers:


49

:touchW3C规范中没有这样的内容,http://www.w3.org/TR/CSS2/selector.html#pseudo-class-selectors

:active 我认为应该可以工作。

:active/:hover伪类上的顺序对于使其正常运行很重要。

这是上面链接的报价

交互式用户代理有时会响应用户操作来更改呈现。CSS为常见情况提供了三种伪类:

  • :hover伪类在用户指定元素(使用某些定点设备)时适用,但不激活它。例如,当光标(鼠标指针)悬停在由元素生成的框上时,可视用户代理可以应用此伪类。不支持交互式媒体的用户代理不必支持此伪类。一些支持交互式媒体的合格用户代理可能无法支持此伪类(例如,笔设备)。
  • :active伪类在用户激活元素时适用。例如,在用户按下鼠标按钮并释放它的时间之间。
  • :focus伪类适用于元素具有焦点的情况(接受键盘事件或其他形式的文本输入)。

9
我知道没有:touch这样的东西。我想知道是否有类似的事情。:active似乎很合理,但是在我的测试中不起作用。
伊莱亚斯·扎马里亚

@ mikez302-我想你知道我想引用我的消息来源。我同意您的看法,除了我认为该订单非常重要的观点外,我看不出任何其他原因不会起作用。我确实看到有人发布了一些有关IOS和Android的css伪选择器的信息,但我无法与这些技术交流。
道格·张伯伦

在我的示例中,我切换了:active和:hover规则,它似乎没有任何作用。
伊莱亚斯·扎马里亚

36
@ mikez302:使用:active伪类。它应该工作,但在一些浏览器,你需要一个小的黑客攻击,使其工作:附加一个事件处理程序touchstart对身体活动(例如:<body ontouchstart="">
gion_13

5
只需触摸最后一个答案中的@ mikez302评论,它们就是HTML5移动样板中的一个巧妙修复,链接到本文-alxgbsn.co.uk/2011/10/17/…–
Giles Butler

19

由于移动设备不提供悬停反馈,因此,我希望作为用户的用户在点击链接时能够看到即时反馈。我注意到这-webkit-tap-highlight-color是最快的答复(主观)。

将以下内容添加到您的身体中,您的链接将具有点击效果。

body {
    -webkit-tap-highlight-color: #ccc;
}

这似乎是最可靠的,但看起来却不是最好的。背景颜色似乎在元素之外延伸了一些,使其看起来稍大一些。
亚当

@Adam是的,我记得我无法解决这个问题,但是这对我来说并不是一件大事,特别是它会让用户得到他点击的反馈(这是在这段时间内对他们有什么影响)
Abdo 2014年

实际上,通过将函数绑定到document.ontouchstart事件(通过jQuery)(带有一个空的回调),最终使:active伪样式起作用。
亚当

一个不错的主意:-)为此,我完全避免使用javascript。
Abdo 2014年

2
只是共享这-webkit-tap-highlight-color非标准CSS功能,我正在使用:active它,它确实很合适而且很有意义。
里卡多·福恩斯

0

我在移动触摸屏按钮样式方面遇到麻烦。这将解决您的悬停/活动按钮问题。

body, html {
  width: 600px;
}
p {
  font-size: 20px;
}

button {
  border: none;
  width: 200px;
  height: 60px;
  border-radius: 30px;
  background: #00aeff;
  font-size: 20px;
}

button:active {
  background: black;
  color: white;
}

.delayed {
  transition: all 0.2s;
  transition-delay: 300ms;
}

.delayed:active {
  transition: none;
}
<h1>Sticky styles for better touch screen buttons!</h1>

<button>Normal button</button>

<button class="delayed"><a href="https://www.google.com"/>Delayed style</a></button>

<p>The CSS :active psuedo style is displayed between the time when a user touches down (when finger contacts screen) on a element to the time when the touch up (when finger leaves the screen) occures.   With a typical touch-screen tap interaction, the time of which the :active psuedo style is displayed can be very small resulting in the :active state not showing or being missed by the user entirely.  This can cause issues with users not undertanding if their button presses have actually reigstered or not.</p>

<p>Having the the :active styling stick around for a few hundred more milliseconds after touch up would would improve user understanding when they have interacted with a button.</p>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.