Skip to content

Grid 栅格 Grid

基于 CSS Grid 布局的栅格组件,提供响应式布局,让页面适配不同屏宽更轻松。功能和 Flex 组件类似,如果你喜欢 Grid 布局,可以试试这个组件。

基础使用

Grid 组件默认把内容区域等分为 24 份,可以通过 column 属性进行调整。column 属性支持响应式。和 Flex 组件一样,'xs''sm''md''lg''xl''xxl' 分别对应 [0,576][0, 576](576,768](576, 768](768,992](768, 992](992,1200](992, 1200](1200,1600](1200, 1600](1600,+](1600, +\infty] 的窗口像素宽度。

Column 24

Span 24 | Width 100%
Span 12 | Width 50%
Span 12 | Width 50%
Span 8 | Width 33.3333%
Span 8 | Width 33.3333%
Span 8 | Width 33.3333%
Span 6 | Width 25%
Span 6 | Width 25%
Span 6 | Width 25%
Span 6 | Width 25%
Span 4 | Width 16.6667%
Span 4 | Width 16.6667%
Span 4 | Width 16.6667%
Span 4 | Width 16.6667%
Span 4 | Width 16.6667%
Span 4 | Width 16.6667%

Column 16

Span 8 | Width 50%
Span 8 | Width 50%
Span 4 | Width 25%
Span 4 | Width 25%
Span 4 | Width 25%
Span 4 | Width 25%

Responsive

Span 4
Span 4
Span 4
Span 4
<template>
	<h4>Column 24</h4>
	<px-grid>
		<px-grid-item :span="24"><div class="item">Span 24 | Width 100%</div></px-grid-item>
		<px-grid-item :span="12"><div class="item">Span 12 | Width 50%</div></px-grid-item>
		<px-grid-item :span="12"><div class="item">Span 12 | Width 50%</div></px-grid-item>
		<px-grid-item :span="8"><div class="item">Span 8 | Width 33.3333%</div></px-grid-item>
		<px-grid-item :span="8"><div class="item">Span 8 | Width 33.3333%</div></px-grid-item>
		<px-grid-item :span="8"><div class="item">Span 8 | Width 33.3333%</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Span 6 | Width 25%</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Span 6 | Width 25%</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Span 6 | Width 25%</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Span 6 | Width 25%</div></px-grid-item>
		<px-grid-item :span="4"><div class="item">Span 4 | Width 16.6667%</div></px-grid-item>
		<px-grid-item :span="4"><div class="item">Span 4 | Width 16.6667%</div></px-grid-item>
		<px-grid-item :span="4"><div class="item">Span 4 | Width 16.6667%</div></px-grid-item>
		<px-grid-item :span="4"><div class="item">Span 4 | Width 16.6667%</div></px-grid-item>
		<px-grid-item :span="4"><div class="item">Span 4 | Width 16.6667%</div></px-grid-item>
		<px-grid-item :span="4"><div class="item">Span 4 | Width 16.6667%</div></px-grid-item>
	</px-grid>
	<h4>Column 16</h4>
	<px-grid :column="16">
		<px-grid-item :span="8"><div class="item">Span 8 | Width 50%</div></px-grid-item>
		<px-grid-item :span="8"><div class="item">Span 8 | Width 50%</div></px-grid-item>
		<px-grid-item :span="4"><div class="item">Span 4 | Width 25%</div></px-grid-item>
		<px-grid-item :span="4"><div class="item">Span 4 | Width 25%</div></px-grid-item>
		<px-grid-item :span="4"><div class="item">Span 4 | Width 25%</div></px-grid-item>
		<px-grid-item :span="4"><div class="item">Span 4 | Width 25%</div></px-grid-item>
	</px-grid>
	<h4>Responsive</h4>
	<px-grid :column="column">
		<px-grid-item :span="4"><div class="item">Span 4</div></px-grid-item>
		<px-grid-item :span="4"><div class="item">Span 4</div></px-grid-item>
		<px-grid-item :span="4"><div class="item">Span 4</div></px-grid-item>
		<px-grid-item :span="4"><div class="item">Span 4</div></px-grid-item>
	</px-grid>
</template>
<script setup lang="ts">
const column = {
	xxl: 24,
	xl: 20,
	lg: 16,
	md: 12,
	sm: 8,
	xs: 4
}
</script>
<style lang="css" scoped>
.item {
	min-height: 64px;
	display: flex;
	align-items: center;
	justify-content: center;
	color: #fff;
	text-align: center;
}
.px-grid {
	margin-bottom: 16px;
	margin-top: 4px;
}
.px-grid:last-of-type {
	margin-bottom: 0px;
}
.px-grid .px-grid-item:nth-child(even) .item {
	background: rgba(0, 168, 145, 1);
}
.px-grid .px-grid-item:nth-child(odd) .item {
	background: rgba(79, 184, 164, 1);
}
</style>

栅格尺寸

GridItem 的 span 属性设置栅格宽度。

Span 6 | Width 25%
Span 6 | Width 25%
Span 6 | Width 25%
Span 6 | Width 25%
Responsive
Responsive
Responsive
Responsive
Responsive
Responsive
<template>
	<px-grid>
		<px-grid-item :span="6"><div class="item">Span 6 | Width 25%</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Span 6 | Width 25%</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Span 6 | Width 25%</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Span 6 | Width 25%</div></px-grid-item>
	</px-grid>
	<px-grid>
		<px-grid-item :span="span"><div class="item">Responsive</div></px-grid-item>
		<px-grid-item :span="span"><div class="item">Responsive</div></px-grid-item>
		<px-grid-item :span="span"><div class="item">Responsive</div></px-grid-item>
		<px-grid-item :span="span"><div class="item">Responsive</div></px-grid-item>
		<px-grid-item :span="span"><div class="item">Responsive</div></px-grid-item>
		<px-grid-item :span="span"><div class="item">Responsive</div></px-grid-item>
	</px-grid>
