#
is the optional last part of a URL for a document. It is typically used to identify a portion of that document. The generic syntax is specified in RFC ((3986))The hash-mark separator in URIs is not part of the fragment Identifier
Basics
In URIs, a hash mark#
introduces the optional fragment near the end of the URL. The generic RFC 3986 syntax for URIs also allows an optional query part introduced by a question mark ?
. In URIs with a query and a fragment, the fragment follows the query. Query parts depend on the URI scheme and are evaluated by the server—e.g., http:
supports queries unlike ftp:
. Fragments depend on the document #
is permitted by the generic syntax and is a kind of empty fragment. In MIME document types such as text/html
or any XML type, empty identifiers to match this syntactically legal construct are not permitted. Web browsers typically display the top of the document for an empty fragment.
The fragment identifier functions differently to the rest of the URI: its processing is exclusively client-sided with no participation from the web server, though the server typically helps to determine the MIME type, and the MIME type determines the processing of fragments. When an id=
or name=
attribute equal to the fragment identifier.
Examples
* In URIs for MIME text/html
pages such as http://www.example.org/foo.html #bar
the fragment refers to the element with id="bar"
.
** Graphical Web browsers typically scroll to position pages so that the top of the element identified by the fragment id is aligned with the top of the viewport; thus fragment identifiers are often used in tables of content and in permalinks.
** The appearance of the identified element can be changed through the :target
display: block
can be used to show content only if it is the target, and otherwise hidden by display: none
.
** The deprecated name
attribute (allowed only for some elements) had a similar purpose in now obsolete browsers. If present name
and id
must be identical.
* In all xml:id
or similar id
attributes follow the Name
-syntax and begin with a letter, underscore, or colon. Notably they cannot begin with a digit or hyphen.
** xml:id
is one of the few generic XML attributes, e.g., xml:lang
, which can be used without explicitly declaring a namespace. In XHTML id
has to be used, because XHTML was specified before xml:id
existed.
* In XML applications, fragment identifiers in a certain syntax can be http://www.example.org/foo.xml #xpointer(//Rube)
refers to all XML elements named "Rube" in the document identified by the URI http://www.w3.org/2004/02/skos/core #broader
identifies the concept "broader" in SKOS Core vocabulary, but it does not refer to a specific part of the resource identified by http://www.w3.org/2004/02/skos/core
, a complete RDF file in which semantics of this specific concept is declared, along with other concepts in the same vocabulary.
* In URIs for MIME text/plain
documents RFC 5147 specifies a fragment identifier for the character and line positions and ranges within the document using the keywords "char
" and "line
". Browser support seems lacking. The following example identifies lines 11 through 20 of a text document:
**http://example.com/document.txt#line=10,20
* In URIs for MIME text/csv
documents, RFC 7111 specifies a fragment identifier as a selector for rows, columns, and cells using the keywords "row
" , "col
", and "cell
", for example:
** http://example.com/data.csv#row=4
– Selects the 4th row.
** http://example.com/data.csv#col=2
– Selects 2nd column.
** http://example.com/data.csv#row=5-7
– Selects three consecutive rows starting with 5th row.
** http://example.com/data.csv#row=5-*
– Selects all rows starting with 5th row.
** http://example.com/data.csv#cell=4,1-6,2
– Selects a region that starts at the 4th row and the 1st column and ends at the 6th row and the 2nd column.
* In URIs for MIME audio/*, image/*, video/* documents, very few have defined fragments or fragment semantics. The Media Fragments URI 1.0 (basic) syntax supports addressing a media resource along two dimensions (temporal and spatial) using the keywords t
and xywh
. Therefore, one can use the following media fragments URI in the src
attribute of the audio
or video
HTML5 element:
** http://example.com/foo.mp4#t=10,20
** http://example.com/bar.webm#t=40,80&xywh=160,120,320,240
** Other websites use the fragment part to pass some extra information to scripts running on them – for example, Google Video understands permalinks in the format of #01h25m30s
to start playing at the specified position, and #t=3m25s
.
* In location.hash
– note that Javascript can be also used with other document types. With the rise of AJAX, some websites use fragment identifiers to emulate the back button behavior of browsers for page changes that do not require a reload, or to emulate subpages.
** For example, Gmail uses a single URL for almost every interface – mail boxes, individual mails, search results, settings – the fragment is used to make these interfaces directly linkable.
** #/foo
could be used to extract the value from a key-value pair in a document beginning with
* In URIs for MIME application/pdf
documents PDF viewers recognize a number of fragment identifiers. For instance, a URL ending in .pdf#page=35
will cause most readers to open the PDF and scroll to page 35. Several other parameters are possible, including #nameddest=
(similar to HTML anchors), #search="word1 word2"
, #zoom=
, etc. Multiple parameters can be combined with ampersands:
** http://example.org/doc.pdf#view=fitb&nameddest=Chapter3
.
* In viewBox()
, preserveAspectRatio()
, and transform()
.
Proposals
Several proposals have been made for fragment identifiers for use with plain text documents (which cannot store anchor metadata), or to refer to locations within HTML documents in which the author has not used anchor tags: * As of September 2012 the Media Fragments URI 1.0 (basic) is a W3C Recommendation. *Chrome versions 80 and above implement W3C'#:~:text=foo
will cause the browser to search for foo
, highlight the matching text, and scroll to it. Besides the start and end, the snippet can also specify a context: text that must precede or follow foo
but won't be highlighted ( example that searches for 'vision' preceded by 'night').
* The Python Package Index appends the MD5 hash of a file to the URL as a fragment identifier. If MD5 were unbroken (it is a broken hash function), it could be used to ensure the integrity of the package.
*: https://pypi.python.org ... zodbbrowser-0.3.1.tar.gz#md5=38dc89f294b24691d3f0d893ed3c119c
* A hash-bang fragment is a fragment starting with an exclamation mark !
. It was used in a now-deprecated approach to index dynamic http://example.com/page?query#!state
** Another implementation has been the replacement of #!
with ?_escaped_fragment_=
** Hash-bang URIs have been considered problematic by a number of writers including Jeni Tennison at the W3C because they make pages inaccessible to those who do not have history.pushState()
method.
** Mozilla Foundation employee Gervase Markham has proposed a fragment identifier for searching, of the form #!s!search terms
. Adding a number after the s (#!s10!
) indicates that the browser should search for the ''n''th occurrence of the search term. A negative number (#!s-3!
) starts searching backwards from the end of the document. A Greasemonkey script is available to add this functionality to compatible browsers.
**: http://example.com/index.html#!s3!search terms
* Erik Wilde and Marcel Baschnagel of the match
". They also describe a prototype implementation as an extension for the Firefox browser. For example, the following would find the case-insensitive text "RFC" anywhere in the document:
*: http://example.com/document.txt#match= RfF] C/nowiki>
* K. Yee of the Foresight Institute proposes "extended fragment identifiers" delimited with colons and a keyword to differentiate them from anchor identifiers. A text search fragment identifier with "fragment specification scheme" id "words
" is the first proposal in this scheme. The following example would search a document for the first occurrence of the string "some context for a search term" and then highlight the words "search term":
*: http://example.com/index.html#:words:some-context-for-a-(search-term)
** Text Fragments was proposed as a Draft Community Group Report in December 2021. This scheme uses the directive :~:text=
to introduce the search term.
**: https://en.wikipedia.org/wiki/History_of_computing#:~:text=The%20first%20recorded,Williams
** The above scheme was implemented in Chrome version 80.
* The LiveURLs project proposed a fragment identifier format for referring to a region of text within a page, of the form #FWS+C
, where ''F'' is the length of the first word (up to five characters), ''W'' is the first word itself, ''S'' is the length of the selected text and ''C'' is a 32-bit CRC of the selected text. They implemented a variant of this scheme as an extension for the Firefox browser, using the form #LFWS+C
, where ''L'' is the length of the fragment itself, in two hex digits. Linking to the word "Fragment" using the implemented variant would yield:
*: http://example.com/index.html#115Fragm8+-52f89c4c
* Up until Firefox 5, Firefox supported XPath links such as #xpath:/html/body/div which could be used in conjunction with a bookmarklet such as http://antimatter15.com/wp/2009/11/xpath-bookmark-bookmarklet/ to link within HTML documents that lacked proper IDs. This feature was removed as part of a code cleanup in https://bugzilla.mozilla.org/show_bug.cgi?id=457102
*In See also
* URL normalization *References
{{reflistExternal links
* W3