当前位置: 首页 > article >正文

使用 HTML + JavaScript 实现组织架构图

文章目录一、组织架构图二、效果演示三、系统分析1.页面结构1.1 操作区域1.2 组织结构图区域2 核心功能实现2.1 数据结构定义2.2 节点渲染逻辑2.3节点展开/收起功能2.4 全部展开/收起四、扩展建议五、完整代码一、组织架构图在企业管理系统或团队协作平台中组织结构图是一种重要的可视化工具能够清晰地展示公司的层级关系和人员分布。本文将详细介绍如何使用 HTML、CSS 和 JavaScript 从零开始构建一个具有交互功能的组织结构图。二、效果演示本项目呈现了一个典型的公司组织架构从上级开始逐层向下展示各个部门及员工职位。用户可以通过点击节点上的 /- 按钮来展开或收起子节点也可以通过顶部的“展开/收起全部”按钮一键控制所有节点的状态。默认情况下部分节点被设置为收起状态以避免图表过于庞大用户可以根据需要自由展开查看详细信息。三、系统分析1.页面结构系统主要包括以下几个功能区域1.1 操作区域该区域位于主内容上方提供全局操作按钮目前只有一个“展开/收起全部”的功能按钮用户可以一键控制所有节点的展开状态。divclassactionsbuttononclicktoggleAll()展开/收起全部/button/div1.2 组织结构图区域这是实际渲染组织结构图的核心区域使用 #orgChart 作为根节点容器。divclassorg-chart-containerdivclassorg-chartidorgChart/div/div2 核心功能实现2.1 数据结构定义组织结构图的数据源是一个嵌套的 json 数据每个节点包含 id、name、position 和 children 属性。这种树形数据结构非常适合表示层级关系并且易于遍历和渲染。varorgData{id:1,name:张伟,position:CEO,children:[{id:2,name:李娜,position:技术总监,children:[// ... 更多子节点]},// ... 更多同级节点]};2.2 节点渲染逻辑使用递归方式渲染整个组织结构图通过递归遍历数据结构为每个节点创建对应的DOM元素并根据是否有子节点添加相应的CSS类名。functionrenderOrgChart(data,container){// 创建当前节点varnodeEldocument.createElement(div);nodeEl.classNamenode;nodeEl.dataset.iddata.id;// 如果有子节点添加标识类if(data.childrendata.children.length0){nodeEl.classList.add(has-children);}// 设置节点内容nodeEl.innerHTMLdiv classtitle${data.name}/div div classposition${data.position}/div div classtoggle-btn/div;// 为切换按钮添加点击事件if(data.childrendata.children.length0){consttoggleBtnnodeEl.querySelector(.toggle-btn);toggleBtn.addEventListener(click,function(e){e.stopPropagation();nodeEl.classList.toggle(collapsed);});}container.appendChild(nodeEl);// 如果有子节点创建子节点容器if(data.childrendata.children.length0){varchildrenEldocument.createElement(div);childrenEl.classNamechildren;data.children.forEach((child,index){varchildWrapperdocument.createElement(div);childWrapper.classNamechild;// 添加特殊类名用于样式控制if(data.children.length1){childWrapper.classList.add(only-child);}elseif(index0){childWrapper.classList.add(first-child);}elseif(indexdata.children.length-1){childWrapper.classList.add(last-child);}renderOrgChart(child,childWrapper);childrenEl.appendChild(childWrapper);});container.appendChild(childrenEl);}// 默认收起部分节点if(data.id2||data.id4){nodeEl.classList.add(collapsed);}}2.3节点展开/收起功能通过给节点添加/移除 .collapsed 类来控制子节点的显示与隐藏。CSS 中利用相邻兄弟选择器来隐藏被收起节点的子级容器同时通过伪元素 ::after 在节点下方显示 /- 按钮提升用户体验。相关事件在“节点渲染逻辑”中“为切换按钮添加点击事件”绑定2.4 全部展开/收起首先判断当前是否所有节点都处于收起状态然后统一执行相反的操作。functiontoggleAll(){varnodesdocument.querySelectorAll(.node.has-children);varisAllCollapsedArray.from(nodes).every(nodenode.classList.contains(collapsed));nodes.forEach(node{if(isAllCollapsed){node.classList.remove(collapsed);}else{node.classList.add(collapsed);}});}四、扩展建议节点编辑功能支持双击节点进入编辑状态修改人员信息拖拽排序引入拖拽库实现组织架构的可视化调整导出功能支持将组织结构图导出为图片或PDF格式主题定制提供更多颜色方案和样式选项满足不同企业的品牌形象需求五、完整代码git地址https://gitee.com/ironpro/hjdemo/blob/master/orgchart/index.html!DOCTYPEhtmlhtmllangzh-CNheadmetacharsetUTF-8metanameviewportcontentwidthdevice-width, initial-scale1.0title组织结构图/titlestyle*{margin:0;padding:0;box-sizing:border-box;}body{background-color:#f5f5f5;min-height:100vh;padding:20px;}.container{max-width:980px;margin:0 auto;background:white;border-radius:15px;box-shadow:0 20px 40pxrgba(0,0,0,0.1);overflow:hidden;}.header{background:#45a049;color:white;padding:20px;text-align:center;}.header h1{font-size:24px;font-weight:500;}.main{padding:20px;}.org-chart-container{display:flex;justify-content:center;overflow:auto;padding:20px 0;}.org-chart{display:flex;flex-direction:column;align-items:center;position:relative;}.node{background-color:white;border:2px solid #4CAF50;border-radius:8px;padding:15px;width:120px;text-align:center;box-shadow:0 2px 5pxrgba(0,0,0,0.1);position:relative;cursor:pointer;transition:all 0.3s ease;display:inline-block;}.node:hover{box-shadow:0 4px 10pxrgba(0,0,0,0.5);}.node .title{font-weight:bold;color:#333;margin-bottom:5px;}.node .position{color:#666;font-size:14px;}.children{display:flex;justify-content:center;margin-top:40px;position:relative;}.children::before{content:;position:absolute;top:-40px;left:50%;width:2px;height:20px;background-color:#4CAF50;}.child{position:relative;padding:0 10px;text-align:center;}.child::before{content:;position:absolute;top:-20px;left:50%;width:2px;height:20px;background-color:#4CAF50;}.child::after{content:;position:absolute;top:-20px;left:0;width:100%;height:2px;background-color:#4CAF50;}.first-child::after{width:50%;left:50%;}.last-child::after{width:50%;}.only-child::after{width:0;}.actions{text-align:center;}button{background-color:#4CAF50;color:white;border:none;padding:10px 15px;border-radius:4px;cursor:pointer;margin:0 5px;font-size:14px;}button:hover{background-color:#45a049;}.node.collapsed .children{display:none;}.node .toggle-btn::after{content:-;position:absolute;bottom:-10px;left:50%;transform:translateX(-50%);width:20px;height:20px;background-color:#4CAF50;color:white;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:bold;font-size:16px;z-index:9;cursor:pointer;}.node.collapsed .toggle-btn::after{content:;}.node:not(.has-children) .toggle-btn{display:none;}/style/headbodydivclasscontainerdivclassheaderh1组织结构图/h1/divdivclassmaindivclassactionsbuttononclicktoggleAll()展开/收起全部/button/divdivclassorg-chart-containerdivclassorg-chartidorgChart/div/div/div/divscriptvarorgData{id:1,name:张伟,position:CEO,children:[{id:2,name:李娜,position:技术总监,children:[{id:4,name:王强,position:前端主管,children:[{id:7,name:陈晨,position:前端工程师},{id:8,name:刘芳,position:UI设计师}]},{id:5,name:赵磊,position:后端主管,children:[{id:9,name:孙丽,position:Java工程师},{id:10,name:周鹏,position:数据库专家}]}]},{id:3,name:马华,position:市场总监,children:[{id:6,name:吴敏,position:市场经理,children:[{id:11,name:郑涛,position:市场专员},{id:12,name:黄娟,position:品牌专员}]}]}]};// 渲染组织结构图functionrenderOrgChart(data,container){// 创建当前节点varnodeEldocument.createElement(div);nodeEl.classNamenode;nodeEl.dataset.iddata.id;// 如果有子节点添加标识类if(data.childrendata.children.length0){nodeEl.classList.add(has-children);}// 设置节点内容nodeEl.innerHTMLdiv classtitle${data.name}/div div classposition${data.position}/div div classtoggle-btn/div;// 为切换按钮添加点击事件if(data.childrendata.children.length0){consttoggleBtnnodeEl.querySelector(.toggle-btn);toggleBtn.addEventListener(click,function(e){e.stopPropagation();nodeEl.classList.toggle(collapsed);});}container.appendChild(nodeEl);// 如果有子节点创建子节点容器if(data.childrendata.children.length0){varchildrenEldocument.createElement(div);childrenEl.classNamechildren;data.children.forEach((child,index){varchildWrapperdocument.createElement(div);childWrapper.classNamechild;// 添加特殊类名用于样式控制if(data.children.length1){childWrapper.classList.add(only-child);}elseif(index0){childWrapper.classList.add(first-child);}elseif(indexdata.children.length-1){childWrapper.classList.add(last-child);}renderOrgChart(child,childWrapper);childrenEl.appendChild(childWrapper);});container.appendChild(childrenEl);}// 默认收起部分节点if(data.id2||data.id4){nodeEl.classList.add(collapsed);}}// 初始化组织结构图functioninitOrgChart(){varcontainerdocument.getElementById(orgChart);container.innerHTML;renderOrgChart(orgData,container);}// 展开/收起全部节点functiontoggleAll(){varnodesdocument.querySelectorAll(.node.has-children);varisAllCollapsedArray.from(nodes).every(nodenode.classList.contains(collapsed));nodes.forEach(node{if(isAllCollapsed){node.classList.remove(collapsed);}else{node.classList.add(collapsed);}});}initOrgChart();/script/body/html

