DSH Plugins Marketplace

DSH Plugins

Plugins

/

dsh-sidebar-width

d

dsh-sidebar-width

Manifest valid

DeepSeek Harness plugin: VS Code-style sash dividers in the left sidebar, per-row compact mode with auto-shrinking content, and per-block collapse into icons above the avatar.

UI (client)hasBundlePatch

dsh-sidebar-width

DSH 桌面/Web 端左侧栏的分区尺寸控制插件。名字沿用 v0.1 的「侧栏宽度」,功能已完全换成侧栏分区(VS Code SplitView 模型)。

能做什么

侧栏被认成 5 块 + 其它插件加进来的块(React 重挂后自动重新识别):

区块 id认出方式内容
brandlogoRow 子串品牌行 + 品牌按钮
newnewSession 子串(或前两块里的 button)新会话
navpanelList 子串(nav 语义)插件 / 自动化任务 / 任务看板
mainregionArea 子串(或 nav 与 foot 之间)工作区与会话列表
footfootArea 子串用量卡、远程控制、设置、账号头像
extra:N以上都不匹配的 root 直接子元素(v0.6.4)其它插件挂进侧栏的自定义块,如状态条、宠物、自定义面板

对其它插件自动适配(v0.6.4):只要组件被挂到侧栏根节点下(root 的直接子元素)并且不是本插件自己的节点,就会被当成一块 extra:N,自动获得与内置区块完全相同的待遇:相邻之间的分割条、拖拽调高、内容缩放、行级拖动带、窄轨让位。不需要改那个插件,也不需要在本插件里登记。挂载/卸载时 extra:N 序号会随 DOM 顺序重排。

  • 拖分界:块与块之间悬停时出现一条 20×4 的居中握把,按住上下拖即改其中一块的高度。
    • brand|new、new|nav、nav|main:往下拖 = 上面这块变高。
    • main|foot:方向相反,往上拖 = 底部区变高。
  • 双击分界:把这块恢复成原生高度。
  • 头像那一行独立:账号/头像保持原生内容大小、不缩放,先预留它的高度。其下沿可以拖高,不能把头像压扁;底部有多余空间时账号贴底。
  • 每一行也能单独调,且不覆盖点击:行间缝用 root 上的坐标命中(±6px),鼠标靠近时只在侧栏缝中央浮现一个 26×3 的小握把,不显示行名或高度文字,也不插入常驻拖动条。拖动超过 3px 才接管,拖完 250ms 内抑制一次 click,避免顺带切面板。面板列表、底部区块、用量卡、设置行和账号行均可独立调整;双击行缝复位。用量卡的文字行随整张卡一起缩放,不拆成独立分区;文件夹里的子对话列表不做调整。
  • 整张卡片同步缩放:被调矮的内容等比缩小(含字号、图标、内边距),最紧 42%;超过原生高度时也放大内容,而非只拉长空白边框。放大上限 200%,还受实际侧栏宽度、换行与内容高度限制,不能靠裁掉文字填满拖动距离。账号与入口图标保持原生尺寸。
  • 只用可用空间,不挤旁边:工作区吸收剩余空间并保底 96px,超出部分可以滚动访问。拖大卡片先用父容器留白,再从工作区借高度;这些空间用尽即停止,不再把无关的品牌、新会话或导航压成小字。拖动从当前渲染尺寸开始,往返和松手保持连续。旧保存底栏过大时也优先限制底栏,而非把顶部一起压小。缩小底部区时卡片、按钮和账号按同一个预算排版。
  • 有明确下限,不是无限挤压:普通行至少 18px 且不低于原尺寸 42%;单行底栏状态保留至少 11px 的有效字号(原生小于此值时不再缩小),嵌套容器预留全部子行及间距,账号不低于原生高度。极小窗口连这些下限也装不下时,已调整过尺寸的侧栏启用纵向滚动,不靠覆盖其它组件腾地方。
  • 边界与入口留白:底栏与会话区额外保留 8px 间隔;共享底行的账号、方框与手机入口按中心对齐,入口间留 8px,空白留在整条底行上方。
  • 折叠块:每块左侧 12px 内边距里有一枚 11×22 的折叠键(常驻 0.6 透明度),点一下整块收起,变成头像正上方的图标;悬浮图标显示「区块名 · 已折叠」+ 剩余的条目名,再点一下原地展开。
  • 窄轨让位:侧栏被原生折叠成 56px 窄轨(root 带 *_collapsed)时,分界、折叠键、图标坞全部撤掉。

