Grid 栅格 Grid
基于 CSS Grid 布局的栅格组件,提供响应式布局,让页面适配不同屏宽更轻松。功能和 Flex 组件类似,如果你喜欢 Grid 布局,可以试试这个组件。
基础使用
Grid 组件默认把内容区域等分为 24 份,可以通过 column
属性进行调整。column
属性支持响应式。和 Flex 组件一样,'xs'
、'sm'
、'md'
、'lg'
、'xl'
、'xxl'
分别对应 、、、、、 的窗口像素宽度。
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
属性 | 类型 | 可选 | 默认值 | 描述 | 版本 |
---|---|---|---|---|---|
column | number | ValueWithDeviceWidth<number> | 是 | 24 | Grid 内容区域等分列数。 | 0.0.0-beta |
gutter | number | { x?: number; y?: number } | Value4DeviceWidth<number | { x?: number; y?: number }> | 是 | 0 | 子组件 GridItem 之间的间隔。 | 0.0.0-beta |
GridSlots
插槽 | 参数 | 描述 | 版本 |
---|---|---|---|
default |
| 子组件 GridItem。 | 0.0.0-beta |
GridItemProps
属性 | 类型 | 可选 | 默认值 | 描述 | 版本 |
---|---|---|---|---|---|
offset | number | ValueWithDeviceWidth<number> | 是 | 0 | GridItem 左侧偏移。 | 0.0.0-beta |
span | number | ValueWithDeviceWidth<number> | 是 |
| GridItem 宽度, 默认为 Grid 的 column 属性。 | 0.0.0-beta |
GridItemSlots
插槽 | 参数 | 描述 | 版本 |
---|---|---|---|
default |
| GridItem 内容。 | 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>