Skip to content

栅格 Grid

栅格可以有效的保证页面的一致性、逻辑性、加强团队协作和统一。


基本用法

展示了最基本的 24 等分应用。


代码事例
vue
<template>
  <div class="grid-demo-background">
    <fk-space direction="vertical" :size="16" style="display: block;">
      <fk-row class="grid-demo">
        <fk-col :span="24">
          <div>24 - 100%</div>
        </fk-col>
      </fk-row>
      <fk-row class="grid-demo">
        <fk-col :span="12">
          <div>12 - 50%</div>
        </fk-col>
        <fk-col :span="12">
          <div>12 - 50%</div>
        </fk-col>
      </fk-row>
      <fk-row class="grid-demo">
        <fk-col :span="8">
          <div>8 - 33.33%</div>
        </fk-col>
        <fk-col :span="8">
          <div>8 - 33.33%</div>
        </fk-col>
        <fk-col :span="8">
          <div>8 - 33.33%</div>
        </fk-col>
      </fk-row>
      <fk-row class="grid-demo">
        <fk-col :span="6">
          <div>6 - 25%</div>
        </fk-col>
        <fk-col :span="6">
          <div>6 - 25%</div>
        </fk-col>
        <fk-col :span="6">
          <div>6 - 25%</div>
        </fk-col>
        <fk-col :span="6">
          <div>6 - 25%</div>
        </fk-col>
      </fk-row>
      <fk-row class="grid-demo">
        <fk-col :span="4">
          <div>4 - 16.66%</div>
        </fk-col>
        <fk-col :span="4">
          <div>4 - 16.66%</div>
        </fk-col>
        <fk-col :span="4">
          <div>4 - 16.66%</div>
        </fk-col>
        <fk-col :span="4">
          <div>4 - 16.66%</div>
        </fk-col>
        <fk-col :span="4">
          <div>4 - 16.66%</div>
        </fk-col>
        <fk-col :span="4">
          <div>4 - 16.66%</div>
        </fk-col>
      </fk-row>
    </fk-space>
  </div>
</template>

<style scoped>
.grid-demo-background {
  background-image: linear-gradient(
    90deg,
    var(--color-fill-2) 4.16666667%,
    transparent 4.16666667%,
    transparent 8.33333333%,
    var(--color-fill-2) 8.33333333%,
    var(--color-fill-2) 12.5%,
    transparent 12.5%,
    transparent 16.66666667%,
    var(--color-fill-2) 16.66666667%,
    var(--color-fill-2) 20.83333333%,
    transparent 20.83333333%,
    transparent 25%,
    var(--color-fill-2) 25%,
    var(--color-fill-2) 29.16666667%,
    transparent 29.16666667%,
    transparent 33.33333333%,
    var(--color-fill-2) 33.33333333%,
    var(--color-fill-2) 37.5%,
    transparent 37.5%,
    transparent 41.66666667%,
    var(--color-fill-2) 41.66666667%,
    var(--color-fill-2) 45.83333333%,
    transparent 45.83333333%,
    transparent 50%,
    var(--color-fill-2) 50%,
    var(--color-fill-2) 54.16666667%,
    transparent 54.16666667%,
    transparent 58.33333333%,
    var(--color-fill-2) 58.33333333%,
    var(--color-fill-2) 62.5%,
    transparent 62.5%,
    transparent 66.66666667%,
    var(--color-fill-2) 66.66666667%,
    var(--color-fill-2) 70.83333333%,
    transparent 70.83333333%,
    transparent 75%,
    var(--color-fill-2) 75%,
    var(--color-fill-2) 79.16666667%,
    transparent 79.16666667%,
    transparent 83.33333333%,
    var(--color-fill-2) 83.33333333%,
    var(--color-fill-2) 87.5%,
    transparent 87.5%,
    transparent 91.66666667%,
    var(--color-fill-2) 91.66666667%,
    var(--color-fill-2) 95.83333333%,
    transparent 95.83333333%
  );
}
.grid-demo .fk-col {
  height: 48px;
  line-height: 48px;
  color: var(--color-white);
  text-align: center;
}
.grid-demo .fk-col:nth-child(2n) {
  background-color: rgba(var(--fkblue-6), 0.9);
}
.grid-demo .fk-col:nth-child(2n + 1) {
  background-color: var(--color-primary-light-4);
}
</style>