状态

  • localStorage 键:dsh-sidebar-sections:v5。从旧版 v4 只继承折叠状态与重启模式,不继承旧尺寸;v0.6.19 沿用 v5,不清空现有设置。
  • 结构:{ "mode": "keep", "heights": { "brand": 60, "nav": 120 }, "rows": { "nav:0": 30, "foot1:2": 26 }, "hidden": ["nav"] }
  • heights 是块级覆盖(键为 brand / new / nav / foot),rows 是行级覆盖(键形如 nav:2、foot:0、foot1:1:scope 名 + 行序号)。
  • 拖回原生高度会自动删掉当前块/行的对应键。显式拖动时同时采纳其它块当前可见的高度,避免旧的过大请求在拖另一块时自行回弹;相关兄弟行也保持当前尺寸。v2(逐行 zoom)键会被清掉。
  • 仅改变窗口大小不会覆盖用户请求高度,窗口恢复时可恢复原请求;过大的卡片请求只在显示时有界拟合,不清空用户状态。深层行键(例如 foot0-0:0)也会正确重载。

诊断

属性位置值
data-dsh-sw-statedocument.documentElementpanes:nav=62 rows:1 fit:1 hidden:0 / rail / no-root / no-blocks
data-dsh-sw-faultdocument.documentElementapply 抛错时的错误摘要
data-dsh-sw-sash / -pane / -hidden / -zoom / -block相关元素便于在 DevTools 里查
data-dsh-sw-row / -rowhint / -seam被覆盖的行、悬浮提示线、当前对齐的缝行级调高的诊断锚点(v0.6.2 起没有覆盖层元素)

设置页

设置 → 侧边栏分区(settings.section,id sidebar-sections,order 37):显示已调高度的块、已调行高的行、已折叠的块,并提供「恢复块的原始高度 / 恢复每一行的原始高度 / 展开全部区块 / 全部复位」。

与其它插件的关系

  • 只在识别出的侧栏块/行设置排版内联属性;纵向包裹层统一为 flex 列布局,缩放的是整行而不是分别修改每个子元素字号。尺寸、缩放、折叠所接管的属性会记录原值,每轮重新测量前以及卸载时恢复。
  • 兼容远程控制插件的共享底行:共享底栏中的 sidebar.footer.action 插槽统一为 display:contents,包括宿主原本有盒子的插槽;记录原样式并在退出接管时恢复。卡片独立占行,账号与手机/方框入口保留同一底行。用量卡增长先消耗底栏空白,不先挤会话区;只用内联 grid 映射可见行,不搬动 React 节点。有内边距或边框的内容卡不再向内拆文字/进度条,纵向 flex 卡也作为整体缩放。
  • 不清除宿主自己设置的 display:none;切换原生窄轨时撤销尺寸与缩放覆盖,展开后恢复请求尺寸。
  • 不接管原生拖拽(v0.1 的 col-resize 接管已删除),不与 dsh-better-sidebar、ui-theme 的字体设置冲突。
  • 不改任何全局 CSS 变量。

测试

npm ci
npx playwright install chromium
npm test

也可以设置环境变量 DSH_TEST_BROWSER 为本机 Edge/Chrome 可执行文件路径,跳过浏览器下载。

仓库自带 tests/sidebar.html 和 41 项 Playwright 测试,直接用浏览器真实 flex/grid/zoom 排版、鼠标拖动与 DOM 几何断言,不打桩 getBoundingClientRect。覆盖卡片与父块拖动、先用空白、往返与松手不跳、字体与图标缩放、头像避让、历史尺寸和窗口恢复、重载、窄栏、React 重挂、中间分组、动态内容、窄轨及卸载。共享底栏夹具覆盖透明/有盒子插槽、纵向 flex 卡、远程插件宽屏 CSS、双入口共行、外边距与入口移除;录屏回归另验证极端拖动不挤顶部、卡片放大且文字完整、工作区滚至末项,以及 220/268/360px 宽度下连续往返、复位与卸载。截图回归验证会话/卡片间隔、嵌套状态文字可读、入口居中及宿主自带行间距的底行预算。夹具模拟宿主 DOM/CSS,不等于已在真实 DSH 宿主中完成验收。

