WCAG 2.4.4 Link Purpose (In Context): fixing "click here"

WCAG 2.4.4 Link Purpose (In Context) is a Level A criterion: the purpose of each link must be clear from its text, or from its text plus context that software can pair with it, such as the same sentence, paragraph, list item or table cell. "Click here" passes only when that context says where it leads.

Published . Last reviewed .

In the 2026 WebAIM Million, 46.3% of home pages had a link with no name at all and 15.2% had vague link text such as "click here" or "more". This page covers exactly what counts as context for a link, why a heading above a "Read more" does not, how images, aria-label and visible labels interact, working fixes for repeated "read more" links, real failing and passing code, a step-by-step test, and what GotAlt's tools check and cannot check.

What WCAG 2.4.4 requires

Success criterion 2.4.4 asks that the purpose of each link can be determined "from the link text alone" or from the link text together with its "programmatically determined link context", except where the purpose would be ambiguous to users in general (W3C, WCAG 2.2). It is Level A, has been in WCAG since WCAG 2.0, and is kept in 2.1 and 2.2. Its AAA sibling, 2.4.9 Link Purpose (Link Only), drops the context allowance: the purpose must be identifiable "from link text alone".

W3C's stated intent is to help people "decide whether they want to follow the link." The Understanding document adds the reason that matters in practice: assistive technology can list every link on a page, so link text that is as meaningful as possible "will aid users who want to choose from this list of links" (Understanding 2.4.4). WebAIM makes the same point: screen reader users often move from link to link or open a list of all links, so "links should make sense out of context".

Because 2.4.4 is Level A, it is inside every target the laws in our register name: WCAG 2.0 AA for Section 508 and Ontario's AODA, and WCAG 2.1 AA for the ADA Title II web rule and, through EN 301 549, the European Accessibility Act. Our laws hub covers each. This page explains a technical standard and is not legal advice.

How often links fail

The 2026 WebAIM Million (data collected February 2026) is the standard reference for real-world failure rates. Its link findings:

Link findings in the 2026 WebAIM Million (top one million home pages)
Finding2026 figureEarlier figure
Pages with an empty link46.3%45.4% in 2025
Pages with ambiguous link text such as "click here", "more" or "continue"15.2%, averaging 5.3 such links on the pages that had any13.7% in 2025; 23.2% in 2020
Linked images with no alt textOne in four linked images; 45% of all images missing alt were linked imagesNot reported

WebAIM notes that linked images with missing alt text result "in links that were not descriptive". Automated tests find what they can match, so these figures are a floor, not a total. Our pages on the most common accessibility errors and WCAG 1.1.1 cover the rest of that list.

What counts as context, and what does not

The phrase "programmatically determined link context" is defined by W3C as "additional information that can be programmatically determined from relationships with a link". For HTML, W3C's example is text "in the same paragraph, list item, or table cell as the link" or in a table header cell associated with the link's cell, and it notes that because screen readers interpret punctuation they can also give the context of the current sentence. Everything else is visual context, which does not count. W3C also says context works best when it comes first: "most usable if it precedes the link".

Where the explanation of a link sits, and whether WCAG 2.4.4 accepts it
Where the explanation isCounts as context?W3C technique
In the link text itselfYes. This is the preferred fix.G91 (descriptive link text), H30 (link text on anchors)
In the same sentenceYesG53 (enclosing sentence)
In the same paragraphYesH78 (enclosing paragraph)
In the same list item, or the parent item of a nested listYesH77 (enclosing list item), H81 (parent list item)
In the same table cell, or its associated header cellsYesH79 (enclosing table cell)
Added with aria-labelledby, aria-label or aria-describedby on the linkYes. The F63 test names all three as ways to supply context.ARIA7 (aria-labelledby), ARIA8 (aria-label)
In the title attribute of the linkListed by W3C as a way to supplement link text, with a caution about limited user agent support for the title attribute. W3C prefers hidden text (C7) or better link text. We treat the title as the weakest option.H33 (title attribute)
In the heading above the linkNot by itself, by W3C's F63 test. W3C lists the heading technique as advisory only.H80 (preceding heading), advisory
In a different paragraph, such as the one above the linkNoF63 (context in unrelated content), a failure
In another row or cell of a layout tableNoF63, a failure
Only in the visual layout: a card, an image or a column header the code does not tie to the linkNoF63, a failure