相关文章:

使用 HTML + JavaScript 实现组织架构图

文章目录一、组织架构图二、效果演示三、系统分析1.页面结构1.1 操作区域1.2 组织结构图区域2 核心功能实现2.1 数据结构定义2.2 节点渲染逻辑2.3节点展开/收起功能2.4 全部展开/收起四、扩展建议五、完整代码一、组织架构图 在企业管理系统或团队协作平台中,组织结…...

告别裸机轮询:用STM32串口中断+DMA实现高效数据收发(附F103/F4代码对比)

STM32串口通信进阶:中断与DMA的高效实战指南 在嵌入式开发中,串口通信如同系统的神经末梢,承担着设备间数据交换的重任。当项目从简单的调试打印升级到高速数据流处理时,传统的轮询方式往往显得力不从心。本文将带您深入STM32的US…...

鸿蒙_使用组件导航Navigation搭建应用框架

组件导航封装了页面、标题、菜单栏、工具栏等功能,我们只需要进行简单的设置,就能快速搭建应用的框架,我们直接新建一个独立页面来通过组件导航实现主页、设置页、我的页三个示例页面,并且相互之间可以跳转,并且天然支…...

如何在Linux系统上免费体验专业图像编辑:Photoshop CC 2022完整安装指南

如何在Linux系统上免费体验专业图像编辑:Photoshop CC 2022完整安装指南 【免费下载链接】Photoshop-CC2022-Linux Installer from Photoshop CC 2021 to 2022 on linux with a GUI 项目地址: https://gitcode.com/gh_mirrors/ph/Photoshop-CC2022-Linux 对于…...

