Website problems

Generic link text

Link text is the visible words inside a link, and it is what assistive technology announces when it reaches the link and when a user lists every link on the page. Text like 'click here', 'read more' or 'learn more' describes nothing out of context, and a link containing no text at all — an icon or an image with no alternative — announces only its URL or nothing. WCAG 2.2 requires that the purpose of a link be determinable from its text at Level A.

Why the list is what matters

Screen readers offer a links list: every link on the page, announced in sequence, out of context. It is one of the primary ways users move through a page they have not read.

A page with twelve links reading 'Read more' presents twelve identical entries. The surrounding paragraph that made each one meaningful is not in that list.

The same applies to voice control, where a user says the link text to activate it. Repeated text makes that ambiguous, and the user is offered a numbered disambiguation instead.

This is why the question is not whether the link makes sense in the sentence. It is whether it makes sense alone.

The four shapes this takes

Generic phrases: 'click here', 'read more', 'learn more', 'this page', 'link'. Meaningful in a sentence, meaningless in a list.

A bare URL as the text. Announced character by character by some screen readers, which for a long URL is a long and useless announcement.

Empty links: an `<a>` wrapped around an image with `alt=""`, or around an icon with no accessible name. There is nothing to announce at all.

Repeated text pointing to different destinations — three 'Download' links on one page going to three different files. Each is descriptive in place and indistinguishable in a list.

The inverse also exists and is not a defect: the same text pointing to the same destination twice is fine, and WCAG explicitly permits identical text for identical targets.

How to write it instead

Put the destination in the words: 'Read the 2026 accessibility report' rather than 'Read more'.

Front-load the distinguishing part. A links list is scanned by its first words, so 'Accessibility report (PDF, 2 MB)' beats 'Download the accessibility report'.

Name the file type and size for downloads. It is information the user needs before clicking, and it is unavailable anywhere else.

Where the design requires a short call to action, the visible text can stay short if an accessible name supplies the rest — but the visible text must be contained in the accessible name, or voice control breaks.

For a card or teaser where the heading is the real link, make the heading the link and drop the separate 'read more' entirely. One link per destination is clearer than two.

How to check it yourself

In the console: `[...document.querySelectorAll('a[href]')].map(a => a.textContent.trim() || '(no text)')` prints the links list roughly as a screen reader would present it. Read it as a list and see whether you could navigate the page from it.

Count duplicates: entries appearing several times with different `href` values are the ones to fix.

For empty links, the accessibility pane's computed accessible name is authoritative — it accounts for image alt text and `aria-label`, which the text-content sweep misses.

Check image links specifically. A logo or thumbnail wrapped in a link with empty alt text is an empty link, and it is extremely common.

What this is not

It is not about keyword density. Link text that is stuffed with terms is worse to listen to and no better for anyone.

It is not a reason to write paragraph-length links. Anchor text should be as long as the destination needs and no longer.

It is also not the same problem as a broken link. A broken link points at nothing; a generic link points at something and does not say what. They are fixed in different places and both are worth finding.

And 'click here' is not forbidden by any specification. It fails because it does not identify the destination, not because the words are on a list.

How VeriFixScan detects it

`accessibility.interactive_elements` resolves the accessible name of every link on each crawled page and reports the ones that resolve to nothing, with the element and the page.

The scanner tags generic phrases and empty link text with their own codes, so a report separates 'this link says nothing' from 'this link says the same as eleven others'.

`availability.broken_links` answers the different question of whether the destination exists, which is worth running alongside: a link can be perfectly described and still dead.

What no check can judge is whether a specific phrase describes its destination well. Emptiness and repetition are measurable; adequacy is a review.

Frequently asked questions

Is 'click here' actually against WCAG?
WCAG 2.4.4 requires that a link's purpose be determinable from its text, optionally with its surrounding context. 'Click here' fails when the link is encountered out of context, which is how screen-reader link lists present it.
Can two links share the same text?
Yes, when they point at the same destination — WCAG explicitly allows it. Identical text pointing at different destinations is the case that causes trouble.
Does link text affect SEO?
Anchor text is one of the signals search engines use to understand what a page is about, so descriptive text helps there too. The accessibility reason is the stronger one.

Sources

Related

VeriFixScan crawls a site and applies its checks to every page it reaches, keeping the evidence behind each finding. Scanning one website is free.

Scan a website