The failure W3C documents as F63 is easy to produce. A news site puts a summary paragraph in one <p> and the link "Read More..." in the next. Sighted visitors read them as one block, but the link is not in the same paragraph as its explanation, so the context is not programmatic.

The "ambiguous to users in general" exception

W3C defines ambiguous to users in general as a purpose that "cannot be determined from the link and all information of the web page", presented together with the link, so that "readers without disabilities would not know what a link would do" until they activate it. Its example is a single word, "guava", linked inside the sentence "One of the notable exports is guava": the link could lead to a definition, an export chart or a photograph, and nobody knows which. Its second example is a game with links called "door #1", "door #2" and "door #3", where the mystery is the point.

The exception is narrower than it sounds, and the narrowness is what catches teams out:

  • A "Read more" under a visible headline is not ambiguous in general. A sighted visitor can see the headline, so the purpose can be worked out from the page as presented. The exception does not apply, and the context has to be available to software too.
  • The exception does not excuse missing context. Whatever context the page offers "must be made available in the link text or programmatically associated with the link", W3C says.
  • Mystery on purpose is allowed when the surprise is the point for every user, as in the game.

Image links and icon links

A link whose only content is an image takes its name from the image's alt text. With no alt, or with alt="" and no other name, the link is announced without a purpose. W3C documents this as failure F89, an image link with no name, which fails 2.4.4, 2.4.9 and 4.1.2 together. The data above shows how common it is: one in four linked images on home pages had no alt text.

Three patterns cover most cases:

  • Image only: the alt text states where the link goes ("View cart"), not what the picture looks like ("Cart icon").
  • Icon beside text, in one link: give the icon alt="". W3C's own example does exactly this, because "the purpose of the link is already described by the text of the link".
  • Image link and text link to the same place, as two separate links: combine them into one link (technique H2, combining adjacent image and text links). Keyboard users then meet one link and a links list shows no duplicate. In F89's own example, a screen reader falls back to guessing at a name from the image file, announcing something like "football dot gif".

Inline SVG and icon fonts work the same way: the link needs a name from visible text or an aria-label, and hiding the decorative icon itself with aria-hidden="true" keeps it from adding noise. Alt text for images in general is the subject of our alt text examples page.

aria-label, and why the visible text has to be in it

The aria-label attribute can give a vague link a precise name, and W3C lists it as a sufficient technique (ARIA8). But the technique page states a consequence people overlook: "the aria-label text will override the text supplied within the link", and in some assistive technologies the label "will show in the list of links instead of the actual link text". The attribute replaces the visible text as the link's name. That connects to a second Level A criterion.

2.5.3 Label in Name (new in WCAG 2.1) requires that for components with visible text labels, "the name contains the text that is presented visually". Its Note adds a best practice: put the visible text at the start of the name. The reason is speech input. People who operate a page by voice say what they see, such as "click Read more", and a name that does not contain those words does not respond. So the safe pattern is the visible words, then the detail. The ARIA8 example does exactly this:

<a href="/taxhike"
   aria-label="Read more about
   Seminole tax hike">Read more</a>

The pattern that fails 2.5.3 swaps the visible words for different ones, so the label a voice user can see is not in the name (W3C documents the pattern as failure F96, an accessible name that does not match the visible label; this sample adapts the ARIA8 example):

<a href="/taxhike"
   aria-label="Seminole tax hike">
  Read more</a>

F96 has a second example that catches hidden-text fixes. A link reads "Download specification" on screen, but hidden text makes its name "Download gizmo specification". The visible words are all in the name, yet "there is no string match", so a voice command may not activate the link. Keep the visible words together, in order, and add the extra words before or after them, never between them.

Where the explanation is already visible on the page, such as a headline, W3C's ARIA8 page says to use aria-labelledby instead of aria-label, which is the next section.

Repeated "read more" links

