


























针对你描述的现代通用后台管理系统经典布局(顶部通栏 + 左侧双菜单 + 右侧多标签内容区),结合我们上几轮建立的跨平台弹性栅格理念,我给出以下详细方案。整体原则:用命名网格区域代替固定列数,用弹性轨道适配右侧内容,用一套间距令牌统一三端,并可平滑折叠至手机和大屏。
使用 Grid 命名区域 定义骨架,结构清晰、无固定列数:
.admin-layout {
display: grid;
grid-template-areas:
"header header header"
"nav-main nav-sub content"
"nav-main nav-sub content";
grid-template-columns: auto auto 1fr; /* 主菜单、副菜单宽度自适应内容,内容区弹性 */
grid-template-rows: 56px 1fr; /* 顶部固定高度,下方撑满 */
height: 100vh;
overflow: hidden;
}
区域分配:
header:顶部通栏(Logo、折叠按钮、顶部菜单、工具栏)nav-main:左侧主菜单(图标+文字,可折叠)nav-sub:左侧副菜单(二级菜单树,可选隐藏)content:右侧主内容区(标签栏+工具栏+内容)这种网格完全摆脱了列数概念,只关心区域比例和最小宽度。
56px(标准后台高度,触控友好)24px,垂直居中justify-content: space-between220px(包含图标+文字)64px(仅图标,通过JS切换类名改变grid列宽)grid-template-columns: 220px auto 1fr 切换为 64px auto 1fr(副菜单可一起隐藏或独立控制)。overflow-y: auto,菜单项采用垂直列表。220px(与主菜单统一或略窄为180px),可独立折叠。内容区是栅格应用的核心,它由三部分组成:标签栏、工具栏、内容主体。
我们将其内部设计为一个垂直Flex容器,高度撑满网格行:
.content-area {
display: flex;
flex-direction: column;
height: 100%;
background: var(--bg-content);
}
40px4px,左右内边距 12px。48px(自适应内容)12px 24px这里是弹性网格的直接应用。不限定24列,而是用 auto-fit 和 minmax 让内容自适应。
通用内容网格容器:
.content-body {
flex: 1;
overflow-y: auto;
padding: 24px;
/* 针对仪表板类卡片使用弹性网格 */
}
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 24px;
align-content: start;
}
对于表单、详情页等非卡片型内容,则采用定宽弹性容器或单列布局,不使用强制的多列网格。表格直接撑满容器宽度即可。
| 令牌 | 桌面值 | 用途 |
|---|---|---|
--space-xs |
4px | 标签间距 |
--space-sm |
8px | 工具栏元素小间隙 |
--space-md |
12px | 标签栏内边距 |
--space-lg |
16px | 菜单项内边距 |
--space-xl |
24px | 内容区内边距、卡片间隙 |
--space-2xl |
32px | 区块大分隔 |
--space-3xl |
48px | 较少使用,页面级留白 |
1920-220-220=1480px),卡片网格自然呈现 4–5 列。max-width: 100% 确保不溢出。max-width: 1440px; margin: 0 auto;。minmax(300px, 1fr) 保证卡片最小宽度舒适。grid-template-columns: 1fr 1fr 或 1fr 2fr 等固定比例,而非列数。切换 nav-main 宽度从 220px 到 64px,修改 grid-template-columns 即可,右侧内容自动伸缩。副菜单可同时隐藏或跟随显示。
通过动态修改 grid-template-areas:
"header header header"
"nav-main content content" // 副菜单区域被移除
或设置 nav-sub 宽度为 0,overflow: hidden 平滑过渡。
当屏幕宽度不足以容纳双菜单时(如 < 1024px),通过媒体查询或容器查询改变布局:
@media (max-width: 1024px) {
.admin-layout {
grid-template-columns: 64px 0 1fr; /* 主菜单折叠,副菜单隐藏 */
}
}
@media (max-width: 768px) {
.admin-layout {
grid-template-areas:
"header"
"content";
grid-template-columns: 1fr;
}
.nav-main {
position: fixed;
left: 0; top: 56px;
height: calc(100vh - 56px);
transform: translateX(-100%);
transition: transform 0.3s;
}
.nav-main.open {
transform: translateX(0);
}
}
遵循同一套HTML结构,仅改变CSS变量和Grid定义。
minmax(160px, 1fr),保证手机一列或两列。--space-xl 降为 16px,工具栏内边距减少。body.mobile .admin-layout {
grid-template-areas:
"header"
"content";
grid-template-columns: 1fr;
grid-template-rows: 56px 1fr;
}
body.mobile .card-grid {
--grid-min-col: 160px;
--grid-gap: 12px;
}
body.mobile .content-body {
padding: 16px;
}
左侧菜单通过底部导航或浮动按钮触发,不再占位。
大屏上后台系统可能作为监控看板使用,布局可调整为:
minmax(500px, 1fr) 使单卡变大,适应远距离观看。--space-xl 提升至 48px。通过添加 .bigscreen 类覆盖变量实现,HTML结构不变。
AdminLayout 组件,接收 collapsed、showSubNav 等参数,内部基于CSS Grid实现。:root {
--header-h: 56px;
--nav-main-w: 220px;
--nav-sub-w: 220px;
--grid-min-col: 300px;
--grid-gap: 24px;
--pad-content: 24px;
}
.admin-layout {
display: grid;
grid-template-areas:
"head head head"
"navm navs main";
grid-template-columns: var(--nav-main-w) var(--nav-sub-w) 1fr;
grid-template-rows: var(--header-h) 1fr;
height: 100vh;
}
.header { grid-area: head; }
.nav-main { grid-area: navm; overflow-y: auto; }
.nav-sub { grid-area: navs; overflow-y: auto; }
.content { grid-area: main; display: flex; flex-direction: column; }
.tab-bar { height: 40px; flex-shrink: 0; }
.toolbar { height: 48px; flex-shrink: 0; }
.content-body { flex: 1; overflow-y: auto; padding: var(--pad-content); }
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(var(--grid-min-col), 1fr));
gap: var(--grid-gap);
}
通过修改CSS变量即可实现折叠、响应式和多端适配,完全符合现代栅格设计趋势,同时完美满足后台管理系统的所有功能区域需求。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。