栅格偏移

指定 offset 可以对栅格进行平移操作。


代码事例
vue
<template>
  <div>
    <fk-row class="grid-demo" style="marginBottom: 16px; backgroundColor: var(--color-fill-2);">
      <fk-col :span="8">col - 8</fk-col>
      <fk-col :span="8" :offset="8">
        col - 8 | offset - 8
      </fk-col>
    </fk-row>
    <fk-row class="grid-demo" style="marginBottom: 16px; backgroundColor: var(--color-fill-2);">
      <fk-col :span="6" :offset="8">
        col - 6 | offset - 8
      </fk-col>
      <fk-col :span="6" :offset="4">
        col - 6 | offset - 4
      </fk-col>
    </fk-row>
    <fk-row class="grid-demo" style="backgroundColor: var(--color-fill-2)">
      <fk-col :span="12" :offset="8">
        col - 12 | offset - 8
      </fk-col>
    </fk-row>
  </div>
</template>

<style scoped>
.grid-demo .fk-col {
  height: 48px;
  line-height: 48px;
  color: var(--color-white);
  text-align: center;
}
.grid-demo .fk-col:nth-child(2n) {
  background-color: rgba(var(--fkblue-6), 0.9);
}
.grid-demo .fk-col:nth-child(2n + 1) {
  background-color: var(--color-primary-light-4);
}
</style>

区块间隔

通过在 Row 上指定 gutter 可以增加栅格的区域间隔。


代码事例
vue
<template>
  <div>
    <p>Horizontal</p>
    <fk-row class="grid-demo" :gutter="24">
      <fk-col :span="12">
        <div>col - 12</div>
      </fk-col>
      <fk-col :span="12">
        <div>col - 12</div>
      </fk-col>
    </fk-row>
    <p>Responsive</p>
    <fk-row class="grid-demo" :gutter="{ md: 8, lg: 24, xl: 32 }">
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
    </fk-row>
    <p>Horizontal and Vertical</p>
    <fk-row class="grid-demo" :gutter="[24, 12]">
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
    </fk-row>
  </div>
</template>

<style scoped>
.grid-demo .fk-col {
  height: 48px;
  color: var(--color-white);
}
.grid-demo .fk-col > div {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}
.grid-demo .fk-col:nth-child(2n) > div {
  background-color: rgba(var(--fkblue-6), 0.9);
}
.grid-demo .fk-col:nth-child(2n + 1) > div {
  background-color: var(--color-primary-light-4);
}
</style>

水平布局

通过 justify 来进行水平布局。


代码事例
vue
<template>
  <div>
    <p>Arrange left</p>
    <fk-row class="grid-demo" justify="start">
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
    </fk-row>
    <p>Arrange center</p>
    <fk-row class="grid-demo" justify="center">
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
    </fk-row>
    <p>Arrange right</p>
    <fk-row class="grid-demo" justify="end">
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
    </fk-row>
    <p>Space around</p>
    <fk-row class="grid-demo" justify="space-around">
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
    </fk-row>
    <p>Space between</p>
    <fk-row class="grid-demo" justify="space-between">
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
      <fk-col :span="4">
        <div>col - 4</div>
      </fk-col>
    </fk-row>
  </div>
</template>

<style scoped>
.grid-demo {
  background-color: var(--color-fill-2);
  margin-bottom: 40px;
}
.grid-demo:last-child {
  margin-bottom: 0px;
}
.grid-demo .fk-col {
  height: 48px;
  line-height: 48px;
  color: var(--color-white);
  text-align: center;
}
.grid-demo .fk-col:nth-child(2n) {
  background-color: rgba(var(--fkblue-6), 0.9);
}
.grid-demo .fk-col:nth-child(2n + 1) {
  background-color: var(--color-primary-light-4);
}
</style>