The news-list pattern, with a "Read more" after every summary, is the most common source of vague links, and W3C's own examples show both the leniency and the cost. In its news-summary example the paragraph supplies the context, so the criterion is met. But a links list then shows "Read more" ten times. Four fixes work, in rough order of preference:

  1. Name the destination in the link text. Make the headline the link, or write "Read the Seminole tax hike story". Nothing else needs to be maintained.
  2. Reference the headline with aria-labelledby so the name becomes the visible words plus the headline. W3C's example (ARIA7) produces the name "Read more ...Storms hit east coast" and shows the same text in the links list. Referencing the link's own id keeps the visible words first:
<h2 id="headline">Storms hit east coast</h2>
<p>Torrential rain has struck the coast.
  <a id="r1" href="/storms"
     aria-labelledby="r1 headline">Read more</a>
</p>
  1. Add visually hidden text after the visible words (technique C7, hiding part of the link text with CSS). The hidden part must be clipped off screen, not hidden with display: none or visibility: hidden, which remove it from assistive technology as well. W3C itself cautions that some screen reader users find this technique "overly chatty", and that it works best when the hidden text is not repetitive.
<a href="/storms">Read more<span
  class="visually-hidden"> about the
  storms on the east coast</span></a>
  1. Use aria-label that starts with the visible words, as in the previous section. Fine for a few links, harder to maintain across a template.

Whichever you choose, apply two rules from W3C and WebAIM. Links with different destinations should have different link text, and links to the same destination should use the same text. W3C calls both best practices; the second is also a requirement under 3.2.4 Consistent Identification for pages in a set (Understanding 2.4.4). And put the distinguishing words first: WebAIM advises "Products (opens in a new window)" over "Link opens in a new window: Products", because the repeated prefix makes a links list harder to scan.

Rewriting vague links

Typical vague link text and a rewrite
BeforeAfterWhy
Click hereDownload the 2026 price list (PDF)Names the document and its type. The word "link" and the action word add nothing; screen readers already say "link", per WebAIM.
Read moreRead more about the new return policyKeeps the familiar phrase and adds the destination. If the layout cannot change, use aria-labelledby or hidden text.
Learn moreLearn how we calculate shippingStates what you will learn.
Here (inside "see the details here")See the shipping detailsThe surrounding sentence can rescue it at Level A, but the link text is what a links list shows.
https://example.com/whitepaper.pdfAccessibility whitepaper (PDF)W3C's G53 says simply providing the URI of the destination "is generally not sufficiently descriptive".
Download, Download, DownloadDownload the 2024 report, Download the 2025 report, Download the 2026 reportDifferent destinations need different names.
An icon with no nameThe same icon, aria-label="Search", icon hidden from assistive technologyAn empty link is the one failure no context can excuse.

More failing and passing code

A vague link in a list

Failing. A links list shows "Download" twice, and nothing in the list item says which file:

<li><a href="/r-2026.pdf">Download</a></li>
<li><a href="/r-2025.pdf">Download</a></li>

Passing:

<li><a href="/r-2026.pdf">2026 annual
  report (PDF)</a></li>
<li><a href="/r-2025.pdf">2025 annual
  report (PDF)</a></li>

A link whose context is in another paragraph (F63)

Failing:

<p>Torrential rain has struck the coast.</p>
<p><a href="/storms">Read more</a></p>

Passing at Level A, by putting the link in the paragraph it belongs to (technique H78). It would still read "Read more" in a links list, so the earlier fixes are better:

<p>Torrential rain has struck the coast.
  <a href="/storms">Read more</a></p>

A sentence that carries the context

Passing at Level A, and W3C's own example for G53, because the information that explains the link comes first in the same sentence. It fails the AAA criterion 2.4.9, which asks for the purpose from the link alone:

<p>To advertise on this page,
  <a href="/advertise">click here</a>.</p>

Better, and passing both:

<p><a href="/advertise">Advertise on
  this page</a>.</p>

An image link with no name (F89)

Failing:

<a href="/cart"><img src="cart.svg" alt=""></a>

Passing, with alt text that says where the link goes:

<a href="/cart"><img src="cart.svg"
  alt="View cart"></a>

An icon-only link

Failing. There is no text, no aria-label and the SVG has no name:

<a href="/search">
  <svg class="icon">...</svg>
