中,便于批量操作;
每个 .link 元素的 class(如 first、second)与对应内容区块的 id(id="first"、id="second")严格一致,建立映射关系;
移除所有空 href,彻底规避跳转风险。
Trigonometric Calculations
Integration&
Differentiation
2. CSS 控制显隐状态
.hidden { display: none; }
.show { display: block; }
.link {
cursor: pointer;
padding: 8px 12px;
user-select: none;
}
.link:hover { background-color: #f5f5f5; }3. JavaScript 逻辑(简洁健壮)
document.addEventListener('DOMContentLoaded', () => {
const links = document.querySelectorAll('.link');
const contents = Array.from(document.getElementById('sub-contents').children);
links.forEach(link => {
link.addEventListener('click', function(e) {
e.preventDefault(); // 冗余防护(虽已无 a 标签,仍建议保留)
const targetId = this.classList[1]; // 获取 'first', 'second' 等标识
contents.forEach(el => {
el.classList.toggle('show', el.id === targetId);
el.classList.toggle('hidden', el.id !== targetId);
});
});
});
});? 关键点说明:使用 classList.toggle(className, condition) 精确控制每个区块的 show/hidden 状态;e.preventDefault() 是防御性写法,即使未来混入 也能兼容;DOMContentLoaded 确保 DOM 加载完成后再绑定事件,避免查询失败。
⚠️ 注意事项
-
ID 命名一致性:.link.first 必须对应 #first,大小写与连字符需完全一致;
-
避免重复类名冲突:原示例中部分
同时含 sub-cont 和 matrix,若后续 CSS 规则依赖组合类,请确保不意外影响主菜单样式;
-
无障碍增强(进阶):可为 .link 添加 role="button" 和 tabindex="0",支持键盘聚焦与回车触发。
此方案结构清晰、解耦性强,既解决了“闪退”问题,又为后续扩展(如添加淡入动画、记忆上次展开项)打下良好基础。