垂直布局

通过 align 来进行垂直布局。


代码事例
vue
<template>
  <div>
    <p>Arrange top</p>
    <fk-row class="grid-demo" align="start">
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
    </fk-row>
    <p>Arrange center</p>
    <fk-row class="grid-demo" align="center">
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
    </fk-row>
    <p>Arrange bottom</p>
    <fk-row class="grid-demo" align="end">
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
      <fk-col :span="6">
        <div>col - 6</div>
      </fk-col>
    </fk-row>
  </div>
</template>

<style scoped>
.grid-demo {
  background-color: var(--color-fill-2);
  margin-bottom: 40px;
}
.grid-demo:last-child {
  margin-bottom: 0px;
}
.grid-demo .fk-col {
  height: 48px;
  line-height: 48px;
  color: var(--color-white);
  text-align: center;
}
.grid-demo .fk-col:nth-of-type(1) {
  height: 90px;
  line-height: 90px;
}
.grid-demo .fk-col:nth-of-type(2) {
  height: 48px;
  line-height: 48px;
}
.grid-demo .fk-col:nth-of-type(3) {
  height: 120px;
  line-height: 120px;
}
.grid-demo .fk-col:nth-of-type(4) {
  height: 60px;
  line-height: 60px;
}
.grid-demo .fk-col:nth-child(2n) {
  background-color: rgba(var(--fkblue-6), 0.9);
}
.grid-demo .fk-col:nth-child(2n + 1) {
  background-color: var(--color-primary-light-4);
}
</style>

排序

通过 order 来进行元素排序。


代码事例
vue
<template>
  <div>
    <fk-row class="grid-demo">
      <fk-col :span="6" :order="4">
        <div>1 col-order-4</div>
      </fk-col>
      <fk-col :span="6" :order="3">
        <div>2 col-order-3</div>
      </fk-col>
      <fk-col :span="6" :order="2">
        <div>3 col-order-2</div>
      </fk-col>
      <fk-col :span="6" :order="1">
        <div>4 col-order-1</div>
      </fk-col>
    </fk-row>
  </div>
</template>

<style scoped>
.grid-demo .fk-col {
  height: 48px;
  line-height: 48px;
  color: var(--color-white);
  text-align: center;
}
.grid-demo .fk-col:nth-child(2n) {
  background-color: rgba(var(--fkblue-6), 0.9);
}
.grid-demo .fk-col:nth-child(2n + 1) {
  background-color: var(--color-primary-light-4);
}
</style>

响应式布局

预置六种响应尺寸, 分别为 xs, sm, md, lg, xl, xxl


代码事例
vue
<template>
  <fk-row class="grid-demo">
    <fk-col :xs="2" :sm="4" :md="6" :lg="8" :xl="10" :xxl="8">
      Col
    </fk-col>
    <fk-col :xs="20" :sm="16" :md="12" :lg="8" :xl="4" :xxl="8">
      Col
    </fk-col>
    <fk-col :xs="2" :sm="4" :md="6" :lg="8" :xl="10" :xxl="8">
      Col
    </fk-col>
  </fk-row>
</template>

<style scoped>
.grid-demo .fk-col {
  height: 48px;
  line-height: 48px;
  color: var(--color-white);
  text-align: center;
}
.grid-demo .fk-col:nth-child(2n) {
  background-color: rgba(var(--fkblue-6), 0.9);
}
.grid-demo .fk-col:nth-child(2n + 1) {
  background-color: var(--color-primary-light-4);
}
</style>

其他属性的响应式

span, offset, order 属性可以内嵌到 xs, sm, md, lg, xl, xxl 对象中使用。 比如 :xs="8" 相当于 :xs="{ span: 8 }"


