【CSS】使用:active伪类实现移动端页面点按交互效果

5,536 阅读3分钟

想在手机页面上展现类似微信朋友圈的点按效果(如上图),使用css中的伪类:active就可以轻松实现

<style>
.content:active {
    background-color: rgba(0, 0, 0, 0.2);
}
</style>

<p class="content">
The paragraph will get a gray background
</p>

印象中,:link一直是跟着a:link这么用的,其他html元素也能这么用么?答案是——不急,我们将答案揭晓稍作推迟,借此机会先来探究一下:active伪类的相关知识

起源

CSS Level 1中定义了一组伪类,叫Anchor pseudo-classes:link:visited:active

这三个伪类分别负责:链接的样式,链接被点过的样式,以及链接点按时的交互效果。规范明确指出,只有a标签可以使用这几个伪类:

In CSS1, anchor pseudo-classes have no effect on elements other than 'A'.

发展

随着网页技术的不断发展,人们意识到不光是链接需要交互反馈,其他网页元素也需要。于是,CSS Level 2规范将原先a标签的交互行为拆分出来,命名为dynamic pseudo-classes,包含三个伪类:原有的:active,新增的:hover:focus

:active负责在元素被“激活”时的交互效果,比如鼠标按键按下之后、松开之前。
:hover负责元素有(鼠标)指针划过时的交互效果
:focus负责元素获得焦点时的交互效果

作为Web开发者,我们需要注意的细节是,:link:visited:active:hover的书写顺序不能错。对同一CSS属性进行操作,比如字体颜色color,那么书写顺序从先到后应该是:link :visited -> :hover -> :active
道理很简单,根据CSS的优先级规范,同一元素、同一属性的样式,以最后声明的那个为准。试想,如果先写a:hover { color: yellow },那a:link { color: red }就覆盖了color样式,那么即便鼠标指针划过,链接的字体颜色也不会变成黄色。

现在

CSS Level 3对这组伪类没有什么大的更新;CSS Level 4将这组伪类更名为Useraction Pseudo-classes,新增了:focus-visible:focus-within,由于还在草案阶段,浏览器的兼容性还很差,我们就暂且不探究了。

答案

回过头来,看刚才的疑问

:link一直是跟着a:link这么用的,其他html元素也能这么用么?

答案已经明了,是可以。

意外

掏出iPhone试一试,咦?没有效果啊?
拿出Android手机再一试,咦?明明可以啊?
是我们遗漏了规范中的什么细节么?
并不是。

通过翻找 Safari的技术文档,我们会发现文档里有这么一句话:

On iOS, mouse events are sent so quickly that the down or active state is never received. Therefore, the :active pseudo state is triggered only when there is a touch event set on the HTML element—for example, when ontouchstart is set on the element

因此,想要在iOS设备上,使用:active伪类实现点按交互效果,还需要最后一块拼图

<style>
.content:active {
    background-color: rgba(0, 0, 0, 0.2);
}
</style>

<p ontouchstart="()=>{}" class="content">
The paragraph will get a gray background
</p>

参考