<nav class="breadcrumbs" aria-label="Breadcrumbs">
  <ol class="breadcrumbs-list">
    <li class="breadcrumbs-item">
      <a
        class="breadcrumbs-label breadcrumbs-link"
        href="/"
      >
        Home
      </a>
      <span class="breadcrumbs-separator" aria-hidden="true">»</span>
    </li>
    <li class="breadcrumbs-item">
      <button
        id="expand-button"
        class="breadcrumbs-label breadcrumbs-link"
        type="button"
        aria-expanded="false"
      >
        <span class="visually-hidden">
          Show hidden breadcrumbs
        </span>
        <span aria-hidden="true">...<span>
      </button>
      <span class="breadcrumbs-separator" aria-hidden="true">»</span>
    </li>
    <li class="breadcrumbs-item" hidden>
      <a
        class="breadcrumbs-label breadcrumbs-link"
        href="/new-buildings"
      >
        New Buildings
      </a>
      <span class="breadcrumbs-separator" aria-hidden="true">»</span>
    </li>
    <li class="breadcrumbs-item">
      <a
        class="breadcrumbs-label breadcrumbs-link"
        href="/new-buildings/green-quarter"
      >
        Green Quarter Complex
      </a>
      <span class="breadcrumbs-separator" aria-hidden="true">»</span>
    </li>
    <li
      class="breadcrumbs-item breadcrumbs-label"
      aria-current="page"
    >
      Gallery
    </li>
  </ol>
</nav>
* {
  box-sizing: border-box;
}

body {
  margin: 0;
}

ol {
  list-style: none;
  margin-block: 0;
  padding-inline-start: 0;
}

a {
  text-decoration: none;
}

button {
  font: inherit;
  letter-spacing: inherit;
  word-spacing: inherit;
  padding: 0;
  background: none;
  border: none;
}

button:hover {
  cursor: pointer;
}

.breadcrumbs {
  --crumbs-spacing: 8px;
  position: relative;
  overflow: hidden;
}

.breadcrumbs::before,
.breadcrumbs::after {
  content: '';
  position: absolute;
  top: 0;
  width: 48px;
  height: 100%;
  pointer-events: none;
  background-color: white;
  opacity: 0;
  transition: opacity 0.2s ease;
}

.breadcrumbs::before {
  left: 0;
  mask-image: linear-gradient(to left, transparent, black 90%);
}

.breadcrumbs::after {
  right: 0;
  mask-image: linear-gradient(to right, transparent, black 90%);
}

.breadcrumbs.show-start-fade::before,
.breadcrumbs.show-end-fade::after {
  opacity: 1;
}

.breadcrumbs-list {
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
  display: flex;
  align-items: center;
  column-gap: var(--crumbs-spacing);
}

.breadcrumbs-item:not([hidden]) {
  scroll-snap-align: start;
  display: flex;
  align-items: center;
  column-gap: var(--crumbs-spacing);
}

.breadcrumbs-item[aria-current="page"] {
  font-weight: 500;
  color: #000;
}

.breadcrumbs-label {
  padding: 0.25em 0.5em;
  font-family: system-ui, sans-serif;
  font-size: 0.875rem;
  color: #666;
  white-space: nowrap;
}

.breadcrumbs-link {
  transition: color 0.2s;
}

@media (hover: hover) {
  .breadcrumbs-link:hover {
    color: #0095ff;
  }
}

.breadcrumbs-link:active {
  color: #0080ff;
}

.breadcrumbs-link:focus-visible {
  outline-offset: -2px;
}

.breadcrumbs-separator {
  color: #999;
}

.visually-hidden {
  position: absolute;
  top: 0;
  left: 0;
  overflow: hidden;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  white-space: nowrap;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  border: none;
}
const initBreadcrumbsNavigation = () => {
  const breadcrumbs = document.querySelector('.breadcrumbs');
  const breadcrumbsItems = breadcrumbs?.querySelectorAll('.breadcrumbs-item');
  const expandButton = breadcrumbs?.querySelector('#expand-button');

  if (!breadcrumbs || !breadcrumbsItems || !expandButton) {
    return;
  }

  const showAllItems = () => {
    breadcrumbsItems.forEach(crumb => crumb.removeAttribute('hidden'));
    expandButton.closest('.breadcrumbs-item').remove();
  };

  if (breadcrumbsItems.length <= 4) {
    showAllItems();
    return;
  }

  expandButton.addEventListener('click', showAllItems);
  expandButton.addEventListener('keydown', (event) => {
    if (event.key === 'Enter' || event.key === ' ') {
      event.preventDefault();
      showAllItems();
    }
  });
};

const initBreadcrumbsScroll = () => {
  const breadcrumbs = document.querySelector('.breadcrumbs');
  const breadcrumbsList = document.querySelector('.breadcrumbs-list');

  if (!breadcrumbs || !breadcrumbsList) {
    return;
  }

  const checkScroll = () => {
    const isAtStart = breadcrumbsList.scrollLeft <= 1;
    const isAtEnd =
      breadcrumbsList.scrollLeft + breadcrumbsList.clientWidth
        >= breadcrumbsList.scrollWidth - 1;

    breadcrumbs.classList.toggle('show-start-fade', !isAtStart);
    breadcrumbs.classList.toggle('show-end-fade', !isAtEnd);
  };

  breadcrumbsList.addEventListener('scroll', checkScroll);
  window.addEventListener('resize', () => {
    requestAnimationFrame(checkScroll);
  });

  checkScroll();
};

const initBreadcrumbs = () => {
  initBreadcrumbsNavigation();
  initBreadcrumbsScroll();
};

document.addEventListener('DOMContentLoaded', initBreadcrumbs);
Run Pen

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.