</a>

Passing. The link carries the name and the icon is hidden from assistive technology:

<a href="/search" aria-label="Search">
  <svg class="icon" aria-hidden="true">...</svg>
</a>

Image and text as two links to one page

Failing, in the sense of W3C's F89 example: the image link has an empty name and sits beside a text link to the same page, so users meet two links where one would do:

<a href="/scores"><img src="ball.gif" alt=""></a>
<a href="/scores">Football scoreboard</a>

Passing. One link, with the icon given empty alt text (technique H2):

<a href="/scores">
  <img src="ball.gif" alt="">
  Football scoreboard
</a>

How to test WCAG 2.4.4, step by step

  1. List every link and its name. With a screen reader this is a links list: in NVDA, WebAIM's guide says NVDA+F7 opens the Elements List with the page's links, headings and landmarks, and the K key moves from link to link. For a quick static check, run the link text checker on a page address; for the rendered page, the accessibility bookmarklet. Or print them yourself in the browser console:
for (const a of document.links) {
  console.log(a.textContent.trim(),
    a.getAttribute("aria-label"),
    a.href);
}
  1. Mark the names that do not identify a destination alone: generic phrases, bare URLs, single words like "more", the same name used for different destinations, and icon-only links.
  2. Look for programmatic context for each mark. Is the explanation in the same sentence, paragraph, list item or table cell, or supplied with aria-labelledby, aria-label or aria-describedby? If yes, note which technique makes it pass. If the only explanation is a heading, an earlier paragraph, a card layout or a neighboring table row, it fails (F63).
  3. Apply the "ambiguous to users in general" exception last. Use it only if a sighted visitor looking at the whole page could not tell either.
  4. Read the real accessible name. In Chrome's developer tools, the Accessibility tab shows an element's computed accessibility properties, and Firefox has an Accessibility Inspector. An aria-label or aria-labelledby may have replaced the text you can see.
  5. Compare the name with the visible text (2.5.3). The name should contain the words on screen, ideally first.
  6. Check image and icon links for a name. A link whose only content is an image with alt="" and no other name is the F89 failure.
  7. Check consistency. Same destination, same text; different destinations, different text.
  8. Run it again after the page changes state. Menus, tabs, "load more" buttons and scripts add links that a one-time static check never saw.

Our guide to testing website accessibility fits this into a full manual pass.

Common false positives and false negatives

Where automated link results mislead
SituationWhat tools tend to reportWhat is actually true
"Read more" at the end of a summary paragraphGeneric link textCan pass 2.4.4 through the paragraph (H78), as W3C's own news example shows. It still reads "Read more" in a links list.
"Click here" at the end of a sentence that names the destinationGeneric link textPasses Level A (G53). Fails the AAA criterion 2.4.9.
A link with a descriptive aria-label over vague visible textPass, or generic textCan pass 2.4.4. Fails 2.5.3 if the name does not contain the visible words.
A link with no text at allEmpty linkThe unambiguous case: no context can excuse a missing name. Check the icon or image inside it.
A link named only by a title attributeThe free scan counts a title as a name; the link text checker does notW3C lists the title attribute only as a supplement to link text (H33) and cautions about user agent support for it. Give the link visible text or an aria-label and the question goes away.
Two links with the same text and the same destinationDuplicate link textFine. W3C calls consistent text for the same destination a best practice, and a requirement across pages in a set (3.2.4). The same text for different destinations is a best-practice problem, and a 2.4.4 failure only when the purpose cannot be determined.
A well-worded link that goes somewhere elsePassA link called "Pricing" that opens a contact form misstates its purpose. Only a person checking the destination will catch it.
Links added by JavaScript after loadMissing from a static checkStill in scope. Check the rendered page.
Generic text in another languageNot flaggedThe generic-phrase list in our checker is English only.

What GotAlt's tools check, and what they cannot

