On this page
Pagination and Breadcrumbs: Accessible Navigation Patterns with HTML, CSS and Schema
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.
Breadcrumbs: semantic HTML
- 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
::beforeso they are not read aloud for every item.
Breadcrumbs: styling
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.
Breadcrumb structured data (SEO)
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.
Press Run to execute.
Press Run to execute.
Press Run to execute.
Press Run to execute.
Press Run to execute.
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.
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?