从「插件市场」安装(dsh-market)

本仓库同时提供一份符合 DSH 插件市场索引格式 1 的索引文件:market/index.json。 在 DSH 的 插件 → 发现 里点「添加索引源」,粘贴:

https://raw.githubusercontent.com/nullifyi/dsh-sidebar-width/main/market/index.json

添加后可在「发现」里搜索「侧栏分区拖拽」。最新条目为 0.6.24,安装源固定在对应代码提交;已有安装需刷新索引并更新插件,重新加载后生效。索引条目字段:

字段值
namedsh-sidebar-width
metadata.categorysidebar(侧栏)
metadata.labelsresizable 可拖拽调整、collapsible 可折叠、chinese 中文界面
metadata.keywords侧栏 / 侧边栏 / 拖拽调整 / 分割条 / 折叠 + sidebar / sash / splitview / resizable / collapse

索引标题、描述、分类、标签都带 en 与 zh 两份文案,市场按当前界面语言显示;en 是格式 1 的必填项。

发新版时

改 market/index.json 里该插件的 versions:追加一条 { version, publishTimestamp, source: { type: "git", url, commit } }(commit 用已推送的 40 位 SHA),再更新 metadata.sortKeys.updated。

关于 Topics 与标签

  • GitHub topics 只能用 ASCII(小写字母、数字、连字符),所以仓库 topics 是 dsh dsh-plugin deepseek-harness sidebar sash splitview resizable collapsible。
  • 中文标签放在两处:package.json 的 keywords(npm 标签,含 侧栏/侧边栏/拖拽调整/分割条/折叠)和插件市场索引的 metadata.keywords / 分类 / 标签中文标题里。

变更记录

v0.6.24

  • 会话与用量卡之间增加独立的 8px 间隔,避免两块内容贴在同一边界上。
  • 单行底栏状态文字增加可读字号下限,旧的小高度请求也不能继续把状态缩成小字。
  • 共享底行固定为实际控件高度,剩余空白留在上方;账号与两个入口垂直居中,入口间留 8px。
  • 新增截图三处标记及宿主行间距的 4 项回归,并从插件加载前记录原生尺寸验证卸载恢复,共 41 项。

v0.6.23

  • 按录屏重做拖动空间分配:保留其它块当前尺寸,可用空间耗尽便停止;旧过大底栏不再连带压缩顶部,松手与反向拖动不触发旧尺寸回弹。
  • 整卡支持有界放大,待父级 grid 排版完成后按真实宽度测量换行内容,避免大空白边框和放大后的裁字。
  • 修复单卡包装层漏掉卡片下沿拖动缝;工作区内容无法收缩时改为可滚动访问。
  • 新增 5 项录屏工作流回归;保留共享底行、旧状态、动态挂载、窄轨和卸载测试,共 37 项。

v0.6.22

  • 修复真实纵向 flex 卡被拆成内部文字行的问题:先识别卡片边界,再判断布局类型,文字、图标和进度条随整卡缩小。
  • 共享底栏显式穿透有盒子的 action 插槽,使卡片、账号和入口参与同一 grid 预算;卸载、窄轨时恢复原生插槽样式。
  • 新增两项真实浏览器回归,包含旧保存尺寸、双入口共行、窄栏和窗口压缩;保留原有 30 项测试。

v0.6.21

  • 按真实多插件布局重建底栏预算:穿透 display:contents,不再把透明容器当成零高或不可压缩的整块。
  • 用量卡与状态行独立压缩;账号和手机/方框入口组成原生尺寸底行,卡片不会跨进会话区,双入口不再被拆成纵向行。
  • 虚拟底行只记实际控件占用,卡片增长先用已有空白;grid 行预算计入卡片外边距。
  • 修复诊断转储引用已删除函数而静默失败;新增 6 项共享底栏回归。

v0.6.20

  • 修复普通 block 插槽因默认 flex-direction: row 被误判,导致用量卡没有独立压缩缝;卡片整体缩放,不逐条拆开文字。
  • 头像识别兜底只保留实际账号行,不再把不足 96px 的「状态 + 头像」整组锁住。
  • 删除拖动时的行名和高度文字提示;小握把以侧栏为定位参照,不再跑到主窗口中间。
  • 修复 CSS zoom 百分比宽度被二次放大,压缩后的金额、右侧文字与头像行不再超出侧栏被裁掉;回归同时检查横向边界。
  • 新增上述三类真实浏览器回归,保留原有 21 项测试。

