Skip to main content
Syllabus
On this page

Pagination and Breadcrumbs: Accessible Navigation Patterns with HTML, CSS and Schema

Badar KhalilUpdated September 30, 2026 6 min read

What are pagination and breadcrumbs?

Breadcrumbs show the user's location in a site hierarchy (Home / Courses / CSS / Buttons) and let them jump back to a parent page. Pagination splits long lists, such as search results, blog posts or products, into pages so users can move through them. Both are wayfinding components: they reduce confusion, improve usability and help search engines understand site structure.

Focus keyword: pagination and breadcrumbs. Related trending keywords: accessible pagination, breadcrumb navigation CSS, aria-current page, BreadcrumbList schema, breadcrumb structured data, infinite scroll vs pagination, SEO friendly pagination, responsive pagination.

  • Wrap them in <nav aria-label='Breadcrumb'> so screen readers can find the landmark.
  • Use an ordered list <ol>, because the order is meaningful.
  • Each ancestor is a link. The current page is the last item, marked with aria-current='page' (it can be plain text or a link).
  • Do not put the separator characters in the HTML. Add them with CSS ::before so they are not read aloud for every item.

Use display: flex; flex-wrap: wrap; gap: 8px; list-style: none;. For the separator use li + li::before { content: '/'; } or a chevron created with borders, and put it in aria-hidden territory by using CSS content (modern browsers also support alternative text like content: '/' / '' to silence it). Truncate long titles with text-overflow: ellipsis and a max width. On small screens you can show only the parent link, for example Back to Courses.

Add BreadcrumbList schema in JSON-LD so search engines can understand the hierarchy and may show the path in results. Each ListItem has a position, name and item (URL). Keep the structured data consistent with the visible breadcrumbs.

Pagination: semantic HTML

  • Use <nav aria-label='Pagination'> with a list of links.
  • Use real links (<a href='?page=2'>) for server-rendered content so pages are shareable, crawlable and work without JavaScript. For client-side updates, use buttons and manage focus and live regions.
  • Mark the current page with aria-current='page' and style it differently (not by color alone).
  • Give links clear names: aria-label='Go to page 3', aria-label='Previous page', aria-label='Next page'.
  • Disabled Previous or Next on the first or last page should use aria-disabled='true' (and no href) or be omitted.

Designing pagination

  • Show Previous, Next, the first and last page, and a few pages around the current one. Use an ellipsis for gaps, marked as non-interactive.
  • Make targets at least 44px on touch devices or keep at least 24px with spacing.
  • On small screens, show a compact form: Previous, Page 3 of 12, Next.
  • Tell users the total: Showing 21 to 30 of 240 results.
  • Keep the same order and position after navigation, and move focus to the results heading when content changes via JavaScript.

Pagination, load more or infinite scroll?

  • Pagination: best for goal-oriented tasks like search results, tables and content that users need to return to, and it keeps the footer reachable.
  • Load more: a good middle ground for browsing content with an explicit button.
  • Infinite scroll: only for endless feeds. It harms orientation, keyboard access and footer access unless carefully designed.

SEO notes for pagination

Give each page a unique, crawlable URL and self-referencing canonical link. Avoid hiding pages behind JavaScript only. Search engines no longer use rel='prev' and rel='next' as an indexing signal, but they are harmless, and good internal links between pages still matter.

Quick summary

Use nav landmarks with clear labels, lists, real links and aria-current='page' for both components. Add CSS separators for breadcrumbs, BreadcrumbList schema for SEO, and a compact, well-labeled layout for pagination.

Try it Yourself HTML
Output

Press Run to execute.

Try it Yourself HTML
Output

Press Run to execute.

Try it Yourself HTML
Output

Press Run to execute.

Try it Yourself HTML
Output

Press Run to execute.

Try it Yourself HTML
Output

Press Run to execute.

Exercise: Style an accessible breadcrumb with CSS separatorsHTML

Use li + li::before to add a chevron or slash separator that is not read by screen readers. Mark the last item with aria-current='page', add a clear focus-visible style, and truncate the current page title with an ellipsis if it exceeds 20ch.

Try it Yourself HTML
Output

Press Run to execute.

Show expected output
Breadcrumb items are separated with a visual separator, the current page is emphasized and truncated with an ellipsis, and links show a visible focus outline.

This is a self-check — compare your result with the expected output above.

Was this page helpful?