网格布局
TuiGrid 是一个基于原生 CSS Grid 规范封装的高级二维布局容器。 它允许您通过简单的配置对象,精确控制每一行的高度、每一列的宽度,以及单元格的合并(跨行/跨列)行为。
核心概念
在开始之前,了解 TuiGrid 的尺寸单位逻辑非常重要:
- 数值 (Number): 会被转换为
fr单位(倍数/剩余空间比例)。例如size: 2等同于2fr。 - 字符串 (String): 会被直接作为 CSS 值渲染。支持
px,%,auto,minmax()等标准 CSS Grid 语法。
基础用法 倍数比例
最简单的用法是使用数字来定义行列的比例。 在下例中,第 2 列 (size: 2) 的宽度是第 1、3 列的两倍,第 4 列 (size: 3) 是第 1 列的三倍。
<template>
<TuiGrid
:rows="2"
:cols="4"
:colConfig="[
{ size: 1 }, // 1fr
{ size: 2 }, // 2fr (两倍宽)
{ size: 1 }, // 1fr
{ size: 3 } // 3fr (三倍宽)
]"
:rowConfig="[
{ size: 1 }, // 1fr
{ size: 2 } // 2fr (两倍高)
]"
>
<template #cell-0-0><div>1fr</div></template>
<template #cell-0-1><div>2fr</div></template>
<template #cell-0-2><div>1fr</div></template>
<template #cell-0-3><div>3fr</div></template>
<template #cell-1-0><div>Row 2</div></template>
</TuiGrid>
</template>固定尺寸与混合布局
您可以自由混合固定像素 (px)、百分比 (%) 和自适应单位 (fr)。这在构建“固定侧边栏 + 自适应内容区”的经典布局时非常有用。
<template>
<TuiGrid
:rows="3"
:cols="3"
:colConfig="[
{ size: '200px' }, // 固定左侧栏
{ size: 1 }, // 中间自适应
{ size: '20%' } // 右侧占总宽 20%
]"
:rowConfig="[
{ size: '60px' }, // 固定头部
{ size: 1 }, // 内容区自适应撑满
{ size: '40px' } // 固定底部
]"
>
<template #cell-0-0><div>Header Left</div></template>
<template #cell-0-1><div>Header Main</div></template>
</TuiGrid>
</template>单元格合并
通过 cellConfig 属性,您可以指定任意单元格跨越的行数 (rowSpan) 或列数 (colSpan)。 配置的 Key 为坐标字符串 '行索引-列索引'。
提示
当一个单元格跨越了位置时,被覆盖的那些单元格位置仍然存在于逻辑中,但通常不需要为其填充内容(或通过 hidden: true 显式隐藏)。
<template>
<TuiGrid
:rows="4" :cols="4" :gap="20"
:cellConfig="{
'0-0': { colSpan: 4, className: 'header-cell' }, // 头部:跨4列
'1-0': { rowSpan: 2, colSpan: 2 }, // 主图表:跨2行2列
'3-0': { colSpan: 4 } // 底部:跨4列
}"
>
<template #cell-0-0>
<div class="header">数据大屏标题</div>
</template>
<template #cell-1-0>
<div class="big-chart">主图表区域</div>
</template>
<template #cell-1-2><div>图表 A</div></template>
<template #cell-1-3><div>图表 B</div></template>
<template #cell-3-0><div>Footer Info</div></template>
</TuiGrid>
</template>高级 CSS 函数
TuiGrid 完美支持 CSS Grid 的高级函数,如 minmax() 和 auto,这使得创建响应式且健壮的布局成为可能。
auto: 根据内容自动调整尺寸。minmax(min, max): 尺寸在最小值和最大值之间弹性变化。
<template>
<TuiGrid
:rows="1" :cols="3"
:colConfig="[
{ size: 'auto' }, // 宽度由内容撑开
{ size: 'minmax(200px, 1fr)' }, // 最小200px,空间足够时占满剩余
{ size: 'minmax(100px, 300px)' } // 在 100px 到 300px 之间伸缩
]"
>
<template #cell-0-0>
<div>一段很长的不换行文本会撑宽此列</div>
</template>
</TuiGrid>
</template>CSS变量
CSS 变量
Grid 组件暴露了一组 CSS 变量,允许您从父级轻松控制内部单元格的默认样式。
.my-grid-container {
/* 修改单元格默认背景色 */
--tui-grid-item-bg: var(--common-bg_layer);
/* 修改单元格边框 */
--tui-grid-item-bd: 1px solid rgba(255,255,255,0.1);
/* 修改单元格内边距 */
--tui-grid-item-pd: 20px;
}自定义类名
在 cellConfig 中,您可以为特定单元格添加 className,以便进行特殊的样式覆盖(如背景色、对齐方式等)。
const cellConfig = {
'0-0': { colSpan: 4, className: 'dashboard-header-style' }
}单元格样式类
TuiGrid 会自动为每个渲染的单元格附加一组 CSS 类名。这使得您既可以通过坐标直接定位单元格,也可以通过注入自定义语义类名来复用样式。
每个单元格的 class 列表由以下三部分组成:
- 基础标识:
tui-grid-item所有 TuiGrid 单元格默认拥有的基础类名。 - 坐标标识:
tui-cell-{row}-{col}组件根据当前单元格的行列索引自动生成的唯一标识。- 索引从
0开始。 - 例如:第 1 行第 1 列为
.tui-cell-0-0,第 2 行第 3 列为.tui-cell-1-2。 - 应用场景: 当您不想修改 JS 配置,只想快速通过 CSS 覆盖某个固定位置(如左上角)的样式时非常有用。
- 索引从
- 自定义标识:
className通过cellConfig配置项注入的自定义类名。- 应用场景: 用于语义化样式管理(如
.header-cell,.active-card)。
- 应用场景: 用于语义化样式管理(如
渲染示例
假设您进行了如下配置:
const cellConfig = {
// 为位置 0-0 的单元格添加自定义类名
'0-0': { colSpan: 4, className: 'dashboard-header' }
}最终渲染出的 HTML 结构将类似于:
<div class="tui-grid-item tui-cell-0-0 dashboard-header" ...>
</div>
<div class="tui-grid-item tui-cell-0-1" ...>
...
</div>样式编写技巧
利用这些类名,您可以灵活地编写样式:
/* 1. 全局修改所有单元格 */
.tui-grid-item {
transition: all 0.3s;
}
/* 2. 精确命中:修改第 2 行第 3 列的背景 */
.tui-cell-1-2 {
background-color: #f5f5f5;
}
/* 3. 语义命中:修改所有头部单元格 */
.dashboard-header {
font-weight: bold;
border-bottom: 2px solid blue;
}API 参考
Props
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rows | Number | 3 | 网格行数。 |
| cols | Number | 3 | 网格列数。 |
| gap | Number/String | - | 网格间距。数字会被转为 px。 |
| rowConfig | Array | [] | 行高配置数组。对象格式 { size: Number/String }。 |
| colConfig | Array | [] | 列宽配置数组。对象格式 { size: Number/String }。 |
| cellConfig | Object | {} | 单元格配置表。Key 为 'rowIndex-colIndex'。 |
Cell Configuration Object
cellConfig 中的对象支持以下属性:
| 属性名 | 类型 | 说明 |
|---|---|---|
| rowSpan | Number | 单元格跨越的行数。 |
| colSpan | Number | 单元格跨越的列数。 |
| hidden | Boolean | 是否隐藏该单元格 (通常用于被合并覆盖的单元格)。 |
| className | String | 为该单元格添加自定义 CSS 类名。 |
Slots
插槽名称是动态生成的,格式为:cell-{rowIndex}-{colIndex}。
- 索引从
0开始。 - 例如:第 1 行第 1 列为
cell-0-0,第 2 行第 3 列为cell-1-2。
CSS Variables
| 变量名 | 默认值 | 说明 |
|---|---|---|
--tui-grid-item-bg | var(--common-bg) | 单元格背景颜色。 |
--tui-grid-item-bd | var(--common-bd) | 单元格边框样式。 |
--tui-grid-item-pd | 10px | 单元格内边距。 |
--tui-grid-w | 100% | 网格容器宽度。 |
--tui-grid-h | 100% | 网格容器高度。 |