v0.6.19

  • 改为一次测量、一次树状预算分配,删除互相竞争的旧块预算、行预算、字体适配和账号钉底逻辑。
  • 拖动从当前显示高度开始,先使用空白;深层行撑大时同步扩展外层,不再被固定父容器裁掉,反向拖回和松手也不跳变。
  • 整行等比缩放,显式设置的字体、内边距和图标一起缩小;宽度反向补偿,避免缩到左边或遮住头像。
  • 极端旧尺寸与窗口缩小时按最小内容尺寸夹取,窗口扩大后恢复保存请求;修复深层行键未重载。
  • 行缝覆盖直接挂载的卡片与头像前最后一行,重叠缝优先命中更深层实际行。
  • 修复相同节点数的文字更新不重新测量、窄轨残留缩放,以及误清宿主隐藏组件;卸载恢复接管的排版属性。
  • 新增仓库内真实浏览器回归测试,替代仅在私有目录依赖模拟几何的测试方式。

v0.6.18

  • 修「拖不动/只能往上拖」:账号行的缝原来落在它的上沿,和「底部块 | 账号行」那条分界缝重合,两条缝抢同一个点,命中随机 → 现在账号行的缝移到它自己的下沿,并且所有同位置的缝做去重。
  • 允许往下拖:行的放大上限改成「当前高度 + 主区可让出的空间」,所以底部那条缝现在能上能下(往上压上面那块、往下从主区借高度)。
  • 头像栏和上面分开:账号行加一条 1px 细分隔线,并可单独拖高/压矮,不随上面那块联动。

v0.6.17

  • 穿透包裹层找行:宿主真实结构是 footerActions 里只放一个包裹层、真正的几行(用量卡/远程控制/图标/状态)都在包裹层里。以前“容器子元素少于 2 个就不建作用域”,所以这些行一个拖动缝都没有。现在会穿透只有单个子元素的包裹层(最多 4 层),并继续往每行里递归找纵向堆叠(最多 3 层)。
  • 容器没尺寸也不丢缝:包裹层是 display:contents 或高度为 0 时,用行自己的左右边界做命中范围。
  • 头像行识别兜底:取到的头像元素尺寸无效(0×0,常见于背景图/伪元素头像)时,回退到“结构上最后一行”,不再产生 acct 空作用域。

v0.6.16

  • 行缝热区从 ±4px 放宽到 ±6px,悬浮提示改成「↑↓ 拖动调整 · 行名 · 当前高度」,更容易找到、能看清现在多高。
  • 每次重画都把底栏几何写进 dsh-sidebar-sections:footdump(区块矩形、每行高度/外边距、是否图标行、行缝键、账号行位置),排查现场用;同时打一行到控制台。

v0.6.15

  • 只放图标的小组件行默认压紧:没有文字、只有图标的那几行默认 26px 高(原来会各占一整行),不满意可以继续拖。
  • 头像和横线上面互不干扰:底栏有自定义高度时,头像行(或它所在的那一段)用 margin-top:auto 固定在这块底部;上面几行怎么压都不会把它推走、也不会改变它的大小。
  • 每个纵向行都有缝:横向排列的按钮组不再被当成“行”;只有一行内容的容器现在也有拖动缝。
  • 渲染签名按整棵子树节点数:容器里动态增删一行也会立刻重画并补上缝。
  • 新增诊断键 dsh-sidebar-sections:footdump(底栏矩形、各行高度/外边距、行状态),排查布局问题用。

v0.6.14

  • 底栏不再比自己的内容矮:当底栏有自定义高度、而内容(用量卡 + 远程控制 + 图标行 + 头像行)更高时,自动撑到内容高度(在空间允许的范围内)。头像行因此不会被裁到盒子外面。
  • 行不会被拖出容器:新增 rowBoxLimit(),行的最大高度按“所在块当前还能放多少”计算,头像行拖到底就停,不再拖到看不见的位置。
  • 装不下时用滚动看:底栏(foot)内容超出盒子时 overflow-y:auto,侧栏整体超出时也给 overflow-y:auto,符合“压到遮挡时用滚轮上下滑动看”的要求。