代码事例
vue
<template>
  <div>
    <fk-row class="grid-demo">
      <fk-col :xs="{span: 5, offset: 1}" :lg="{span: 6, offset: 2}">
        Col
      </fk-col>
      <fk-col :xs="{span: 11, offset: 1}" :lg="{span: 6, offset: 2}">
        Col
      </fk-col>
      <fk-col :xs="{span: 5, offset: 1}" :lg="{span: 6, offset: 2}">
        Col
      </fk-col>
    </fk-row>
  </div>
</template>

<style scoped>
.grid-demo .fk-col {
  height: 48px;
  line-height: 48px;
  color: var(--color-white);
  text-align: center;
}
.grid-demo .fk-col:nth-child(2n) {
  background-color: rgba(var(--fkblue-6), 0.9);
}
.grid-demo .fk-col:nth-child(2n + 1) {
  background-color: var(--color-primary-light-4);
}
</style>

Flex 用法

通过设置 Col 组件的 flex 属性,可以任意配置 flex 布局。


代码事例
vue
<template>
  <fk-row class="grid-demo" style="margin-bottom: 16px;">
    <fk-col flex="100px">
      <div>100px</div>
    </fk-col>
    <fk-col flex="auto">
      <div>auto</div>
    </fk-col>
  </fk-row>
  <fk-row class="grid-demo" style="margin-bottom: 16px;">
    <fk-col flex="100px">
      <div>100px</div>
    </fk-col>
    <fk-col flex="auto">
      <div>auto</div>
    </fk-col>
    <fk-col flex="100px">
      <div>100px</div>
    </fk-col>
  </fk-row>
  <fk-row class="grid-demo" style="margin-bottom: 16px;">
    <fk-col :flex="3">
      <div>3 / 12</div>
    </fk-col>
    <fk-col :flex="4">
      <div>4 / 12</div>
    </fk-col>
    <fk-col :flex="5">
      <div>5 / 12</div>
    </fk-col>
  </fk-row>
</template>

<style scoped>
.grid-demo .fk-col {
  height: 48px;
  line-height: 48px;
  color: var(--color-white);
  text-align: center;
}

.grid-demo .fk-col:nth-child(2n + 1) {
  background-color: var(--color-primary-light-4);
}

.grid-demo .fk-col:nth-child(2n) {
  background-color: rgba(var(--fkblue-6), 0.9);
}
</style>

Grid 布局

基于 CSS 的 Grid 布局实现的布局组件,支持折叠,并且可以设置后缀节点,后缀节点会显示在一行的结尾。


代码事例
vue

<template>
  <div style="margin-bottom: 20px;">
    <fk-typography-text>折叠:</fk-typography-text>
    <fk-switch :checked="collapsed" @click="collapsed = !collapsed" />
  </div>
  <fk-grid :cols="3" :col-gap="12" :row-gap="16" class="grid-demo-grid" :collapsed="collapsed">
    <fk-grid-item class="demo-item">item</fk-grid-item>
    <fk-grid-item class="demo-item">item</fk-grid-item>
    <fk-grid-item class="demo-item">item</fk-grid-item>
    <fk-grid-item class="demo-item" :offset="1">item | offset - 1</fk-grid-item>
    <fk-grid-item class="demo-item">item</fk-grid-item>
    <fk-grid-item class="demo-item" :span="3">item | span - 3</fk-grid-item>
    <fk-grid-item class="demo-item">item</fk-grid-item>
    <fk-grid-item class="demo-item">item</fk-grid-item>
    <fk-grid-item class="demo-item" suffix #="{ overflow }">
      suffix | overflow: {{ overflow }}
    </fk-grid-item>
  </fk-grid>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const collapsed = ref(false);

    return {
      collapsed
    }
  },
}
</script>

<style scoped>
.grid-demo-grid .demo-item,
.grid-demo-grid .demo-suffix {
  height: 48px;
  line-height: 48px;
  color: var(--color-white);
  text-align: center;
}

.grid-demo-grid .demo-item:nth-child(2n) {
  background-color: rgba(var(--fkblue-6), 0.9);
}

.grid-demo-grid .demo-item:nth-child(2n + 1) {
  background-color: var(--color-primary-light-4);
}
</style>

