文本片段

文本片段允许直接链接到 Web 文档中特定部分的文本,而无需作者使用 ID 对其进行注释,只需在 URL 片段中使用特定的语法即可。支持的浏览器可以自由选择如何引起对链接文本的注意,例如使用颜色突出显示和/或滚动到页面上的内容。这很有用,因为它允许 Web 内容作者深度链接到他们无法控制的其他内容,而无需依赖 ID 的存在来实现此目的。在此基础上,它可以用于为用户生成更有效的 内容共享链接以互相传递。

概念和用法

从历史上看,Web 的关键特性之一始终是它能够在不同的文档之间提供链接——正是它构成了万维网,一个网络。

链接到特定文档片段的问题在于,链接页面的作者需要放置一个锚点才能真正链接到。上面的第二个示例链接到一个具有 ID 为 browser_compatibilityh2 元素。

html
<h2 id="browser_compatibility">
  <a href="#browser_compatibility">Browser compatibility</a>
</h2>

如果更改或删除了 ID,则会忽略文档片段,并且链接仅链接到页面的顶部。就优雅降级而言,这是合理的,但如果链接的作者可以完全控制他们链接到的位置,而无需依赖页面作者,那可以说会更好。

文本片段使之成为现实——它们允许链接作者以灵活的方式指定要链接到的文本内容,而不是文档片段。

语法

与文档片段类似,文本片段附加在哈希符号 (#) 之后的 URL 上。但是语法略有不同。

url
https://example.com#:~:text=[prefix-,]textStart[,textEnd][,-suffix]

需要理解的关键部分如下:

:~:

也称为片段指令,此字符序列告诉浏览器接下来的是一个或多个用户代理指令,这些指令在加载过程中会从 URL 中剥离,以便作者脚本无法直接与它们交互。用户代理指令也称为指令。

text=

文本指令。这为浏览器提供了一个文本片段,定义了要在链接文档中链接到的文本。

textStart

指定链接文本开头的文本字符串。

textEnd 可选

指定链接文本结尾的文本字符串。

prefix- 可选

一个文本字符串,后跟一个连字符,指定什么文本应该紧接在链接文本之前,只允许在其间使用空格。这有助于浏览器在有多个匹配项的情况下选择正确的链接文本。

-suffix 可选

一个连字符,后跟一个文本字符串,指定什么文本应该紧接在链接文本之后,只允许在其间使用空格。这有助于浏览器在有多个匹配项的情况下选择正确的链接文本。

支持的浏览器将滚动到并突出显示链接文档中第一个与指定指令匹配的文本片段。请注意,可以通过使用与号 (&) 字符分隔它们,在同一个 URL 中指定多个要突出显示的文本片段。

用法说明

  • 用于 textStarttextEndprefix--suffix 值的文本字符串需要进行百分比编码
  • 匹配不区分大小写。
  • 各个 textStarttextEndprefix--suffix 字符串需要完全位于同一个块级元素内,但完整的匹配可以跨越多个元素边界。
  • 出于安全原因,此功能要求链接在 noopener 上下文中打开——您需要在<a> 元素中添加 rel="noopener",并在使用此功能时在window.open() 调用中添加 noopener
  • 文本片段仅在完全(非同页面)的用户启动导航上调用。
  • 文本片段仅应用于主框架;不会在<iframe> 内搜索文本,并且 iframe 导航不会调用文本片段。
  • 对于希望选择退出的站点,基于 Chromium 的浏览器支持一个文档策略 标头值,他们可以发送该值,以便用户代理不会处理文本片段。
    http
    Document-Policy: force-load-at-top
    

注意:如果提供的文本片段与链接文档中的任何文本都不匹配,或者浏览器不支持文本片段,则会忽略整个文本片段,并链接到文档的顶部。

示例

带有 textStart 的简单文本片段

textStart 和 textEnd

带有 prefix- 和/或 -suffix 的示例

包含多个文本片段的 URL

您可以通过使用与号 (&) 字符分隔它们来指定在同一 URL 中突出显示的多个文本片段。让我们看几个例子。

如果您没有看到一个或多个文本片段突出显示,并且您确定语法正确,则您可能只是突出显示了与您预期不同的实例。它可能已突出显示,但不在屏幕上。

样式化匹配的文本片段

浏览器可以自由地以任何他们选择的默认方式设置突出显示文本的样式。CSS 伪元素模块级别 4 定义了一个伪元素,::target-text,它允许您指定自定义样式。

例如,在我们的滚动到文本演示 中,我们有以下 CSS。

css
::target-text {
  background-color: rebeccapurple;
  color: white;
}

尝试在支持的浏览器中访问上述链接以查看其效果。

功能检测

可以通过 Document.fragmentDirective 属性访问的FragmentDirective 对象可用于测试浏览器是否支持文本片段。

尝试在支持的浏览器的开发者工具中运行以下代码,在包含一个或多个匹配文本片段的选项卡中运行。

js
document.fragmentDirective;
// returns an empty FragmentDirective object, if supported
// undefined otherwise

目前,此功能主要用于特性检测。将来,FragmentDirective 对象可能会包含其他信息。

参考

API

FragmentDirective

表示文本片段的对象。目前为空,主要用于特性检测。

Document.fragmentDirective

返回当前文档的FragmentDirective

CSS

::target-text

表示当前文档中突出显示的文本片段。它允许作者自定义文本片段的样式。

规范

规范
URL 片段文本指令
# fragmentdirective
CSS 伪元素模块级别 4
# selectordef-target-text

浏览器兼容性

html.elements.a.text_fragments

BCD 表格仅在启用 JavaScript 的浏览器中加载。

api.FragmentDirective

BCD 表格仅在启用 JavaScript 的浏览器中加载。

css.selectors.target-text

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