500+ RPG Maker插件终极指南:如何快速提升游戏开发效率

500 RPG Maker插件终极指南:如何快速提升游戏开发效率 【免费下载链接】RPGMakerMV RPGツクールMV、MZで動作するプラグインです。 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerMV RPG Maker开发者们,你们是否曾为游戏开发中的各种限制…...

腾讯云轻量2核2G Ubuntu 服务器配置 + Xshell 连接服务器

购买成功会跳转到这个页面一、第一步:放行防火墙端口(必做!否则连不上、访问不了) 我们现在在服务器列表页,必须先开放端口,否则 Xshell 连不上、项目也访问不了。 1. 进入防火墙设置 点击截图箭头指向的 「…...

Ubuntu系统下SocketCAN实战:免驱配置PCAN/PCAN FD设备全流程

1. 认识SocketCAN与PCAN设备 在嵌入式开发和汽车电子领域,CAN总线就像设备之间的"神经传导系统",而SocketCAN则是Linux内核为这个系统提供的"标准语言接口"。我第一次接触PCAN设备时,发现它有个巨大优势——大多数型号在…...

Buck电路损耗深度解析:从米勒效应到效率优化实战

1. Buck电路损耗的三大来源 Buck电路作为最常见的DC-DC降压拓扑,其效率问题一直是工程师关注的焦点。在实际应用中,Buck电路的损耗主要来自三个方面:电感损耗、开关损耗和续流二极管损耗。其中开关损耗往往是最难啃的"硬骨头"&…...

C语言实战:基于LU分解的高效矩阵求逆与行列式计算

1. 为什么需要LU分解? 第一次接触矩阵运算时,我总在想:为什么要把简单的矩阵乘法搞得这么复杂?直到在图像处理项目中遇到一个50005000的矩阵求逆问题,直接调用库函数跑了半小时还没结果,才意识到算法效率的…...

伯明翰大学:智能人机协作工作环境未来——迈向人人有意义的工作 2026

这份 2026 年伯明翰大学发布的智能人机协作工作环境白皮书,核心是围绕制造业人机协作,提出以人为本、技术赋能、有意义工作的未来方向,全文可概括为四大核心内容与最终主张:一、核心结论未来制造业人机协作不是机器取代人&#xf…...

Neural Renderer实战:从3D模型到物理对抗样本的渲染流程解析

1. Neural Renderer与物理对抗攻击初探 第一次听说Neural Renderer能用于生成物理对抗样本时,我的反应和大多数开发者一样——既兴奋又困惑。兴奋的是这个技术能让3D模型在真实世界中"隐身",困惑的是具体实现路径。经过三个月的项目实践&#…...

具身智能科技行业前瞻探索——多任务操作、第一人称世界模型、低光照与模糊感知 国泰证券 2026-4

这份国泰海通证券 2026 年 4 月发布的具身智能科技前瞻探索(第 3 期),核心是梳理 6 项前沿技术成果,聚焦人形机器人与具身智能的多任务、感知、仿真、控制、多模态五大突破,明确学术价值与产业落地方向。一、核心背景人…...

HarmonyOS 6学习:Swiper组件圆点指示器颜色叠加问题解析与解决方案

一、前言:一个看似简单却困扰开发者的视觉问题在HarmonyOS应用开发中,Swiper组件作为实现轮播图、图片浏览、引导页等功能的利器,被广泛应用于各类应用场景。其内置的圆点指示器(indicator)功能,为用户提供…...

别再忍受龟速下载了!保姆级教程:为Conda配置清华/阿里云镜像源(Windows/Mac/Linux全平台)

告别Conda下载卡顿:国内镜像源配置全攻略 每次看到Conda下载进度条像蜗牛一样爬行,是不是想砸键盘的心都有了?国内开发者使用默认源下载Python包时,经常遭遇三位数的下载速度,一个简单的numpy安装可能就要消耗半小时咖…...

【深度评测】腾讯云SA3星星海实例:AMD EPYC Milan处理器性能全面解析

1. 腾讯云SA3星星海实例初体验 第一次接触腾讯云SA3星星海实例时,我正为一个机器学习项目寻找合适的云服务器。当时测试了市面上多款机型,直到遇到这款搭载AMD EPYC Milan处理器的SA3实例,性能表现着实让我惊喜。简单来说,SA3就像…...

OBS智能背景移除插件:3步实现专业级无绿幕抠图效果

OBS智能背景移除插件:3步实现专业级无绿幕抠图效果 【免费下载链接】obs-backgroundremoval An OBS plugin for removing background in portrait images (video), making it easy to replace the background when recording or streaming. 项目地址: https://git…...

ABAP Cloud 测试这件事,别等开发收尾才想起来

很多团队一聊到测试,脑子里冒出来的还是上线前跑一遍功能、点几下 Fiori 页面、确认接口能通就算过关。真正到了 ABAP Cloud 项目里,这套做法很快就会露怯。原因不复杂,应用、服务、行为实现、业务事件、UI 层交织在一起,只要有一层没有被持续验证,回归问题就会像滚雪球一…...

保姆级教程:用LangGraph的init_chat_model,5分钟搞定SiliconFlow和本地Ollama模型切换

5分钟掌握LangGraph模型切换术:SiliconFlow与Ollama无缝切换实战 当开发者需要在不同大语言模型之间快速切换时,LangGraph的init_chat_model功能就像一把万能钥匙。想象一下这样的场景:你正在调试一个AI应用,需要在云端高性能模型…...

