解读 hidden=until-found 属性

本篇依然来自于我们的 《前端周刊》 项目!

由团队成员 嘿嘿 翻译,他的文章风格稳健而清晰,注重结构与逻辑的严谨性,善于用简洁的语言将复杂技术拆解成易于理解的知识点~

欢迎大家 进群 与他探讨,并持续追踪全球前端领域的最新动态!

原文地址:css-tricks.com/covering-hi...

我第一次发现这个功能是在 Firefox 139 发布说明 中,我当时心想:噢,有意思 。然后我发现 Chrome 早在 2022 年就已经支持了。写到一半的时候,又看到 它已经在 Safari Technology Preview 125 中上线。嗯,这就是现状。

已经有一些不错的文章和教程在介绍 hidden=until-found,于是我决定记下一些要点,方便以后查阅。

它让隐藏内容"可被搜索"

简而言之:在 HTML 元素上加上 hidden=until-found,就能让该元素中隐藏的内容在浏览器的页面内搜索中被找到。

HTML 复制代码
<div hidden="until-found">
  <!-- 隐藏内容 -->
</div>

你会看到(或者更准确地说,不会看到)内容被隐藏了:

本质上是 content-visibility: hidden

浏览器会把这个属性当作提示,从而在用户代理样式(user agent styles)上隐式地设置 content-visibility: hidden 来隐藏内容。

如果我们按下 Ctrl + F 来启用页面内搜索,输入一个查询词,匹配的内容就会显示出来,并高亮该匹配词。

我们为什么需要它

当我深入研究时,我自己也在问这个问题。最典型的示例来自 Chrome for Developers 文档,用作一个"伪手风琴(accordion)"。也就是一组可点击展开/收起的面板。

codepen.io/web-dot-dev...

但既然现在我们已经有了 [<details>](https://css-tricks.com/using-styling-the-details-element/)元素,这不是已经解决了吗?毕竟它就是一个语义化的披露控件,用来 披露内容 。实际上,浏览器在 <details> 元素的 ::details-content 部分也会设置 content-visibility: hidden 来隐藏内容。

我敢说 <details> 在 2022 年时并没有像今天这样广泛支持。它现在实际上是 Interop 2025 的一部分,其中提到的一个功能就是页面内搜索的能力。Chrome 已经支持它,Firefox 最近也上线了(大概是 hidden=until-found 发布的一部分),Safari 预计也会在 Interop 2025 中支持。Chrome 文档的例子实际上是一种绕过 <details> 不完全支持的做法,而如今 <details> 已经逐步补齐。

那么,为什么要有 hidden=until-found

我不确定。肯定有某些场景需要以一种可访问的方式隐藏内容,同时仍然让它能被搜索。但我一时想不到。比如说,我们还有 popover,不过它用的是 display: none,会把内容彻底从页面内搜索中移除。

浏览器支持和 polyfill

我们已经知道 Chrome 和 Firefox 都支持该功能,不过 Safari 还没有。但既然 <details> 的可搜索内容已经被列入 Interop 2025(Firefox 也因此增加了支持),我觉得 Safari 很快也会跟上。(事实证明没错,它已经在 Safari Technology Preview 125 中上线。)

那么问题来了:在此之前,hidden=until-found 值得用吗?如果我们追求一致的跨浏览器体验,就得在 content-visibility: hiddencontent-visibility: auto 之间来回切换。

Nathan Knowler 很专业地解释了其中的困境。我们无法在某个元素上直接用 content-visibility: hidden,因为那样会把它从页面内搜索中移除。而 hidden=until-found 的作用与 content-visibility: hidden 一样,但仍然保持可搜索。换句话说,我们没法用 content-visibility 来 polyfill 这个功能。

感谢 Nathan,他深入探索,提出了一个利用 Shadow DOM 的解决方案:检测 HTML 属性、检查支持情况,并在必要时回退其属性,以一种既可访问又不完全移除搜索能力的方式来隐藏内容。

样式(Styling)

对一个本来不可见的东西来说,似乎没什么可说的样式问题。但注意,页面内搜索功能会高亮匹配的内容。

看起来我们可能会迎来一个新的 ::search-text 伪元素,它允许我们选中匹配的搜索内容并设置高亮颜色,这在 CSS Pseudo-Elements Module Level 4 规范 中目前还是 Editor's Draft 状态。

那如果有多个匹配呢?当前匹配和之后的匹配会有不同的高亮样式。

根据规范,我们大概可以把 ::search-text:current 伪类组合,来选中当前匹配:::search-text:current

如果你以为还能把 ::search-text:past:future 伪类混合使用,那恐怕要失望了。规范明确说这是无效的。但它也没有完全关上大门:

:past:future 伪类保留供将来使用。任何与 ::search-text 的不支持组合 必须 被视为无效。

还有别的吗?

没有太多了,但我很喜欢 Christian Shaefer 在 "Rethinking Find-in-Page Accessibility" 文章结尾的提示:我们需要考虑在搜索匹配后 接下来会发生什么。目前,在关闭或取消页面内搜索后,内容依然保持可见。也许我们还需要另一个 HTML 提示来解决这个问题。

参考链接

以下是我研究过程中用到的一些资料:

相关推荐
代码老y1 分钟前
十年回望:Vue 与 React 的设计哲学、演进轨迹与生态博弈
前端·vue.js·react.js
一条上岸小咸鱼7 分钟前
Kotlin 基本数据类型(五):Array
android·前端·kotlin
zzywxc78710 分钟前
详细探讨AI在金融、医疗、教育和制造业四大领域的具体落地案例,并通过代码、流程图、Prompt示例和图表等方式展示这些应用的实际效果。
开发语言·javascript·人工智能·深度学习·金融·prompt·流程图
大明8810 分钟前
用 mouseover/mouseout 事件代理模拟 mouseenter/mouseleave
前端·javascript
小杨梅君12 分钟前
vue3+vite中使用自定义element-plus主题配置
前端·element
一个专注api接口开发的小白17 分钟前
Python + 淘宝 API 开发:自动化采集商品数据的完整流程
前端·数据挖掘·api
林太白17 分钟前
Nuxt.js搭建一个官网如何简单
前端·javascript·后端
晴空雨18 分钟前
一个符号让 indexOf 判断更优雅!JavaScript 位运算的隐藏技巧
前端·javascript
摸着石头过河的石头18 分钟前
前端调试全攻略:从PC到移动端的一站式实战指南
前端·debug
小猪猪屁20 分钟前
🚀 用 Nuxt3 打造公司官网:一场从 0 到 1 的实战冒险
前端