Firefox 88 永远不会太晚

四月份已经到来,我们为您带来了最及时的版本 - Firefox 88。在这个版本中,您会发现许多不错的 CSS 添加,包括 :user-valid:user-invalid 支持和 image-set() 支持,对正则表达式匹配索引的支持,为了增强安全性而删除对 FTP 协议的支持等等!

这篇文章只是提供了一些亮点,所有细节请查看以下内容:

:user-valid 和 :user-invalid

有大量与 HTML 表单相关的伪类,允许我们为各种数据有效性状态指定样式,正如您在我们 UI 伪类 教程中看到的那样。Firefox 88 引入了两个新的伪类 - :user-valid:user-invalid

您可能在想:“我们已经有了 :valid:invalid 用于为包含有效或无效数据的表单指定样式 - 这里有什么区别?”

:user-valid:user-invalid 类似,但设计时更注重用户体验。它们实际上做着同样的事情 - 匹配包含有效或无效数据的表单输入 - 但 :user-valid:user-invalid 只有在用户停止关注该元素后才会开始匹配(例如,通过 tab 键切换到下一个输入)。这是一个细微但有用的变化,我们现在将演示它。

以我们的 valid-invalid.html 示例为例。它使用以下 CSS 来提供明确的指示,说明哪些字段包含有效和无效数据

input:invalid {
  border: 2px solid red;
}

input:invalid + span::before {
  content: '✖';
  color: red;
}

input:valid + span::before {
  content: '✓';
  color: green;
}

当您尝试在“电子邮件地址”字段中输入数据时,就会出现问题 - 一旦您开始在该字段中输入电子邮件地址,无效样式就会出现,并且一直持续到输入的文本构成有效的电子邮件地址为止。这种体验可能有点让人不适,让用户认为他们做错了什么,而实际上没有。

现在考虑我们的 user-valid-invalid.html 示例。它包含几乎相同的 CSS,只是它使用更新的 :user-valid:user-invalid 伪类

input:user-invalid {
  border: 2px solid red;
}

input:user-invalid + span::before {
  content: '✖';
  color: red;
}

input:user-valid + span::before {
  content: '✓';
  color: green;
}

在这个示例中,有效/无效样式只在用户输入完值并移除了对输入框的焦点后才会出现,给了他们一个机会输入完整的价值,然后再收到反馈。好多了!

注意:在 Firefox 88 之前,可以使用专有的 :-moz-ui-invalid:-moz-ui-valid 伪类来实现相同的效果。

image-set() 支持

image-set() 函数在 CSS 中提供了一种机制,允许浏览器从选项列表中为设备的分辨率选择最合适的图像,这类似于 HTML srcset 属性。例如,以下代码可用于提供多个 background-image 供选择

div {
  background-image: image-set(
    url("small-balloons.jpg") 1x,
    url("large-balloons.jpg") 2x);
}

您还可以使用 image-set() 作为 contentcursor 属性的值。因此,例如,您可以为生成的 content 提供多种分辨率

h2::before {
  content: image-set(
    url("small-icon.jpg") 1x,
    url("large-icon.jpg") 2x);
}

或自定义光标

div {
  cursor: image-set(
    url("custom-cursor-small.png") 1x,
    url("custom-cursor-large.png") 2x),
    auto;
}

outline 现在遵循 border-radius 形状

outline CSS 属性已更新,现在它遵循由 border-radius 创建的 outline 形状。看到 Firefox 修复了这个长期存在的问题,真是太好了。作为这项工作的一部分,非标准的 -moz-outline-radius 属性已被删除。

RegExp 匹配索引

Firefox 88 支持正则表达式的 **匹配索引** 功能,该功能使 indices 属性可用,该属性包含一个数组,用于存储每个匹配的捕获组的起始和结束位置。此功能通过 d 标志启用。

还有一个相应的 hasIndices 布尔属性,允许您检查正则表达式是否启用了此模式。

因此,例如

const regex1 = new RegExp('foo', 'd');
regex1.hasIndices // true
const test = regex1.exec('foo bar');
test // [ "foo" ]
test.indices // [ [ 0, 3 ] ]

有关更多有用信息,请参阅我们的 RegExp.prototype.exec() 页面,以及 V8 开发者博客上的 RegExp 匹配索引

FTP 支持已禁用

从 Firefox 88 开始,FTP 支持已被禁用,并计划(目前)在 Firefox 90 版本中完全移除。解决此安全风险可以降低攻击的可能性,同时还删除对非加密协议的支持。

为了补充这一变化,扩展设置 browserSettings.ftpProtocolEnabled 已变为只读,现在 Web 扩展程序可以将其自身注册为 FTP 的 协议处理程序

关于 Chris Mills

Chris Mills 是 Mozilla 的高级技术作家,负责编写有关开放式 Web 应用、HTML/CSS/JavaScript、A11y、WebAssembly 等方面的文档和演示。他喜欢摆弄 Web 技术,并在会议和大学偶尔进行技术演讲。他以前曾在 Opera 和 W3C 工作,喜欢演奏重金属鼓和喝好啤酒。他和他的妻子以及三个美丽的孩子住在英国曼彻斯特附近。

Chris Mills 的更多文章…


6 条评论

  1. Taha

    很棒!
    期待使用新的 RegEx 匹配索引功能。

    2021 年 4 月 19 日 23:14

  2. Marysam

    我更喜欢在我的平板电脑上使用 Firefox

    2021 年 4 月 20 日 06:38

  3. 匿名

    user-valid-invalid 示例中是否存在 bug?电子邮件地址验证似乎没有等到更改焦点。

    重现步骤
    1. 打开 user-valid-invalid 示例
    2. 在电子邮件地址字段中输入“test”
    3. 按 tab 键退出 - 该字段被标记为无效
    4. 重新选择电子邮件字段并附加“@test”

    预期结果
    1. 勾号应该只在您按 tab 键退出时才会出现

    实际结果
    1. 勾号立即出现,即使在更改焦点之前也是如此

    2021 年 4 月 20 日 08:47

    1. Chris Mills

      嗯,看起来你说得对。也许我对这里行为的理解存在偏差……似乎

      1. 当状态从未输入任何值变为有效或无效时,它只会在字段失去焦点时才会发生变化。
      2. 当状态从有效变为无效时,它只会在字段失去焦点时才会发生变化
      3. 当状态从无效变为有效时,它会在值发生变化时立即发生变化……

      2021 年 4 月 20 日 09:00

  4. Flimm

    有没有办法使用 image-set 指定多个图像格式,类似于 <picture> 元素可以指定多个图像格式的方式?我正在寻找一种方法来指示浏览器,如果它不支持首选图像格式,则回退到不同的图像格式。

    2021 年 4 月 26 日 04:13

    1. Chris Mills

      是的,有,它将在 Firefox 89 中推出;请参阅 https://bugzilla.mozilla.org/show_bug.cgi?id=1695404

      2021 年 4 月 26 日 04:58

本文评论已关闭。