Skip to content

Breadcrumb 面包屑

实时预览

引入

html
<link rel="stylesheet" href="/tokens/tokens.css">
<link rel="stylesheet" href="/components/breadcrumb/breadcrumb.css">

代码

HTML

html
<!-- Breadcrumb Component — 面包屑导航组件,支持 default 和 arrow 两种变体 -->


<!-- Demo: Breadcrumb 组件 -->
<div style="display: flex; flex-direction: column; gap: 32px; padding: 20px;">
  <!-- 基础面包屑 -->
  <div>
    <h4 style="margin: 0 0 12px 0; font-size: var(--text-sm); color: var(--color-text-secondary);">基础面包屑</h4>
    <nav class="breadcrumb__container">
      <ol class="breadcrumb">
        <li class="breadcrumb__item">
          <a href="#" class="breadcrumb__link">首页</a>
          <span class="breadcrumb__separator">/</span>
        </li>
        <li class="breadcrumb__item">
          <a href="#" class="breadcrumb__link">产品</a>
          <span class="breadcrumb__separator">/</span>
        </li>
        <li class="breadcrumb__item">
          <a href="#" class="breadcrumb__link">设计系统</a>
          <span class="breadcrumb__separator">/</span>
        </li>
        <li class="breadcrumb__item">
          <span class="breadcrumb__current">组件</span>
        </li>
      </ol>
    </nav>
  </div>

  <!-- 箭头面包屑 -->
  <div>
    <h4 style="margin: 0 0 12px 0; font-size: var(--text-sm); color: var(--color-text-secondary);">箭头面包屑</h4>
    <nav class="breadcrumb__container">
      <ol class="breadcrumb breadcrumb--arrow">
        <li class="breadcrumb__item">
          <a href="#" class="breadcrumb__link">首页</a>
          <span class="breadcrumb__separator"></span>
        </li>
        <li class="breadcrumb__item">
          <a href="#" class="breadcrumb__link">文档</a>
          <span class="breadcrumb__separator"></span>
        </li>
        <li class="breadcrumb__item">
          <a href="#" class="breadcrumb__link">组件</a>
          <span class="breadcrumb__separator"></span>
        </li>
        <li class="breadcrumb__item">
          <span class="breadcrumb__current">面包屑</span>
        </li>
      </ol>
    </nav>
  </div>

  <!-- 带图标面包屑 -->
  <div>
    <h4 style="margin: 0 0 12px 0; font-size: var(--text-sm); color: var(--color-text-secondary);">带图标面包屑</h4>
    <nav class="breadcrumb__container">
      <ol class="breadcrumb">
        <li class="breadcrumb__item">
          <a href="#" class="breadcrumb__link">
            <svg class="breadcrumb__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
              <path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path>
              <polyline points="9,22 9,12 15,12 15,22"></polyline>
            </svg>
            首页
          </a>
          <span class="breadcrumb__separator">/</span>
        </li>
        <li class="breadcrumb__item">
          <a href="#" class="breadcrumb__link">
            <svg class="breadcrumb__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
              <path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path>
            </svg>
            项目
          </a>
          <span class="breadcrumb__separator">/</span>
        </li>
        <li class="breadcrumb__item">
          <a href="#" class="breadcrumb__link">
            <svg class="breadcrumb__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
              <circle cx="12" cy="12" r="10"></circle>
              <path d="M12 8v4l3 3"></path>
            </svg>
            最近
          </a>
          <span class="breadcrumb__separator">/</span>
        </li>
        <li class="breadcrumb__item">
          <span class="breadcrumb__current">文档</span>
        </li>
      </ol>
    </nav>
  </div>

  <!-- 禁用状态面包屑 -->
  <div>
    <h4 style="margin: 0 0 12px 0; font-size: var(--text-sm); color: var(--color-text-secondary);">禁用状态面包屑</h4>
    <nav class="breadcrumb__container">
      <ol class="breadcrumb">
        <li class="breadcrumb__item">
          <a href="#" class="breadcrumb__link breadcrumb__link--disabled">首页</a>
          <span class="breadcrumb__separator">/</span>
        </li>
        <li class="breadcrumb__item">
          <a href="#" class="breadcrumb__link">设置</a>
          <span class="breadcrumb__separator">/</span>
        </li>
        <li class="breadcrumb__item">
          <a href="#" class="breadcrumb__link">账户</a>
          <span class="breadcrumb__separator">/</span>
        </li>
        <li class="breadcrumb__item">
          <span class="breadcrumb__current">个人资料</span>
        </li>
      </ol>
    </nav>
  </div>
