强大的CSS:focus-visible伪类真的太6了!

作者 : 开心源码 本文共1452个字,预计阅读时间需要4分钟 发布时间: 2022-05-12 共219人阅读

一、快速理解CSS :focus-visible伪类

:focus-visible伪类是非常年轻的一个伪类,目前仅Chrome浏览器标准支持,但足够了。假如你是一个深入客户体验的开发者,这个伪类会非常有用。

:focus-visible伪类应用的场景是:元素聚焦,同时聚焦轮廓浏览器认为应该显示。

是不是很拗口?规范就是这么定义的。:focus-visible的规范并没有强行束缚匹配逻辑,而是交给了UA(也就是浏览器)。我们通过真实的案例来解释下这个伪类是做什么用的。

在所有现代浏览器下,链接元素<a>鼠标点击的时候是不会有焦点轮廓的,但是键盘访问的时候会出现,这是非常符合预期的体验。

但是在Chrome浏览器下,出现了少量特殊场景并不是这么体现的:

  1. 设置了背景的<button>按钮;
  2. HTML5 <summary>元素;
  3. 设置了HTML tabindex属性的元素;

以上3个场景,在Chrome浏览器下鼠标点击的时候也会出现显眼的焦点轮廓,如下图:

这其实是我们不希望看到的,轮廓在点击的时候不应该出现(没有高亮的必要),但是键盘访问的时候需要出现(让客户知道当前聚焦元素),Firefox以及IE浏览器的体现均符合我们的期望,点击访问无轮廓,键盘访问才有,Safari浏览器按钮体现符合期望。

但是,我们又不能简简单单设置outline:none来解决,由于这样会把键盘访问时候应当出现的焦点轮廓给隐藏掉,带来严重的无障碍访问问题。

为了兼顾视觉体验和键盘无障碍访问,我之前的做法是使用JavaScript进行判断,假如元素的:focus触发是键盘访问触发,就给元素增加自己设置的outline轮廓,否则,去除outline,还是颇有成本的。

现在有了:focus-visible伪类,所有的问题迎刃而解,在目前版本的Chrome浏览器下,浏览器认为键盘访问触发的元素聚焦才是:focus-visible所表示的聚焦。换句话说,:focus-visible可以让我们知道元素的聚焦行为究竟是鼠标触发还是键盘触发。所以,假如我们希望去除鼠标点击时候的outline轮廓,而保留键盘访问时候的outline轮廓,只需一条短短的CSS规则即可以了:

:focus:not(:focus-visible) {    outline: 0;}

Chrome浏览器下让人头疼的轮廓问题就处理了,眼见为实,您可以狠狠地点击这里::focus-visible与Chrome浏览器outline轮廓控制demo

此时,我们点击设置了tabindex属性的<div>元素没有轮廓,如下图:

但是,假如我们使用键盘访问,例如按下TAB键进行索引,轮廓仍然存在,如如下图:

完美,感动!

二、应该很快就会默认支持

目前Chrome浏览器(版本67+就支持)尽管支持,但是,需要浏览器开启支持web试验特性才行:

但是我相信,很快就会默认放开,都时候,之前写UI组件时候折腾的一大堆体验相关的JavaScript代码即可以一律删掉了。

假如你迫不及待想在项目中应用这么好的特性,可以引入这段polyfill脚本。

自己是一个五年的前台工程师,希望本文对你有帮助!

这里推荐一下我的前台学习交流扣qun:731771211 ,里面都是学习前台的,假如你想制作酷炫的网页,想学习编程。自己整理了一份2019最全面前台学习资料,从最基础的HTML+CSS+JS【炫酷特效,游戏,插件封装,设计模式】到手机端HTML5的项目实战的学习资料都有整理,送给每一位前台小伙伴,每天分享技术

点击:加入

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 强大的CSS:focus-visible伪类真的太6了!

发表回复