讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

剧云
剧云

中文短剧剧本制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

使用 D3.js 构建数据驱动的响应式侧边栏导航

夜雪小哥_7524

夜雪小哥_7524

发布时间:2026-03-10 17:00:14

|

926人浏览过

|

来源于php中文网

原创

使用 D3.js 构建数据驱动的响应式侧边栏导航

本文详解如何利用 d3.js 基于嵌套 json 数据动态生成符合语义化结构的多级侧边栏导航(含标题头、可展开菜单项及子页面列表),并修复常见嵌套绑定错误。

本文详解如何利用 d3.js 基于嵌套 json 数据动态生成符合语义化结构的多级侧边栏导航(含标题头、可展开菜单项及子页面列表),并修复常见嵌套绑定错误。

在构建现代单页应用(SPA)或管理后台时,一个结构清晰、数据驱动的侧边栏导航(Sidebar Navigation)至关重要。D3.js 不仅适用于可视化图表,其强大的数据绑定与 DOM 操作能力也使其成为动态生成复杂嵌套导航的理想工具——尤其当导航结构需随配置数据实时变化时。

以下是一个典型的数据结构示例,包含两类节点:header(仅显示标题)和 item(可点击菜单项,部分支持下拉子菜单):

const sidenavData = [
  { 'name': 'Header name 1', 'type': 'header' },
  { 
    'name': 'Menu item 1', 
    'type': 'item', 
    'hasPages': [{ 'name': 'Page 1' }, { 'name': 'Page 2' }] 
  },
  { 
    'name': 'Menu item 2', 
    'type': 'item', 
    'hasPages': [{ 'name': 'Report 1' }, { 'name': 'Report 2' }, { 'name': 'Report 3' }] 
  },
  { 'name': 'Header name 2', 'type': 'header' },
  { 'name': 'Notifications', 'type': 'item' },
  { 'name': 'Messages', 'type': 'item' }
];

✅ 正确实现:使用 .each() 处理异构数据分支

核心难点在于:不同 type 的数据项需生成完全不同的 DOM 结构(header 无 标签;带 hasPages 的 item 需嵌套

✅ 推荐解法是:先绑定顶层数据,再在每个

JSON Toolkit
JSON Toolkit

JSON文件多功能工具。支持格式化、验证、压缩、键排序及点记法路径查询。零依赖。

下载
  • 节点内使用 .each() 进行条件分支渲染:
    const nav = d3.select('ul.sidebar-nav');
    
    nav.selectAll('li')
      .data(sidenavData)
      .enter()
      .append('li')
      .attr('class', d => d.type === 'header' ? 'sidebar-header' : 'sidebar-item')
      .each(function(d) {
        const li = d3.select(this);
    
        if (d.type === 'header') {
          // 纯文本标题
          li.text(d.name);
        } else if (Array.isArray(d.hasPages) && d.hasPages.length > 0) {
          // 含子菜单项:先插入 <a>,再追加 <ul.sidebar-dropdown>
          const link = li.append('a')
            .attr('class', 'sidebar-link')
            .text(d.name);
    
          link.append('ul')
            .attr('class', 'sidebar-dropdown')
            .selectAll('li')
            .data(d.hasPages)
            .enter()
            .append('li')
            .attr('class', 'sidebar-item')
            .append('a')
            .attr('class', 'sidebar-link')
            .text(page => page.name);
        } else {
          // 普通菜单项:仅插入 <a>
          li.append('a')
            .attr('class', 'sidebar-link')
            .text(d.name);
        }
      });

    ? 关键细节说明:

    ⚠️ 注意事项与最佳实践

    • 数据健壮性:始终检查嵌套字段是否存在且为数组,避免运行时崩溃;
    • CSS 类命名一致性:确保 .sidebar-header、.sidebar-dropdown 等类名与 CSS 样式严格匹配,推荐配合 CSS-in-JS 或 BEM 规范;
    • 可访问性(a11y):为可展开菜单添加 aria-expanded 和 aria-haspopup="true",并监听键盘事件(如 Enter/Space 展开);
    • 性能考量:若导航项极多(>100 条),考虑虚拟滚动或分页加载,避免一次性渲染过多 DOM;
    • D3 版本兼容性:上述代码兼容 D3 v4–v7;若使用 v6+,可启用 d3-selection@3 的 selection.join() 简化写法(但分支逻辑仍需 .each())。

    ✅ 最终输出结构(验证通过)

    执行后,DOM 将精确生成如下语义化 HTML:

    <ul class="sidebar-nav">
      <li class="sidebar-header">Header name 1</li>
      <li class="sidebar-item">
        <a class="sidebar-link">Menu item 1</a>
        <ul class="sidebar-dropdown">
          <li class="sidebar-item"><a class="sidebar-link">Page 1</a></li>
          <li class="sidebar-item"><a class="sidebar-link">Page 2</a></li>
        </ul>
      </li>
      <!-- 其余项依此类推 -->
    </ul>

    通过将数据结构与 DOM 渲染逻辑解耦,并借助 D3 的声明式绑定能力,你不仅能高效构建可维护的导航组件,还能为未来扩展(如权限过滤、动态加载、国际化)预留清晰接口。

  • 相关文章

    驱动精灵
    驱动精灵

    驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

    下载

    相关标签:

    js

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热门AI工具

    更多
    UpDream
    UpDream Hot

    一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

    Laper
    Laper Hot

    Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

    函子Zion

    一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

    DeepSeek

    DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

    讯飞绘文

    讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

    码上飞
    码上飞 Hot

    一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

    豆包大模型

    豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

    SkildArt
    SkildArt Hot

    SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

    WorkBuddy

    一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

    相关专题

    更多
    js获取数组长度的方法
    js获取数组长度的方法

    在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

    5906

    2023.06.20

    js刷新当前页面
    js刷新当前页面

    js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

    1409

    2023.07.04

    js四舍五入
    js四舍五入

    js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

    5824

    2023.07.04

    js删除节点的方法
    js删除节点的方法

    js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

    1060

    2023.09.01

    JavaScript转义字符
    JavaScript转义字符

    JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

    2036

    2023.09.04

    js生成随机数的方法
    js生成随机数的方法

    js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

    4005

    2023.09.04

    如何启用JavaScript
    如何启用JavaScript

    JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

    5313

    2023.09.12

    Js中Symbol类详解
    Js中Symbol类详解

    javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

    3480

    2023.09.20

    Go-Zero API开发使用教程
    Go-Zero API开发使用教程

    本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

    40

    2026.11.12

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    WEB前端教程【HTML5+CSS3+JS】
    WEB前端教程【HTML5+CSS3+JS】

    共101课时 | 21.3万人学习

    JS进阶与BootStrap学习
    JS进阶与BootStrap学习

    共39课时 | 4.9万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn