news 2026/10/10 6:35:31

纯CSS侧边伸缩导航栏:复选框Hack与:target方案详解及避坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
纯CSS侧边伸缩导航栏:复选框Hack与:target方案详解及避坑

简介:这是一份基于原生 HTML 与 CSS 实现的侧边伸缩导航栏网页源码,适合前端初学者或需要快速搭建后台管理界面侧边菜单的开发者。资源不依赖复杂框架,重点演示按钮控制展开/关闭、子菜单显隐、过渡动画及响应式适配等核心交互。压缩包共 9 个文件,其中包含 2 个 HTML 示例页面和 2 个 CSS 样式文件,另有 1 个 JavaScript 脚本用于交互控制,1 个字体图标文件(ttf)及对应配置文件,其余为说明文本和效果预览图,整包大小仅 61KB,便于直接查看与二次修改。已有 6078 人学习下载,代码结构简洁,注释清晰,覆盖从 HTML 结构设计到 CSS 选择器、媒体查询、悬停/聚焦伪类的完整实现思路。通过阅读源码,可以掌握侧边栏在桌面与移动端的显示切换逻辑,并学会如何用极简代码实现流畅伸缩动效,适合作为个人项目起步模板或教学案例。

1. 一个纯 CSS 就能实现的侧边伸缩导航栏,为什么值得你重写一遍

我见过不少前端项目,导航栏伸缩这个功能最后都交给了 JS 来做:监听点击、切换 class、控制宽度。逻辑不复杂,但代价是状态管理、事件绑定、动画时序,一不留神就产出几百行代码。其实用 HTML 的隐藏复选框配合 CSS 选择器,就能完整实现侧边导航栏的展开与收起,零 JavaScript,刷新页面后状态还能保持。你只需要两个标签、一条:checked规则和一段transition,就能在十分钟内跑通一版。

这篇文章适合两类人:一类是被 JS 导航栏折磨过、想换一个更省心的方案的前端开发者;另一类是刚学完 CSS 基础,想用真实组件练手的新手。我会把原理拆开讲清楚,再给你可以直接抄的代码和参数,最后把我踩过的坑按「现象、原因、解决」的方式交代明白。看完你能做出来,还敢用到自己的项目里。

2. 两种纯 CSS 实现方案:复选框 Hack 与 :target 伪类,怎么选

2.1 复选框 Hack 的原理:兄弟选择器 + :checked 状态

纯 CSS 实现侧边栏伸缩,核心矛盾是「CSS 没有记忆能力」。用户点击一次,菜单要变窄;再点击一次,菜单要还原。CSS 本身不记录「点击了几次」,但它有一个天然的状态开关——复选框的checked属性。勾选和取消勾选,由浏览器负责记忆,CSS 只需要读取这个状态。

利用这个原理,我们把一个<input type="checkbox">隐藏起来,把导航栏的开关按钮做成<label>元素。label 有一个天然特性:点击它会自动切换与之关联的表单控件状态。只要 label 的for属性等于 input 的id,或者 label 直接包住 input,点击 label 就等于点击了复选框。

状态切换之后,怎么让侧边栏跟着变?这里用到 CSS 的兄弟选择器。input 放在侧边栏元素的前面,用input:checked + .sidebar这种写法,就能在复选框被勾选时,给侧边栏施加一套新的样式。整套链路是:点击 label → 复选框状态翻转 →:checked选择器命中 → 侧边栏宽度改变。链路短,没有中间层。

这种实现有一个额外的优势:复选框状态会保留在 DOM 里。用户刷新页面,浏览器会按照 HTML 里checked属性的初始值渲染。如果你在 HTML 里写死checked,首次加载就是展开状态;不写,默认收起。这个特性让「默认展开」和「默认收起」变成一行属性的差别,不用 JS 去读 localStorage。

2.2 :target 伪类方案:无额外标签,但有刷新重置问题

另一种方案是:target伪类。它依赖 URL 的哈希值:当页面的 URL 哈希等于某个元素的id时,该元素匹配:target。做法是让导航栏开关按钮变成一个普通链接,href="#menu-open",点击后 URL 变成页面地址#menu-open,此时 id 为menu-open的侧边栏元素被:target命中,我们给它展开样式;再做一个href="#"的收起按钮,点击后哈希清空,侧边栏样式还原。

:target方案的好处是 HTML 结构更干净,不需要隐藏的 input,也不需要 label,一个a标签就能驱动状态。但它有一个我在实际使用中很难接受的问题:点击切换会导致浏览器滚动位置跳变,因为 URL 哈希变了。虽然可以用scroll-behavior: smooth缓解,但页面如果比较长,点击导航开关会瞬间回到顶部或跳到锚点位置,体验很糟。

更关键的是,:target状态和浏览器历史记录挂钩。用户展开侧边栏后点浏览器后退,URL 哈希变了,侧边栏状态直接重置;把页面分享给别人,URL 里带着#menu-open,对方一打开就是展开状态。这些行为不可控,调试起来很费劲。所以我个人只在纯演示场景用它,真正做组件,我都用复选框方案。

2.3 两种方案对比:选型的核心标准

如果你在纠结用哪个,记住三条标准。第一,是否需要状态持久化。复选框状态天然保存在 DOM 里,只要不刷新就持续存在;:target状态跟 URL 走,离开页面就丢。第二,是否需要零副作用。复选框方案不影响滚动位置、不改变 URL、不产生历史记录;:target会动 URL,滚动条有概率跳动。第三,兼容性和可维护性。:checked选择器从 CSS3 开始全浏览器支持,:target也是 CSS3,两者兼容性差别不大,但复选框方案的 HTML 结构意图更明确——所有人看到 input 加 label 都知道是开关。

有一点要提前说明:复选框方案里,input 必须和侧边栏是兄弟关系,并且 input 要在侧边栏前面。如果你的侧边栏结构嵌套层级太深,比如 input 被包在某个容器里,兄弟选择器就够不着了,必须调整 DOM 结构。这是我见过最多的翻车原因之一,后面避坑章节会细说。

对比维度复选框 Hack:target 伪类
状态存储位置DOM 复选框属性URL 哈希
滚动位置影响无可能跳动
默认状态控制HTML 属性直接控制依赖初始 URL
浏览器历史记录不产生每次点击产生一条
刷新后状态保留(除非强制刷新重新解析)保留(URL 哈希不变则保留)
代码结构需要额外 input 和 label只需要 a 标签

3. 用复选框方案完整实现侧边伸缩导航栏:HTML 结构与 CSS 核心

3.1 先写 HTML:input、label、侧边栏三者怎么摆放

结构上,我建议把 input 放在页面最前面,label 单独放在内容区顶部或者侧边栏内部都可以,但侧边栏必须紧跟在 input 后面,中间不能插入其他兄弟元素,否则input:checked + .sidebar就选不中它。下面是完整结构:

<input type="checkbox" id="nav-toggle" class="nav-toggle"> <div class="layout"> <aside class="sidebar"> <div class="sidebar-header"> <span class="logo">我的导航</span> </div> <nav class="menu"> <a href="#" class="menu-item">首页</a> <a href="#" class="menu-item">文档</a> <a href="#" class="menu-item">设置</a> </nav> </aside> <main class="content"> <label for="nav-toggle" class="menu-btn">☰</label> <h1>页面内容</h1> <p>.....</p> </main> </div>

这里的思路是:input 放在最外层,.layout作为弹性容器,侧边栏和内容区是它的两个子元素。label 放在内容区的左上角,点击它就能触发复选框切换。注意 label 的for属性必须和 input 的id完全一致,这是两者关联的纽带。

3.2 CSS 核心:宽度切换、过渡动画、选中状态三件套

接下来是样式部分。最核心的是这三块:默认状态的窄侧边栏样式、展开状态的宽侧边栏样式、以及 transition 过渡。我直接给一版能跑的完整代码,然后逐个参数说明:

/* 隐藏原始复选框,但保留可访问性 */ .nav-toggle { position: absolute; width: 1px; height: 1px; opacity: 0; clip: rect(0 0 0 0); clip-path: inset(50%); } .layout { display: flex; min-height: 100vh; } .sidebar { width: 64px; background: #1f2937; color: #f9fafb; transition: width 0.3s ease-in-out; overflow: hidden; white-space: nowrap; } /* 复选框被勾选时,侧边栏变宽 */ .nav-toggle:checked + .layout .sidebar { width: 240px; } .menu-item { display: block; padding: 12px 20px; color: inherit; text-decoration: none; } .menu-btn { display: inline-block; padding: 8px 12px; cursor: pointer; font-size: 20px; user-select: none; }

逻辑说明:.nav-toggle用绝对定位加clip把它从视觉上隐藏,而不是用display: none——display: none会让部分屏幕阅读器读不到,可访问性会打折扣。.layout用 flex 把侧边栏和内容区横向排列,侧边栏默认窄,内容区自动占满剩余空间。.nav-toggle:checked + .layout .sidebar是命中逻辑:复选框勾选后,它后面的.layout里的.sidebar宽度变成 240px。这个选择器必须严格匹配 DOM 顺序。

参数说明:width 0.3s ease-in-out是过渡时长和缓动函数。0.3 秒是通用值,20px 以下的小面积菜单可以压缩到 0.2s;如果是大屏内容切换,0.4s 更有质感。ease-in-out适合宽度类过渡,因为两端速度慢、中间快,视觉上不容易显生硬。overflow: hidden必须保留,否则缩窄时文字会溢出侧边栏边界,把页面撑出横向滚动条。

3.3 给菜单项加内容:图标加文字的常见排布

现实中导航栏很少只有文字。常见做法是图标固定、文字隐藏,收起时只显示图标,展开时图标加文字并排。这需要两层元素配合。下面是一个菜单项的常见写法:

<a href="#" class="menu-item"> <span class="menu-icon">📄</span> <span class="menu-text">文档中心</span> </a>

对应样式:

.menu-item { display: flex; align-items: center; gap: 12px; padding: 12px 16px; } .menu-icon { font-size: 18px; width: 24px; text-align: center; flex-shrink: 0; } .menu-text { white-space: nowrap; }

逻辑说明:.menu-item改成 flex 布局,图标和文字横向排列。.menu-icon设置固定宽度并禁止缩放,确保收起状态下图标对齐;.menu-text用white-space: nowrap防止换行。收起时侧边栏宽度只有 64px,文字部分被overflow: hidden裁掉,只剩图标露在外面。展开后宽度够大,文字完整显示。

这里有一个细节值得注意:收起状态下菜单项的文字虽然看不见,但「点击区域」其实还在。因为.sidebar有overflow: hidden,视觉上截断了,但 anchor 的可点击范围没有变化。如果收起时你希望点击整行就展开导航,而不是误触到隐藏文字,可以保留这个特性;如果希望收起时只响应图标区域,那需要在窄宽度下给.menu-item重新设置padding,让点击区域变窄。

3.4 让内容区跟着伸缩:flex 自适应会帮你省掉一半代码

很多初学方案会把内容区写成margin-left: 64px,展开时改成margin-left: 240px,这样要做两套样式,还要处理过渡。用 flex 布局就不需要这些。侧边栏宽度变化时,内容区因为是 flex 子项,会自动伸缩填充剩余空间,不需要任何额外规则。

flex: 1或者min-width: 0写在内容区上,内容区就天然跟随侧边栏宽度变化。注意一点:如果内容区内有很长的文本、表格或代码块,flex 子项默认min-width: auto,内容会被撑破。所以内容区一定要写min-width: 0,否则横向溢出时你会误以为是导航栏宽度没控制好。

.content { flex: 1; min-width: 0; padding: 24px; }

这段代码看起来不起眼,但它是整套方案里最容易踩坑的地方。min-width: 0允许 flex 子项收缩到小于内容宽度,让内部元素独立处理滚动。不写这一行,内容区里的长代码块会把整个布局撑大,侧边栏宽度反而失效——这个现象我后面在避坑章节里会细讲。

4. 伸缩动画的参数调整:过渡时长、缓动函数、宽度阈值怎么配合

4.1 transition 三要素:属性、时长、缓动,以及它们的关系

侧边栏伸缩的观感,几乎完全由transition决定。写出好动画的关键不是把时长调大,而是让「宽度、时长、缓动」三者匹配。宽度差越大,动画越需要时间;宽度差小,时长要缩短,不然显得拖沓。64px 到 240px 的宽度差是 176px,0.3s 是比较均衡的数值。如果只收成 80px,0.15s 就够;如果是从 0 到 100% 的全屏抽屉,0.5s 起步。

缓动函数我建议不要只用默认值。ease-in-out是通用解,但想要「快速启动、尾部干脆」的感觉,可以试试cubic-bezier(0.4, 0, 0.2, 1),这是 Material Design 的常用曲率,启动快、收尾稳。想要「慢慢展开、快速收起」,可以给展开和收起分别设置 transition:

.sidebar { transition: width 0.35s cubic-bezier(0.4, 0, 0.2, 1); } .nav-toggle:checked + .layout .sidebar { width: 240px; }

如果追求收起比展开更快,可以在:checked状态下覆盖 transition 的时长和缓动:

.nav-toggle:checked + .layout .sidebar { width: 240px; transition: width 0.25s cubic-bezier(0.0, 0, 0.2, 1); }

逻辑说明:未勾选状态下的 transition 处理收起动作,勾选状态下的 transition 处理展开动作。展开用 0.25s、收起用 0.35s,视觉比例更接近「拉开抽屉重、关上抽屉轻」的物理直觉。参数说明:这套写法只在复选框方案里有效,因为:checked状态下可以重新声明 transition。

4.2 用 CSS 变量管理尺寸:换配色、换宽度、换圆角一处搞定

侧边栏的宽度数值散落在多个地方:.sidebar的width、.menu-item的padding、图标的固定宽度。如果项目里有两套侧边栏(比如后台管理系统和前台站点),或者你想快速尝试不同的宽度,直接用 CSS 变量管理是最好的选择。

:root { --sidebar-width-collapsed: 64px; --sidebar-width-expanded: 240px; --menu-item-padding: 12px 16px; --sidebar-bg: #1f2937; --sidebar-text: #f9fafb; } .sidebar { width: var(--sidebar-width-collapsed); background: var(--sidebar-bg); color: var(--sidebar-text); transition: width 0.3s ease-in-out; } .nav-toggle:checked + .layout .sidebar { width: var(--sidebar-width-expanded); } .menu-item { padding: var(--menu-item-padding); }

参数说明:--sidebar-width-expanded建议取值在 200px 到 280px 之间。小于 200px,中文菜单文字容易换行;大于 280px,在 1366px 宽的屏幕上会挤占内容区太多空间。--menu-item-padding的上下值控制菜单项高度,一般上下 10~14px,左右 16~20px 比较舒适。

4.3 子菜单层级:收起时隐藏,展开时渐显的两种手法

当侧边栏里有二级菜单时,收起状态下子项必须完全不可见,否则overflow: hidden虽然裁掉了宽度方向,但高度方向可能还会露出来。展开状态下,子项最好有轻微的延迟渐现,否则菜单是瞬间蹦出来的,和侧边栏宽度动画不协调。常见做法有两种。

第一种是透明度加延迟:

.submenu { opacity: 0; transition: opacity 0.2s ease 0.1s; } .nav-toggle:checked + .layout .sidebar .submenu { opacity: 1; }

第二种是额外用max-height控制高度展开。透明度方案只能让子项慢慢显现,但它的父容器高度如果是 auto,展开瞬间子项还是会占满高度,只是看不见而已。如果子项很多、高度很大,建议用max-height做二次过渡:收起时max-height: 0,展开时max-height: 500px。注意max-height的数值要大于实际内容高度,否则会被截断。

提示:max-height方案有一个天然缺陷,就是过渡时长没法精确匹配真实高度。500px 的容器装 200px 的内容,动画后半段会有空白等待。如果子项数量固定,用精确的max-height值;如果不固定,透明度方案优先级更高。

4.4 阴影与层级:展开时侧边栏浮起的关键样式

侧边栏展开时会覆盖内容区还是推开内容区,取决于布局方式。flex 方案是推开,侧边栏不会遮挡内容。但如果你的设计变成「抽屉式」,侧边栏 fixed 定位浮在内容上方,展开时必须给侧边栏加阴影和更高的 z-index,否则它会混在背景内容里,缺少层次感。

.sidebar { z-index: 100; box-shadow: 0 0 12px rgba(0, 0, 0, 0.2); } .content { position: relative; z-index: 1; }

阴影参数:0 0 12px rgba(0,0,0,0.2)是侧边栏常用阴影。数值再大,比如 24px,在窄侧边栏上会显得扩散过度;小于 8px 则几乎不可见。深色背景的侧边栏阴影可以淡一些,0.15 的透明度就够;浅色背景建议 0.25。z-index 方面,侧边栏 100 以上基本不会和普通内容冲突;顶部如果有固定 header,header 的 z-index 要比侧边栏高,否则切换按钮会被侧边栏盖住。

5. 侧边伸缩导航栏常见问题与避坑:五个必踩的细节

5.1 点击 label 没有反应:for 属性没对上或被遮挡

现象:按钮放在那里,鼠标移上去有手型光标,但点击后侧边栏纹丝不动。原因大概率有两个:一是 label 的for属性值和 input 的id不一致,哪怕只有一个字符不同,关联就断了;二是 label 被其他元素盖住了,比如侧边栏的z-index高于内容区,按钮实际点在了侧边栏上。解决:先看 HTML,for和id完全一致;再看层叠,给 label 加position: relative; z-index: 10;,确保它位于最上层。用 devtools 的拾取器检查点击命中的元素,这个方法最快。

5.2 收起时文字露一半,菜单项挤成一团

现象:侧边栏收窄后,文字没有被完全裁掉,右侧露出半截字,或者菜单项图标和文字重叠。原因:.sidebar缺少overflow: hidden,或者菜单项没有设置white-space: nowrap。宽度缩小后,文本会自动换行,把菜单项高度撑大,就会出现文字竖排、挤成一团的效果。解决:.sidebar上写overflow: hidden; white-space: nowrap;,菜单项内部如果有 flex 布局,给文字容器加min-width: 0,避免 flex 子项强行撑开。

5.3 内容区被撑破,出现横向滚动条

现象:侧边栏宽度正常,内容区内放了一个较宽的表格或者pre代码块,整个页面出现横向滚动条,并且滚动时侧边栏和内容区错位。原因:flex 子项默认min-width: auto,意味着内容区的宽度不会小于其内容的固有宽度,内容比容器宽时就会溢出。解决:.content上加min-width: 0。这是 flex 布局里最隐蔽的一个坑,写侧边栏布局时一定要提前加上。

5.4 展开和收起的动画不同步,一个快一个慢

现象:第一次点击展开很顺畅,再点击收起时,动画明显卡顿或者直接没有过渡。原因:transition只在初始状态声明,:checked状态下如果覆盖了width但忘记保留transition属性,或者把transition写在了width之外的地方,状态切换时动画会丢失。解决:把transition写在.sidebar基础样式中,不要在:checked里重新定义完整属性,除非你有意区分展开收起的速率。如果区分了速率,确认两条 transition 都写了width属性。

5.5 移动端点击出现闪烁或延迟响应

现象:手机浏览器上点击按钮,动画开始前有约 300ms 的延迟,或者点击瞬间侧边栏闪一下。原因:移动端浏览器对点击事件有延迟处理,尤其是没有设置 viewport 或者没有禁用双击缩放的页面。解决:<meta name="viewport" content="width=device-width, initial-scale=1">必须写在 head 里;如果在 iOS Safari 上还有闪烁,给.menu-btn加touch-action: manipulation,这个属性可以移除点击延迟并禁止双击缩放。再配合user-select: none,可以避免快速点击时文本被选中。

6. 进阶技巧:多级菜单、响应式断点与 CSS 变量主题化

到了这一步,基础的单级侧边栏已经能跑了。我最常被问到的三个问题:二级菜单怎么做、手机上怎么处理、能不能一键切主题色。先说二级菜单,它不需要改变核心方案,只需要在菜单项里嵌套第二个复选框结构,避坑是内层复选框的 label 不能和外层的 labelfor冲突。

响应式断点我通常这样处理:在 768px 以下,侧边栏从 flex 子项变成 fixed 定位,覆盖在内容上方;展开时加一层半透明遮罩兜底。断点上的关键在于把.layout的display: flex改成块状排列,内容区全宽,侧边栏脱离文档流:

@media (max-width: 768px) { .layout { display: block; } .sidebar { position: fixed; top: 0; left: 0; height: 100vh; z-index: 200; } .content { padding-left: 0; } }

逻辑说明:移动端下内容区不再需要给侧边栏留空间,因为侧边栏 fixed 后不占布局宽度,展开时覆盖内容区、收起时完全隐藏。这样用户在当前页面内容不变的情况下,可以快速切换导航,视觉上更像 App 的抽屉。注意height: 100vh在移动端地址栏伸缩时会抖动,建议用height: 100dvh,动态视口单位可以跟随浏览器 UI 的收起展开。

CSS 变量主题化,是把前面用到的变量扩展成一组语义化令牌。我一般把背景色、文字色、悬浮色、选中色、边框色都定义成变量,然后把展开和收起两套尺寸也纳入变量。这样换肤只需要改:root里的几个值,组件内部不做任何改动。实际项目里,我甚至把展开宽度和收起宽度独立成变量后,放到一个小型配置脚本里,让设计同学可以自行微调。

回头看,这个方案的核心价值不是「不用 JS」本身,而是把状态从 JS 的帝国里夺回给 CSS,让组件更接近声明式思维。当你的导航栏不再需要复杂的交互逻辑,代码体积和心智负担都会同步下降。我自己的习惯是:任何组件,先问一句「CSS 能不能做到」,答案是可以就绝不写 JS。这个习惯帮我省掉了不少维护成本,也希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 6:35:28

Flutter for OpenHarmony:字典查询App全链路实战解析

先说明一下&#xff0c;标题里的“OpenHarmony”我就直接用在文里了&#xff0c;它不是公司名&#xff0c;而是一个开源操作系统项目名称&#xff0c;不涉及合规问题。下面这篇博文是围绕“Flutter for OpenHarmony 字典查询 App”的全栈解析&#xff0c;从技术选型、工程搭建、…

作者头像 李华
网站建设 2026/10/10 6:35:23

Docker实战指南:从安装到Compose部署,解决环境一致性难题

1. 为什么我劝每个开发者都学一学Docker先说个经常遇到的场景&#xff1a;本地跑得好好的代码&#xff0c;同事一拉下来就报错&#xff1b;你开发用的是Windows&#xff0c;线上服务器是Linux&#xff0c;一到部署就各种环境问题&#xff1b;新同事入职第一天&#xff0c;光搭开…

作者头像 李华
网站建设 2026/10/10 6:34:19

OpenClaw 与飞书对接部署全攻略:从回调配置到避坑实践

把 OpenClaw 跑起来这件事&#xff0c;我在部署文档里来回折腾了差不多一个下午。不是装不上&#xff0c;而是每一步都会遇到同样的尴尬&#xff1a;文档只讲“做什么”&#xff0c;不讲“为什么这样做”&#xff1b;飞书后台的配置项和项目配置文件里的字段&#xff0c;对应关…

作者头像 李华
网站建设 2026/10/10 6:33:45

Spring Boot + 微信小程序:高校共享图书借阅小程序开发指南

临近毕业季&#xff0c;又到了“图书漂流”“共享书架”这类校园项目扎堆上线的时候。如果你正在做一个高校共享图书借阅小程序&#xff0c;或者准备拿这个题目做毕业设计/课程设计&#xff0c;这篇文章把从技术选型到项目落地的完整思路拆给你看。项目本身并不复杂&#xff0c…

作者头像 李华
网站建设 2026/10/10 6:33:27

CF603A:翻转01串区间,最长交替子序列的结论与证明

CF603A《Alternative Thinking》是我做了几十道 CF 思维题之后&#xff0c;仍然愿意单独拿出来写一篇的题目。题干短到一句话&#xff1a;给你一个只含 0/1 的字符串&#xff0c;允许最多翻转一个连续区间&#xff08;也可以选择不翻转&#xff09;&#xff0c;问翻转之后整个串…

作者头像 李华
网站建设 2026/10/10 6:33:04

cua跨平台统一自动化:架构设计、核心实现与实操避坑指南

1. 从“cua”这个标题说起&#xff1a;一个被低估的缩写背后藏着什么第一次看到“cua”这个标题的时候&#xff0c;我脑子里蹦出来的第一反应是——这大概率又是一个圈内人才懂的缩写。做技术的人都有个习惯&#xff0c;喜欢把长名字砍成三四个字母&#xff0c;方便在命令行里敲…

作者头像 李华