What Is a Breadcrumb on a Website?

A breadcrumb is the short trail of links near the top of a page, such as Home > Shoes > Running shoes, showing where the page sits in the site. Visitors use it to step back up a level. Marked up with BreadcrumbList structured data, it also helps Google understand your site's hierarchy.

The three kinds of breadcrumb
TypeExampleBest for
Location (hierarchy)Home > Shoes > Running shoesShops, blogs and most sites
AttributeShoes > Size 9 > BlueShowing filters chosen on a product list
Path (history)The pages this visitor clicked throughRarely useful; the browser back button already does this

Updated

The name comes from the fairy tale trail of crumbs. On a website it is a secondary menu, so it never replaces the main navigation. Below you will find the accessible HTML pattern from the W3C, the structured data Google reads, and a builder that writes both from your own trail.

Breadcrumb builder

Your trail, one level per line: Name | full address

Home | https://www.example.com/
Shoes | https://www.example.com/shoes/
Running shoes

Preview

Home / Shoes / Running shoes

HTML

<nav aria-label="Breadcrumb" class="breadcrumb">
  <ol>
    <li><a href="https://www.example.com/">Home</a></li>
    <li><a href="https://www.example.com/shoes/">Shoes</a></li>
    <li><a aria-current="page">Running shoes</a></li>
  </ol>
</nav>

JSON-LD structured data

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://www.example.com/"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Shoes",
      "item": "https://www.example.com/shoes/"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "Running shoes"
    }
  ]
}
</script>

Built in your browser from what you type. Nothing is uploaded.

Separator styling

This CSS draws a small chevron before every crumb except the first, so the separators never appear in the text a screen reader announces.

Breadcrumb with CSS separators

Edit the names to try it. The chevrons come from the ::before rule, not from characters in the HTML.

<style>
.breadcrumb ol { display: flex; flex-wrap: wrap; gap: .25rem .5rem; list-style: none; margin: 0; padding: 0; }
.breadcrumb li + li::before { content: ""; display: inline-block; margin-right: .5rem; width: .4rem; height: .4rem;
  border-right: 1px solid currentColor; border-top: 1px solid currentColor; transform: rotate(45deg); vertical-align: middle; }
.breadcrumb [aria-current="page"] { color: inherit; font-weight: 600; text-decoration: none; }
</style>
<nav aria-label="Breadcrumb" class="breadcrumb">
  <ol>
    <li><a href="#">Home</a></li>
    <li><a href="#">Shoes</a></li>
    <li><a href="#" aria-current="page">Running shoes</a></li>
  </ol>
</nav>

Accessible breadcrumb markup

The WAI-ARIA Authoring Practices pattern has three requirements: put the trail in a navigation landmark, label that landmark with aria-label or aria-labelledby, and set aria-current to page on the link to the current page. MDN describes the page value of aria-current as the link to the current document in a breadcrumb.

The W3C example structures the links as an ordered list and draws the separators with CSS borders, so assistive technology announces only the page names.

Structured data that matches

Schema.org explains that the position property is used to reconstruct the order of the items, with lower numbers first. Start at 1 for the top of the trail, usually your home page or a main category.

JSON-LD, a block of structured data in a script tag, is the easiest format to add because it lives apart from your visible HTML. The builder below writes it from the same list that drives the visible trail.

How it works

  1. Type your trail in the builder, one level per line, from the home page down to the current page.
  2. Add the full address after each name, separated by a vertical bar. The last line can leave it out.
  3. Copy the HTML into your page template and the JSON-LD into the page head.
  4. Test the page with Google's Rich Results Test before you roll it out across the site.

Tips

Frequently asked questions

Do breadcrumbs help SEO?

Google's breadcrumb documentation says it uses breadcrumb markup in the body of a page to categorize the information on it. They also give crawlers more internal links up the hierarchy. They are not a ranking shortcut by themselves.

What does Google require in BreadcrumbList?

An itemListElement array of at least two ListItem entries. Each needs a name, a position starting at 1, and an item with the page URL. The last crumb may leave out item, in which case Google uses the URL of the page it is on.

Should the breadcrumb include the current page?

The W3C pattern does include it as the final link, marked with aria-current set to page. Many sites show it as plain text instead. Either is fine as long as screen reader users can tell which item is current.

What element should wrap a breadcrumb?

A nav element with a label such as aria-label="Breadcrumb", and an ordered list inside it. The W3C example uses exactly that, because the order of the links carries meaning.

Can a page have more than one breadcrumb trail?

Yes. Google's page shows an example with two BreadcrumbList items for a page reachable through two categories. Show both trails to visitors too, so the markup matches the page.

Related: Schema markup generator, Schema markup validator, Orphan pages, On-page SEO checklist.

Start for free or see all free tools. We.Inc is free to start, with no card needed. AI building is on paid plans from $20 a month.

More in Guides

We.Inc is an AI-powered website builder you can resell under your own brand. Launch a branded client dashboard, bill on Stripe Connect, and deliver AI-generated websites in minutes. White-label plans start at $99 a month for 25 client sites, with a 7-day free trial and no per-site fees.

Product

Who It's For

Features

Resources

Company

View Sitemap