</template>
<script setup lang="ts">
const span = {
	xxl: 4,
	xl: 6,
	lg: 8,
	md: 12,
	sm: 12,
	xs: 24
}
</script>
<style lang="css" scoped>
.item {
	min-height: 64px;
	display: flex;
	align-items: center;
	justify-content: center;
	color: #fff;
	text-align: center;
}
.px-grid {
	margin-bottom: 16px;
}
.px-grid:last-of-type {
	margin-bottom: 0px;
}
.px-grid .px-grid-item:nth-child(even) .item {
	background: rgba(0, 168, 145, 1);
}
.px-grid .px-grid-item:nth-child(odd) .item {
	background: rgba(79, 184, 164, 1);
}
</style>

栅格偏移

GridItem 的 offset 属性设置栅格宽度。同样地,支持响应式。

Span 6 | Offset 6
Span 8 | Offset 4
Span 6 | Offset Responsive
<template>
	<px-grid>
		<px-grid-item :span="6" :offset="6"><div class="item">Span 6 | Offset 6</div></px-grid-item>
		<px-grid-item :span="8" :offset="4"><div class="item">Span 8 | Offset 4</div></px-grid-item>
	</px-grid>
	<px-grid>
		<px-grid-item :span="6" :offset="offset"
			><div class="item">Span 6 | Offset Responsive</div></px-grid-item
		>
	</px-grid>
</template>
<script setup lang="ts">
const offset = {
	xxl: 18,
	xl: 12,
	lg: 8,
	md: 6,
	sm: 4,
	xs: 0
}
</script>
<style lang="css" scoped>
.item {
	min-height: 64px;
	display: flex;
	align-items: center;
	justify-content: center;
	color: #fff;
	text-align: center;
}
.px-grid {
	margin-bottom: 16px;
}
.px-grid:last-of-type {
	margin-bottom: 0px;
}
.px-grid .px-grid-item:nth-child(even) .item {
	background: rgba(0, 168, 145, 1);
}
.px-grid .px-grid-item:nth-child(odd) .item {
	background: rgba(79, 184, 164, 1);
}
</style>

栅格间隔

Grid 的 gutter 属性设置栅格宽度。同样地,支持响应式。

x: 4px, y: 4px

Content
Content
Content
Content

x: 8px, y: 4px

Content
Content
Content
Content

Responsive

Content
Content
Content
Content
<template>
	<h4>x: 4px, y: 4px</h4>
	<px-grid :gutter="4">
		<px-grid-item :span="6"><div class="item">Content</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Content</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Content</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Content</div></px-grid-item>
	</px-grid>
	<h4>x: 8px, y: 4px</h4>
	<px-grid :gutter="{ x: 8, y: 4 }">
		<px-grid-item :span="6"><div class="item">Content</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Content</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Content</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Content</div></px-grid-item>
	</px-grid>
	<h4>Responsive</h4>
	<px-grid :gutter="gutter">
		<px-grid-item :span="6"><div class="item">Content</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Content</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Content</div></px-grid-item>
		<px-grid-item :span="6"><div class="item">Content</div></px-grid-item>
	</px-grid>
</template>
<script setup lang="ts">
const gutter = {
	xxl: 24,
	xl: 16,
	lg: 12,
	md: 8,
	sm: 4,
	xs: 2
}
</script>
<style lang="css" scoped>
.item {
	min-height: 64px;
	display: flex;
	align-items: center;
	justify-content: center;
	color: #fff;
	text-align: center;
}
.px-grid {
	margin-bottom: 16px;
	margin-top: 4px;
}
.px-grid:last-of-type {
	margin-bottom: 0px;
}
.px-grid .px-grid-item:nth-child(even) .item {
	background: rgba(0, 168, 145, 1);
}
.px-grid .px-grid-item:nth-child(odd) .item {
	background: rgba(79, 184, 164, 1);
}
</style>

API

GridProps

属性类型可选默认值描述版本
columnnumber | ValueWithDeviceWidth<number>24Grid 内容区域等分列数。0.0.0-beta
gutternumber | { x?: number; y?: number } | Value4DeviceWidth<number | { x?: number; y?: number }>0子组件 GridItem 之间的间隔。0.0.0-beta

GridSlots

插槽参数描述版本
default子组件 GridItem。0.0.0-beta

GridItemProps

属性类型可选默认值描述版本
offsetnumber | ValueWithDeviceWidth<number>0GridItem 左侧偏移。0.0.0-beta
spannumber | ValueWithDeviceWidth<number>GridItem 宽度, 默认为 Grid 的 column 属性。0.0.0-beta

GridItemSlots

插槽参数描述版本
defaultGridItem 内容。0.0.0-beta

ValueWithDeviceWidth

ts
enum SCREEN_SIZE_TYPE {
	XS = 'xs',
	SM = 'sm',
	MD = 'md',
	LG = 'lg',
	XL = 'xl',
	XXL = 'xxl'
}

type ValueWithDeviceWidth<T> = Record<SCREEN_SIZE_TYPE, T>