</div>

<script>
// Breadcrumb 交互逻辑
document.addEventListener('DOMContentLoaded', function() {
  // 面包屑链接点击事件
  const breadcrumbLinks = document.querySelectorAll('.breadcrumb__link:not(.breadcrumb__link--disabled)');
  
  breadcrumbLinks.forEach(link => {
    link.addEventListener('click', function(e) {
      e.preventDefault();
      
      // 获取当前点击的链接文本
      const linkText = this.textContent.trim();
      
      // 显示点击反馈(可选)
      console.log('点击了面包屑链接:', linkText);
      
      // 这里可以添加实际的导航逻辑
      // 例如:window.location.href = this.href;
    });
  });
  
  // 添加键盘导航支持
  const breadcrumb = document.querySelector('.breadcrumb');
  if (breadcrumb) {
    breadcrumb.addEventListener('keydown', function(e) {
      if (e.key === 'Enter' || e.key === ' ') {
        const target = e.target;
        if (target.classList.contains('breadcrumb__link') && !target.classList.contains('breadcrumb__link--disabled')) {
          e.preventDefault();
          target.click();
        }
      }
    });
  }
});
</script>

CSS

css
/* Breadcrumb.css */
.breadcrumb {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--space-2);
  font-size: var(--text-sm);
}

.breadcrumb__item {
  display: flex;
  align-items: center;
  gap: var(--space-2);
}

.breadcrumb__link {
  color: var(--color-text-secondary);
  text-decoration: none;
  transition: color var(--duration-fast) var(--ease-default);
}

.breadcrumb__link:hover {
  color: var(--color-primary);
  text-decoration: underline;
}

.breadcrumb__link:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 2px;
  border-radius: var(--radius-sm);
}

.breadcrumb__separator {
  color: var(--color-text-muted);
  font-size: var(--text-xs);
}

.breadcrumb__current {
  color: var(--color-text);
  font-weight: var(--weight-medium);
}

/* 箭头变体 */
.breadcrumb--arrow .breadcrumb__separator {
  display: inline-block;
  width: 0;
  height: 0;
  border-style: solid;
  border-width: 4px 0 4px 6px;
  border-color: transparent transparent transparent var(--color-text-muted);
  margin: 0 var(--space-1);
}

/* 斜杠变体 */
.breadcrumb--slash .breadcrumb__separator {
  color: var(--color-text-muted);
}

/* 面包屑容器 */
.breadcrumb__container {
  padding: var(--space-3) 0;
}

/* 图标支持 */
.breadcrumb__icon {
  width: 16px;
  height: 16px;
  flex-shrink: 0;
}

/* 禁用状态 */
.breadcrumb__link--disabled {
  color: var(--color-text-muted);
  cursor: not-allowed;
  pointer-events: none;
}

/* 响应式 */
@media (max-width: 640px) {
  .breadcrumb {
    font-size: var(--text-xs);
  }
  
  .breadcrumb__separator {
    margin: 0;
  }
}

AI 使用说明

组件名: breadcrumb
选择器: .breadcrumb
依赖: /tokens/tokens.css
文件: /components/breadcrumb/breadcrumb.html

纯 HTML + CSS,零框架依赖,AI 友好