AltDrag完整指南:一键改变Windows窗口操作体验的终极工具

AltDrag完整指南:一键改变Windows窗口操作体验的终极工具 【免费下载链接】altdrag :file_folder: Easily drag windows when pressing the alt key. (Windows) 项目地址: https://gitcode.com/gh_mirrors/al/altdrag 你是否厌倦了每次移动窗口都要精准点击标…...

GBase 8a数据库的“晚期物化内存瘦身术”解析(上)

明明只想查几列数据,数据库却把整行数据都拽进内存,结果内存爆了、查询慢了、并发没了。南大通用GBase 8a数据库(gbase database)的“晚期物化”技术,专门解决这个问题。它用“行号”代替真实数据跑完所有中间计算,只在…...

前端测试:别让bug悄悄溜进你的应用

前端测试:别让bug悄悄溜进你的应用 什么是前端测试? 前端测试是指对前端应用进行测试,确保其功能正常、性能良好、用户体验优秀。别以为测试只是后端的事,前端测试同样重要,否则你的应用就会充满bug。 为什么需要前端测…...

前端框架选择:别再纠结,这篇文章告诉你答案

前端框架选择:别再纠结,这篇文章告诉你答案 为什么需要选择前端框架? 前端框架可以帮助开发者更高效地构建前端应用,提供了一套完整的工具和最佳实践。别以为随便选个框架就行,选择合适的框架可以显著提高开发效率&…...

kaishi啦啦啦啦

...

SQL子查询与临时表的性能对比_实战测试分析

标量子查询在WHERE中可能被重复执行,应优先用LEFT JOIN预聚合或派生表;临时表有开销,CTE默认不物化,需显式提示或改用临时表。子查询在 WHERE 中执行多次?先看执行计划MySQL 或 PostgreSQL 里,WHERE 子句中…...

新手必看:UDOP-large文档理解模型从部署到实战全流程

新手必看:UDOP-large文档理解模型从部署到实战全流程 1. 引言:文档理解的新选择 在数字化办公时代,我们每天都要处理大量文档——论文、合同、发票、报告...传统的人工处理方式不仅效率低下,还容易出错。想象一下,如…...

告别工业UI!Ostrakon-VL像素终端如何提升一线员工图像识别体验

告别工业UI!Ostrakon-VL像素终端如何提升一线员工图像识别体验 1. 重新定义零售图像识别体验 在零售和餐饮行业,一线员工每天需要处理大量图像识别任务:检查货架商品、核对价签、评估店面环境等。传统工业级UI界面往往设计呆板、操作复杂&a…...

开关电源CCM与DCM模式选择指南:从理论到实践

1. 开关电源CCM与DCM模式基础解析 第一次接触开关电源设计时,我被CCM和DCM这两个专业术语搞得一头雾水。直到亲手烧坏三个MOS管后,才真正理解它们的区别。简单来说,CCM(连续导通模式)就像高速公路上的车流,…...

别再为分享文件发愁了!Android开发者的FileProvider保姆级配置指南(附避坑清单)

Android文件共享实战:FileProvider全流程配置与深度避坑指南 每次看到团队成员在Slack群里抱怨"为什么我的分享功能又崩溃了?",我就知道又有开发者掉进了Android文件共享的陷阱。作为从Android 4.4时代就开始与FileProvider斗智斗勇…...

QuickBMS完整指南:游戏资源提取与修改的终极工具

QuickBMS完整指南:游戏资源提取与修改的终极工具 【免费下载链接】QuickBMS QuickBMS by aluigi - Github Mirror 项目地址: https://gitcode.com/gh_mirrors/qui/QuickBMS 在游戏开发和逆向工程领域,QuickBMS 是一款功能强大的通用文件提取工具…...

nlp_structbert_sentence-similarity_chinese-large部署教程:支持Windows WSL2环境,CUDA驱动自动适配方案

nlp_structbert_sentence-similarity_chinese-large部署教程:支持Windows WSL2环境,CUDA驱动自动适配方案 1. 工具简介 nlp_structbert_sentence-similarity_chinese-large是一个专门处理中文句子语义相似度的本地工具。它基于StructBERT-Large中文模型…...