docs.rodeo

MDN Web Docs mirror

Text fragments

Text fragments allow linking directly to a specific portion of text in a web document, without requiring the author to annotate it with an ID, using particular syntax in the URL fragment. Supporting browsers are free to choose how to draw attention to the linked text, e.g. with a color highlight and/or scrolling to the content on the page. This is useful because it allows web content authors to deep-link to other content they don’t control, without relying on the presence of IDs to make that possible. Building on top of that, it could be used to generate more effective content-sharing links for users to pass to one another.

Concepts and usage

Historically, one of the web’s key features has always been its ability to provide links between different documents — it is what makes the web, a web:

The issue with linking to specific document fragments is that the author of the linked page needs to put an anchor in place to actually link to. The second example above links to an {{htmlelement("Heading_Elements", "h2")}}  element with an ID of browser_compatibility:

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

If the ID is changed or removed, the document fragment is ignored, and the link just links through to the top of the page. This is reasonable in terms of graceful degradation, but it would arguably be better if the author of the link had full control over where they link to, without needing to rely on the page author.

Text fragments make this a reality — they allow link authors to specify text content to link to, rather than document fragments, in a flexible manner.

Syntax

In a similar manner to document fragments, text fragments are appended onto a URL after a hash symbol (#). The syntax however is a bit different:

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

The key parts to understand are as follows:

Supporting browsers will scroll to and highlight the first text fragment in the linked document that matches the specified directive. Note that it is possible to specify multiple text fragments to highlight in the same URL by separating them with ampersand (&) characters.

Usage notes

[!NOTE] If the provided text fragment does not match any text in the linked document, or if the browser does not support text fragments, the whole text fragment is ignored and the top of the document is linked.

Examples

Simple text fragment with textStart

textStart and textEnd

Examples with prefix- and/or -suffix

URLs with multiple text fragments

You can specify multiple text fragments to highlight in the same URL by separating them with ampersand (&) characters. Let’s look at a couple of examples:

If you don’t see one or more of your text fragments highlighted and you are sure you’ve got the syntax correct, you might just be highlighting a different instance than the one you expected. It might be highlighted, but offscreen.

Styling matched text fragments

Browsers are free to style the highlighted text in whatever default way they choose. The CSS Pseudo-Elements Module Level 4 defines a pseudo-element, {{cssxref("::target-text")}} , which allows you to specifying custom styling.

For example, in our scroll-to-text demo we have the following CSS:

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

Try following the above link in a supporting browser to see the effect this has.

Feature Detectability

The {{domxref("FragmentDirective")}}  object, which is accessed via the {{domxref("Document.fragmentDirective")}}  property, can be used to test whether or not text fragments are supported in a browser.

Try running the following in a supporting browser’s devtools, in a tab with one or more matched text fragments:

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

This functionality is mainly intended for feature detection at present. In the future, the FragmentDirective object could include additional information.

Reference

API

CSS

Specifications

{{Specifications}} 

Browser compatibility

{{Compat}} 

See also

In this article

View on MDN