From 82e7eec628ef28700c44e0dc81f234c876a72f8c Mon Sep 17 00:00:00 2001 From: duc Date: Tue, 14 Jul 2026 00:23:44 +0800 Subject: [PATCH] =?UTF-8?q?#=E8=8F=9C=E5=8D=95=E5=AF=BC=E8=88=AA=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=8A=A0=E5=85=A5=E4=BC=81=E4=B8=9A=E6=9C=80=E5=B8=B8?= =?UTF-8?q?=E7=94=A8=E7=9A=84=20=E5=B7=A6=E4=BE=A7=E5=8F=8C=E5=88=97?= =?UTF-8?q?=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/styles/index.scss | 1 + src/assets/styles/layout/sidebar/_dual.scss | 101 ++++ src/enums/NavTypeEnum.ts | 6 +- src/layout/components/Navbar.vue | 6 +- src/layout/components/Settings/index.vue | 38 ++ src/layout/components/Sidebar/DualSidebar.vue | 455 ++++++++++++++++++ src/layout/index.vue | 9 +- 7 files changed, 609 insertions(+), 7 deletions(-) create mode 100644 src/assets/styles/layout/sidebar/_dual.scss create mode 100644 src/layout/components/Sidebar/DualSidebar.vue diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index 96bc9cb41..706549ebb 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -13,6 +13,7 @@ @use './layout/sidebar/collapsed'; @use './layout/sidebar/responsive'; @use './layout/sidebar/popper' as sidebar-popper; +@use './layout/sidebar/dual' as sidebar-dual; @use './components/legacy-utilities'; @use './components/misc'; @use './components/page-shell'; diff --git a/src/assets/styles/layout/sidebar/_dual.scss b/src/assets/styles/layout/sidebar/_dual.scss new file mode 100644 index 000000000..c0cf018fe --- /dev/null +++ b/src/assets/styles/layout/sidebar/_dual.scss @@ -0,0 +1,101 @@ +/* 双列侧栏:第一列折叠一级菜单图标 + 第二列展开子菜单;覆盖 sidebar-container 宽度与 main-container 左边距。 */ + +@use '../../tokens/sass-vars' as *; + +// 双列总宽度 = 折叠列(58px) + 间距(8px) + 展开列(200px) +$dual-sidebar-width: 58px + 8px + $base-sidebar-width; +// 仅第一列宽度 +$dual-first-width: 58px; + +#app { + // 双列模式:始终覆盖 sidebar-shell 的 padding,防止全局 .hideSidebar 样式干扰 + .dualSidebar .sidebar-container .sidebar-shell { + padding: 0 !important; + } + + // 双列展开状态:两列都显示 + .dualSidebar:not(.hideSidebar) { + .sidebar-container { + width: $dual-sidebar-width !important; + } + + .main-container { + margin-left: calc(#{$dual-sidebar-width} + 12px) !important; + } + + // 固定头部宽度适配双列侧栏 + .fixed-header { + width: calc(100% - #{$dual-sidebar-width} - 12px) !important; + } + } + + // 双列展开状态但第二列无子菜单:仅显示第一列宽度 + .dualSidebar:not(.hideSidebar) .sidebar-container.dual-no-second { + width: $dual-first-width !important; + + // 隐藏第二列 + .dual-sidebar-second { + display: none !important; + } + + // 第一列无右边框 + .dual-sidebar-first { + border-right: none; + } + } + + // 第二列隐藏时,main-container 左边距收窄 + .dualSidebar:not(.hideSidebar) .sidebar-container.dual-no-second ~ .main-container { + margin-left: calc(#{$dual-first-width} + 12px) !important; + } + + // 第二列隐藏时,fixed-header 宽度调整 + .dualSidebar:not(.hideSidebar) .sidebar-container.dual-no-second ~ .main-container .fixed-header { + width: calc(100% - #{$dual-first-width} - 12px) !important; + } + + // 双列折叠状态(汉堡按钮折叠):仅显示第一列(图标列) + .dualSidebar.hideSidebar:not(.mobile) { + .sidebar-container { + width: $dual-first-width !important; + } + + .main-container { + margin-left: 70px !important; + } + + .fixed-header { + width: calc(100% - 70px) !important; + } + + // 隐藏第二列 + .dual-sidebar-second { + display: none !important; + } + + // 折叠时第一列无右边框 + .dual-sidebar-first { + border-right: none; + } + + // 折叠时隐藏 Logo 文字,仅显示图标 + .dual-sidebar-logo { + .sidebar-title { + display: none !important; + } + } + } + + // 移动端双列模式 + .mobile.dualSidebar { + .sidebar-container { + width: $dual-sidebar-width !important; + } + + &.hideSidebar .sidebar-container { + transition: transform 0.28s; + pointer-events: none; + transform: translate3d(calc(-#{$dual-sidebar-width} - 12px), 0, 0); + } + } +} diff --git a/src/enums/NavTypeEnum.ts b/src/enums/NavTypeEnum.ts index 58573cec8..18446c7b0 100644 --- a/src/enums/NavTypeEnum.ts +++ b/src/enums/NavTypeEnum.ts @@ -13,5 +13,9 @@ export enum NavTypeEnum { /** * 混合导航 */ - MIX = 'mix' + MIX = 'mix', + /** + * 双列导航 + */ + DUAL = 'dual' } diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 35eaa120d..b9fa065a6 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -1,7 +1,7 @@