v0.6.13

  • 撤掉「把底部内容钉在视口最下面」的行为:上一版给 foot 的第一个子元素写了 margin-top:auto,头像确实沉底了,但整块底部内容被推离上一块、用量卡还被挤出盒子。现在底部内容按正常流走,头像紧跟在远程控制下面。

v0.6.12

  • 存储版本升到 v5,旧的绝对像素高度一律作废:v4 里存的是“当时的排版下量到的像素值”,换一版排版再读必然错位(实测宿主里留下 nav=89 却要装 3 行 36px 面板行、foot=207 却装不下头像行)。v4 → v5 只继承折叠状态与“重启后模式”,高度回到原生。
  • 面板区不再做块级缩放:块级 fitPane 会把面板行里的 svg/文字逐个 zoom,于是同一列里有的字缩了、有的没缩。现在面板区被拖矮时改为自己滚动(overflow-y:auto),行保持原生大小。
  • 预算回收顺序改为 面板区 → 新会话 → 品牌行 → 底栏,底栏最后动,避免头像/用量卡被裁掉。

v0.6.11

  • 压缩的行不再「往旁边跑、只剩一个图标」:以前对行的子元素逐个 zoom + 宽度反补偿,压紧时图标和文字各缩各的、整体往左偏。现在行级压缩只缩字号(fitRow()),并强制 white-space:nowrap + 省略号,横向布局不动。
  • 头像贴底:不再要求「头像行自己的容器」有富余空间(它通常内容自适应,margin-top:auto 等于没写)。改成让 foot 的第一个真实子元素吃 margin-top:auto;foot 一旦被拖高,整块内容(含头像)就贴在底部。
  • 拖动时不再抖动/闪烁:sanitizeHeights() 与 enforceBudget() 在拖拽期间全部跳过。之前「拖动写 h0+dy」与「预算把高度压回去」每帧互相打架,表现为底栏/头像上下跳。
  • 快照新增 account 与 accountPinHost(头像行矩形、贴底目标的计算样式),便于远程确认贴底是否生效。

v0.6.10

  • 修好诊断快照:writeDump() 从 v0.6.9 起就定义了却没人调用,所以 localStorage['dsh-sidebar-sections:dump'] 一直不存在。现在首轮渲染后立刻写一次、2.5 秒后再写一次(布局稳定后的最终形态)。
  • 快照里补了 navHTML(面板列表的 innerHTML 前 2600 字符)和 rootChildren(根节点下每个非自有子元素的标签/类名/矩形/计算样式),用来判断「某一行不见了」是插件自己压的还是别的插件挪走的。

v0.6.9

  • 主区下限从 64 提到 96:64px 时工作区只剩一条被截断的会话行,看起来像“底部压住了上一行”;96px 至少能看出是列表。
  • 可确认宿主跑的是哪一版:根节点写 data-dsh-sw-version,localStorage['dsh-sidebar-sections:boot'] 记录 {v,t};启动 2.5 秒后另写一份现场快照 localStorage['dsh-sidebar-sections:dump'](各块矩形、面板列表子节点、计算样式、状态串),排障时不用开 DevTools。
  • 夹具补了「版本号与 package.json 一致」「启动记录」「版本属性」三条断言(144 项)。

v0.6.8

  • 底栏不再越出侧栏底部:新增 enforceBudget(),用真实 getBoundingClientRect()(把块与块之间的外边距、main 自身高度一起算进去)判断是否溢出;溢出就按“当前最高的那个被拖过的块”逐轮压回,最多 6 轮。以前只按估算高度判断,存储里一个偏大的值就能把底栏顶到 root 外面,看起来就是“盖住上一层”。
  • 没被拖过的块不再被临时写高度:v0.6.7 为了压回溢出,会给所有块写临时高度,副作用是插件行被压到看不见、重载后还残留。现在只有用户真正拖过的块参与压缩。
  • 存储值先归一化再渲染:sanitizeHeights() 按真实内容高度把偏大的记录按比例摊回去,只调存储、不碰 DOM,所以重启后不会先撑开再挤回。
  • 缩放只允许一层:单独拖过高度的行不再叠加块级 zoom;块级缩放改成按 scrollHeight 是否真的溢出决定,摘掉 zoom 后不溢出就停止,不再“明明有空间却缩得很小”。
  • 重启模式可配置:存储里新增 mode 字段,keep(默认,继承上次布局)或 reset(每次启动回到原生高度)。设置页「侧边栏分区」里两个按钮直接切换。
  • 下限更贴近真实排版:MIN_PANE 改为 brand 22 / new 22 / nav 36 / foot 48;实际可拖下限取 min(硬下限, 原生高度),窗口很矮时不会一按就跳变。