响应式的 Grid 布局

Grid 组件的响应式配置格式为 { xs: 1, sm: 2, md: 3, lg: 4, xl: 5, xxl: 6 }


代码事例
vue
<template>
  <fk-grid :cols="{ xs: 1, sm: 2, md: 3, lg: 4, xl: 5, xxl: 6 }" :col-gap="12" :row-gap="16" class="grid-demo-grid">
    <fk-grid-item class="demo-item">item</fk-grid-item>
    <fk-grid-item class="demo-item">item</fk-grid-item>
    <fk-grid-item class="demo-item">item</fk-grid-item>
    <fk-grid-item class="demo-item">item</fk-grid-item>
    <fk-grid-item class="demo-item">item</fk-grid-item>
    <fk-grid-item class="demo-item">item</fk-grid-item>
    <fk-grid-item class="demo-item" :span="{ xl: 4, xxl: 6 }" suffix>
      suffix
    </fk-grid-item>
  </fk-grid>
</template>

<style scoped>
.grid-demo-grid .demo-item,
.grid-demo-grid .demo-suffix {
  height: 48px;
  line-height: 48px;
  color: var(--color-white);
  text-align: center;
}
.grid-demo-grid .demo-item:nth-child(2n) {
  background-color: rgba(var(--fkblue-6), 0.9);
}
.grid-demo-grid .demo-item:nth-child(2n + 1) {
  background-color: var(--color-primary-light-4);
}
</style>

API

<row> Props

参数名描述类型默认值版本
gutter栅格间隔,单位是px 栅格间隔。可传入响应式对象写法 { xs: 4, sm: 6, md: 12},传入数组 [ 水平间距, 垂直间距 ] 来设置两个方向。number | ResponsiveValue | [number | ResponsiveValue, number | ResponsiveValue]0
justify水平对齐方式 (justify-content)'start' | 'center' | 'end' | 'space-around' | 'space-between''start'
align竖直对齐方式 ( align-items )'start' | 'center' | 'end' | 'stretch''start'
div开启这个选项RowCol都会被当作div而不会附带任何Grid相关的类和样式booleanfalse
wrapCol 是否支持换行booleantrue1.0.0

<col> Props

参数名描述类型默认值版本
span栅格占位格数number24
offset栅格左侧的间隔格数,间隔内不可以有栅格number-
order对元素进行排序number-
xs< 576px 响应式栅格number | { [key: string]: any }-
sm>= 576px 响应式栅格number | { [key: string]: any }-
md>= 768px 响应式栅格number | { [key: string]: any }-
lg>= 992px 响应式栅格number | { [key: string]: any }-
xl>= 1200px 响应式栅格number | { [key: string]: any }-
xxl>= 1600px 响应式栅格number | { [key: string]: any }-
flex设置 flex 布局属性number | string | 'initial' | 'auto' | 'none'-1.0.0

<grid> Props (1.0.0)

响应式配置从 1.0.0 开始支持,具体配置 ResponsiveValue

参数名描述类型默认值
cols每一行展示的列数number | ResponsiveValue24
row-gap行与行之间的间距number | ResponsiveValue0
col-gap列与列之间的间距number | ResponsiveValue0
collapsed是否折叠booleanfalse
collapsed-rows折叠时显示的行数number1

<grid> Events (1.0.0)

事件名描述参数
layout重新布局触发-

<grid-item> Props (1.0.0)

响应式配置从 1.0.0 开始支持,具体配置 ResponsiveValue

参数名描述类型默认值
span跨越的格数number | ResponsiveValue1
offset左侧的间隔格数number | ResponsiveValue0
suffix是否是后缀元素booleanfalse

ResponsiveValue

参数名描述类型默认值
xxl>= 1600px 响应式配置number-
xl>= 1200px 响应式配置number-
lg>= 992px 响应式配置number-
md>= 768px 响应式配置number-
sm>= 576px 响应式配置number-
xs< 576px 响应式配置number-

基于 MIT 许可发布