GotAlt tools and WCAG 2.4.4 coverage
ToolWhat it checksWhat it cannot see
Link text checkerEnter a page address or paste its HTML. Lists every link with the name a screen reader would use (aria-labelledby, then aria-label, then visible text with aria-hidden parts removed, then image alt) and flags four things: no name, one of nine generic phrases (click here, read more, learn more, here, this, more, link, download, continue), a bare URL, and the same text pointing at different destinations. Pasted HTML never leaves your browser.Whether the surrounding sentence, paragraph, list item or cell already supplies the purpose, so a flagged "read more" may still pass. Links added by scripts after the page loads. Wording beyond the nine English phrases. It does not treat a title attribute as a name. Destinations are compared as literal strings, so /pricing and /pricing/ read as different.
Accessibility bookmarkletReads the rendered page you have open, logged in or on staging. Reports links with no accessible name, a link whose only content is an image with empty alt, and generic text such as "click here" or "read more" as advisory, because 2.4.4 lets the surrounding sentence supply the purpose.Whether the context really exists. It follows a simplified version of the accessible name algorithm and sees the page once, in its current state.
Free scanOne of its 16 rule-based checks flags links with no accessible name, across up to 3 pages, and reports it against 2.4.4.Vague text of any kind. It counts an aria-labelledby or a title as a name without checking what they point to.
Deep auditReads each link's visible text and destination (up to 40 links on a page) and judges whether the text identifies the destination when read out of context. One finding per distinct text, with how many links share it and suggested replacements. One deep audit a day is free.It does not read the sentence around a link, so it applies the stricter reading of the rule. A "Read more" it flags may still meet 2.4.4 through its paragraph. Icon-only links with an aria-label and any link without visible text are not sent to the model.

None of these tools can confirm that a page meets 2.4.4 or any law. A tool can find a missing name with certainty. Whether the words around a link supply its purpose, and whether a name matches where the link goes, still needs a person reading the page. Our page on why rule scanners miss issues covers the wider gap.

For every criterion in one place, see WCAG 2.2 criteria explained and the WCAG 2.2 checklist. Theme and template notes are in our guides for Shopify, WordPress, Wix, Squarespace and Webflow.

Questions about WCAG 2.4.4

Is "read more" a WCAG failure?

Not automatically. WCAG 2.4.4 lets a link's purpose come from its text plus programmatically determined context. W3C's own news-summary example, a "Read more" after a paragraph, meets the criterion because the paragraph supplies the context. It fails when the explanation sits only in a heading, an earlier paragraph or the visual layout, and it still reads poorly in a links list.

Is "click here" ever acceptable?

At Level A, yes, when the same sentence says where the link goes and that information comes first, as in W3C's example "To advertise on this page, click here." It fails the AAA criterion 2.4.9, and a links list shows only "click here". Rewriting the link to name the destination is better.

What is programmatically determined link context?

Additional information that software can derive from the link's relationships: in HTML, text in the same paragraph, list item or table cell, the table header cells for that cell, and text tied to the link with aria-labelledby, aria-label or aria-describedby. A heading above the link and a neighboring paragraph do not count.

Can I fix vague links with aria-label?

Yes, W3C lists it as a sufficient technique (ARIA8), but the label replaces the visible text as the link's name. Start it with the visible words, for example "Read more about Seminole tax hike", so the name still contains what a voice-control user can see, as WCAG 2.5.3 requires. Visible text is simpler to keep correct.

Do image links need alt text?

If the image is the only content of the link, its alt text is the link's name, and an empty name fails 2.4.4, 2.4.9 and 4.1.2 together (failure F89). When an icon sits beside text inside one link, give the icon empty alt text.

Should link text be the URL?

No. W3C's technique G53 says simply providing the URI of the destination is generally not sufficiently descriptive. Use the name of the page or document, plus its type if it is not a web page, such as "(PDF)".

How common are empty and vague links?

In the 2026 WebAIM Million, 46.3% of home pages had an empty link and 15.2% had ambiguous link text such as "click here" or "more". Those are the cases an automated test can detect, so they are a floor.

Find the links that make no sense on their own

Paste a page address. The deep audit reads the page's link texts and destinations, the heading outline and up to six images with their alt text. One deep audit a day is free.

Verify one page free See a real report first

Find the links with no name on your site

The free scan flags links with no accessible name across up to 3 pages, alongside 15 other rule-based WCAG checks. No signup.

Scan my site for free See a real report first