v0.6.7

  • 修掉“整条侧栏一闪一闪、拖都拖不动”:删掉“把压缩结果写回存储”和“按最大可压缩者回收(最多 8 轮)”这两处,压缩只作用于当次渲染。之前写回存储会触发订阅 → 再 apply → 再压缩,布局在“撑开—压缩”之间自激震荡。
  • 自然高度改成纯读取:不再为了测量临时清空内联样式再量 scrollHeight(那会触发宿主的 MutationObserver → apply → 又测量,形成循环)。现在 naturalHeight = 渲染高度 ÷ 当前 zoom,一次读、零写入。
  • 加写入保护:apply 期间根节点观察器静默,结束时 takeRecords() 清掉自己写出的记录;渲染结果与上次一致时直接短路。宿主不会再被我们自己的样式变更唤醒。
  • rAF 被节流时用 120ms 定时器兜底,后台标签页/低刷新场景下拖动也不会“没反应”。
  • 账号/头像行是独立单元:缝在它自身顶边,可单独拖高(下限 26px),不随上一块移动,也不参与块级等比缩放;压紧时只去掉 zoom、不牺牲高度。
  • 溢出兜底:块高总和超出内容高度时,本次渲染按 nav → foot → new → brand 顺序压回(连没被拖过的块也临时写高度,但不落盘),再把侧栏根节点设成 overflow: clip,所以底部永远不会盖住上一层。
  • 诊断属性 data-dsh-sw-state 形如 panes:nav=62 rows:1 fit:1 trim:0 hidden:0。

v0.6.5

  • 紧贴底部的分割条可以两个方向调:往下拖 = 上面那块变高,往上拖 = 底部区变高。折叠掉中间的「工作区与会话」之后,底部区依然可以拉高/压小(以前这条缝会随 main 一起消失,底部再也调不动)。
  • 分割条只在可见块之间连接:折叠任何一块后,它上下两块会直接连上,缝的数量 = 可见块数 − 1。
  • 不再双重缩放:单独调过高度的行不会再叠加块级 zoom。以前先调行、再调块,或者重载后继续拖块,行会按「行高覆盖 × 块 zoom」缩两次——表现就是“明明还有空间却缩得很小、滑块一动忽大忽小”。
  • 自然高度缓存加入行高与 zoom 签名:拖过某一行之后,块级缩放的基准会立刻失效重算,不会再拿旧的自然高度算比例。

v0.6.4

  • 其它插件加进侧栏的块自动纳入管理:root 下不属于内置五块的自定义元素识别为 extra:N,自动生成分割条、可拖高、可缩放;序号随 DOM 顺序重排,卸载后自动消失。同一容器内的兄弟块一起参与,面板行级的拖动带同样覆盖。
  • 折叠底部不再带走头像:折叠 foot 时只把用量卡/远程控制/图标行这些旁支藏起来,账号头像那一行留在原位(仍在侧栏底部),折叠键也随之搬到图标坞上方,随时可展开。
  • 折叠后折叠键不再消失:以前整块折叠时按钮被一起藏掉,只能靠图标坞展开;现在折叠键保留在图标坞上方,键盘/鼠标都能直接点开。
  • 拖拽恢复基准修正:正拖回原生高度才删除覆盖(以前拿当前高度当基准,压缩过的块拖回原生尺寸会被误当成“更大”)。

v0.6.3

  • 存储键升到 dsh-sidebar-sections:v4:首次加载把旧的 v3 迁移过来,只继承「块高度 + 折叠状态」,历史行高一概丢弃——它修的是“一打开侧栏,面板行就矮成一条、字号缩到底”。
  • 行缝提示从贯穿全宽的 2px 线,改成缝中央一个 26×3 的小握把;指针离开、页面滚动、窗口失焦或 2.5 秒没有动作都会自动隐藏,不再留下“特别长的横线”。

Comments

Loading…