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