// playground.js
const sidebar = document.getElementById('pg-sidebar');
// 组件列表(10类)
const components = [
{ id: 'button', name: '按钮 Button', desc: '基础交互按钮,支持多种样式变体' },
{ id: 'input', name: '输入框 Input', desc: '文本输入框,支持多种状态' },
{ id: 'card', name: '卡片 Card', desc: '内容容器,带阴影和边框' },
{ id: 'tag', name: '标签 Tag', desc: '用于标记、分类' },
{ id: 'alert', name: '提示框 Alert', desc: '反馈信息,成功/警告/错误' },
{ id: 'modal', name: '模态框 Modal', desc: '弹窗,需要时显示' },
{ id: 'progress', name: '进度条 Progress', desc: '展示操作进度' },
{ id: 'switch', name: '开关 Switch', desc: '切换状态' },
{ id: 'avatar', name: '头像组 Avatar', desc: '用户头像,支持组合' },
{ id: 'breadcrumb', name: '面包屑 Breadcrumb', desc: '显示当前页面位置' }
];
// 生成侧边栏导航
function renderSidebar() {
const ul = document.createElement('ul');
components.forEach(comp => {
const li = document.createElement('li');
li.textContent = comp.name;
li.dataset.target = comp.id;
li.addEventListener('click', () => {
document.getElementById(`comp-${comp.id}`).scrollIntoView({ behavior: 'smooth' });
// 手机端点击后关闭侧边栏
if (window.innerWidth <= 768) {
sidebar.classList.remove('active');
}
});
ul.appendChild(li);
});
sidebar.innerHTML = '';
sidebar.appendChild(ul);
}
// 生成所有组件演示区块(包含真实示例)
function renderContent() {
const content = document.getElementById('pg-content');
components.forEach(comp => {
const section = document.createElement('section');
section.id = `comp-${comp.id}`;
section.className = 'comp-section';
const h2 = document.createElement('h2');
h2.textContent = comp.name;
section.appendChild(h2);
const desc = document.createElement('p');
desc.className = 'comp-desc';
desc.textContent = comp.desc;
section.appendChild(desc);
const preview = document.createElement('div');
preview.className = 'comp-preview';
preview.id = `preview-${comp.id}`;
// 根据组件类型填充示例
if (comp.id === 'button') {
preview.innerHTML = `
`;
} else if (comp.id === 'input') {
preview.innerHTML = `
`;
} else if (comp.id === 'card') {
preview.innerHTML = `
`;
} else if (comp.id === 'tag') {
preview.innerHTML = `
默认标签
主要标签
成功标签
警告标签
危险标签
`;
} else if (comp.id === 'alert') {
preview.innerHTML = `
这是一条信息提示
操作成功!
请注意!
出错了!
`;
} else if (comp.id === 'modal') {
preview.innerHTML = `
(静态展示,实际是浮层)
`;
} else if (comp.id === 'progress') {
preview.innerHTML = `
`;
} else if (comp.id === 'switch') {
preview.innerHTML = `
`;
} else if (comp.id === 'avatar') {
preview.innerHTML = `
单人
`;
} else if (comp.id === 'breadcrumb') {
preview.innerHTML = `
`;
}
section.appendChild(preview);
const codeDiv = document.createElement('div');
codeDiv.className = 'comp-code';
codeDiv.id = `code-${comp.id}`;
const pre = document.createElement('pre');
if (comp.id === 'button') {
pre.textContent = `\n\n`;
} else if (comp.id === 'input') {
pre.textContent = `\n`;
} else if (comp.id === 'card') {
pre.textContent = ``;
} else if (comp.id === 'tag') {
pre.textContent = `默认\n主要`;
} else if (comp.id === 'alert') {
pre.textContent = `信息
\n成功
`;
} else if (comp.id === 'modal') {
pre.textContent = ``;
} else if (comp.id === 'progress') {
pre.textContent = ``;
} else if (comp.id === 'switch') {
pre.textContent = ``;
} else if (comp.id === 'avatar') {
pre.textContent = ``;
} else if (comp.id === 'breadcrumb') {
pre.textContent = ``;
}
codeDiv.appendChild(pre);
const copyBtn = document.createElement('button');
copyBtn.className = 'copy-btn';
copyBtn.textContent = '复制';
copyBtn.onclick = () => copyCode(comp.id);
codeDiv.appendChild(copyBtn);
section.appendChild(codeDiv);
const toggleBtn = document.createElement('button');
toggleBtn.className = 'toggle-code-btn';
toggleBtn.textContent = '查看代码 ▼';
toggleBtn.onclick = () => toggleCode(comp.id);
section.appendChild(toggleBtn);
content.appendChild(section);
});
}
// 切换代码显示/隐藏
window.toggleCode = function(compId) {
const codeDiv = document.getElementById(`code-${compId}`);
const toggleBtn = document.querySelector(`#comp-${compId} .toggle-code-btn`);
if (codeDiv.style.display === 'none' || !codeDiv.style.display) {
codeDiv.style.display = 'block';
toggleBtn.textContent = '隐藏代码 ▲';
} else {
codeDiv.style.display = 'none';
toggleBtn.textContent = '查看代码 ▼';
}
};
// 复制代码
window.copyCode = function(compId) {
const codeDiv = document.getElementById(`code-${compId}`);
const code = codeDiv.querySelector('pre').innerText;
navigator.clipboard.writeText(code).then(() => {
alert('代码已复制!');
});
};
// 滚动高亮
function setupIntersectionObserver() {
const sections = document.querySelectorAll('.comp-section');
const navItems = document.querySelectorAll('#pg-sidebar li');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const id = entry.target.id.replace('comp-', '');
navItems.forEach(item => {
item.classList.remove('active');
if (item.dataset.target === id) {
item.classList.add('active');
}
});
}
});
}, { threshold: 0.3 });
sections.forEach(section => observer.observe(section));
}
// 汉堡菜单交互
const menuToggle = document.getElementById('menuToggle');
if (menuToggle) {
menuToggle.addEventListener('click', () => {
sidebar.classList.toggle('active');
});
}
// 窗口大小改变时,如果大于768px,强制移除active类
window.addEventListener('resize', () => {
if (window.innerWidth > 768) {
sidebar.classList.remove('active');
}
});
// 初始化
document.addEventListener('DOMContentLoaded', () => {
renderSidebar();
renderContent();
setupIntersectionObserver();
});