栅格系统
Vuetify 附带了一个使用 flex-box 构建的 12 点栅格系统。 网格用于在应用程序的内容中创建特定布局。其中包含 5 种媒体断点,分别用于定位特定屏幕大小或方向:xs, sm, md, lg 和 xl。 这些分辨率在下面的视口断点表中定义,可以通过自定义 Breakpoint service 进行修改。
1.x 版本的栅格系统已经被弃用,2.x 的栅格系统更好。1.x 网格的文档在 v1.5 docs
Device | Code | Types | Range |
---|---|---|---|
Extra small | xs | small to large handset | < 600px |
Small | sm | small to medium tablet | 600px > < 960px |
Medium | md | large tablet to laptop | 960px > < 1264px |
Large | lg | desktop | 1264px > < 1904px |
Extra large | xl | 4k and ultra-wides | > 1904px |
* -16px on Desktop |
用例
Vuetify 栅格受到 Bootstrap grid 的启发。它通过使用一系列容器,行和列来布局和对齐内容进行集成。 如果您不熟悉Flexbox,参阅链接内容的背景,术语,代码,指南来了解更多 Read the CSS Tricks flexbox guide。
template
<template>
<v-container class="grey lighten-5">
<v-row no-gutters>
<v-col
v-for="n in 3"
:key="n"
cols="12"
sm="4"
>
<v-card
class="pa-2"
outlined
tile
>
One of three columns
</v-card>
</v-col>
</v-row>
</v-container>
</template>
在上面的示例中,我们在小型,中型,大型和超大型设备上创建了三个等宽列。父级的 v-container
来居中子级的 v-col
。
v-container
提供了居中和水平填充网站内容的功能。您也可以使用 fluid 属性在所有视口和设备尺寸上完全扩展容器。 遵循以前的 1.x 功能,在这些功能中,属性作为v-container
中的类传递,从而允许轻松地使用助手类(例如ma-#
/pa-#
/fill-height
) 进行应用v-row
是v-col
的包装组件。它利用 flex 属性来控制内部列的布局和流。它使用的标准边距是 24px。这可以减少 dense 属性或完全移除 no-gutters 。这是 2.x 版本的用法,替换了 1.x 中的v-layout
。v-col
是内容所有者,必须是v-row
的直接子集。 这是 2.x 版本的用法,替换了 1.x 中的v-flex
。
确保您了解其局限性和 bugs around flexbox。例如无法 utilize certain HTML elements as flex containers。
将网格系统与IE11一起使用时,您需要设置一个明确的 height
,因为 min-height
将不足以导致不正确的结果。
API
从下面选择您想要的组件,并查看可用的属性、插槽、事件和函数。
实战场
template script
<template>
<v-container fluid>
<v-row>
<v-col cols="12">
<v-row
:align="alignment"
:justify="justify"
class="grey lighten-5"
style="height: 300px;"
>
<v-card
v-for="n in 3"
:key="n"
class="ma-3 pa-6"
outlined
tile
>
Column
</v-card>
</v-row>
</v-col>
<v-col cols="12">
<v-row justify="center">
<v-col
cols="6"
md="2"
>
<v-select
v-model="alignment"
:items="alignmentsAvailable"
label="Align"
></v-select>
</v-col>
<v-col
cols="6"
md="2"
>
<v-select
v-model="justify"
:items="justifyAvailable"
label="Justify"
></v-select>
</v-col>
</v-row>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
data () {
return {
alignmentsAvailable: [
'start',
'center',
'end',
'baseline',
'stretch',
],
alignment: 'center',
dense: false,
justifyAvailable: [
'start',
'center',
'end',
'space-around',
'space-between',
],
justify: 'center',
}
},
}
</script>
示例
下面是一些简单到复杂的例子。
自动大小的列
列将自动在其父容器内占据相等的空间。 可以使用 cols 属性修改。 您还可以使用 sm, md, lg, 和 xl 属性来进一步定义如何在不同视口尺寸下调整列的尺寸。
template
<template>
<v-container class="grey lighten-5">
<v-row
v-for="n in 2"
:key="n"
:class="n === 1 ? 'mb-6' : ''"
no-gutters
>
<v-col
v-for="k in n + 1"
:key="k"
>
<v-card
class="pa-2"
outlined
tile
>
{{ k }} of {{ n + 1 }}
</v-card>
</v-col>
</v-row>
</v-container>
</template>
同等宽度的列
您可以将等宽的列分成多行。 虽然有一些针对较旧版本浏览器的解决方法,有一个 Safari flexbox bug。如果你是最新的浏览器,这应该没有必要。
template
<template>
<v-container class="grey lighten-5">
<v-row no-gutters>
<template v-for="n in 4">
<v-col :key="n">
<v-card
class="pa-2"
outlined
tile
>
Column
</v-card>
</v-col>
<v-responsive
v-if="n === 2"
:key="`width-${n}`"
width="100%"
></v-responsive>
</template>
</v-row>
</v-container>
</template>
一列宽度
使用自动布局时,您只能定义一列的宽度,并且仍然具有其同级元素来自动调整其大小。
template
<template>
<v-container class="grey lighten-5">
<v-row
class="mb-6"
no-gutters
>
<v-col
v-for="n in 3"
:key="n"
:cols="n === 2 ? 6 : undefined"
>
<v-card
class="pa-2"
outlined
tile
>
{{ n }} of 3 {{ n === 2 ? '(wider)' : '' }}
</v-card>
</v-col>
</v-row>
<v-row no-gutters>
<v-col
v-for="n in 3"
:key="n"
:cols="n === 2 ? 5 : undefined"
>
<v-card
class="pa-2"
outlined
tile
>
{{ n }} of 3 {{ n === 2 ? '(wider)' : '' }}
</v-card>
</v-col>
</v-row>
</v-container>
</template>
内容宽度可变
可以为列分配断点宽度,以根据其内容的自然宽度来调整大小。
template
<template>
<v-container class="grey lighten-5">
<v-row
class="mb-6"
justify="center"
no-gutters
>
<v-col lg="2">
<v-card
class="pa-2"
outlined
tile
>
1 of 3
</v-card>
</v-col>
<v-col md="auto">
<v-card
class="pa-2"
outlined
tile
>
Variable width content
</v-card>
</v-col>
<v-col lg="2">
<v-card
class="pa-2"
outlined
tile
>
3 of 3
</v-card>
</v-col>
</v-row>
<v-row no-gutters>
<v-col>
<v-card
class="pa-2"
outlined
tile
>
1 of 3
</v-card>
</v-col>
<v-col md="auto">
<v-card
class="pa-2"
outlined
tile
>
Variable width content
</v-card>
</v-col>
<v-col lg="2">
<v-card
class="pa-2"
outlined
tile
>
3 of 3
</v-card>
</v-col>
</v-row>
</v-container>
</template>
扩张和收缩
默认情况下,flex 组件将自动填充行或列中的可用空间。 当未指定特定大小时,它们还将相对于 flex 容器中的其余 flex 项目收缩。 您可以使用 cols 属性并提供 1 到 12 的值来定义 v-col
的列宽。
template
<template>
<v-container class="grey lighten-5">
<v-row
class="mb-6"
no-gutters
>
<v-col
v-for="n in 4"
:key="n"
>
<v-card
class="pa-2"
tile
outlined
>
col
</v-card>
</v-col>
</v-row>
<v-row no-gutters>
<v-col
v-for="n in 2"
:key="n"
:cols="n === 1 ? 8 : 4"
>
<v-card
class="pa-2"
tile
outlined
>
col-{{ n === 1 ? 8 : 4 }}
</v-card>
</v-col>
</v-row>
</v-container>
</template>
行和列断点
根据分辨率动态调整布局。(调整屏幕大小,并在 sm, md, 和 lg 断点上观察顶部的 row
布局更改)
template script
<template>
<v-container class="grey lighten-5">
<v-row
class="mb-6"
no-gutters
>
<v-col
v-for="n in 2"
:key="n"
:lg="cols[n - 1]"
:md="6"
:sm="cols[n - 1]"
>
<v-card
class="pa-2"
outlined
tile
>
col-{{ cols[n - 1] }}
</v-card>
</v-col>
</v-row>
<v-row no-gutters>
<v-col
v-for="n in 3"
:key="n"
cols="sm"
>
<v-card
class="pa-2"
outlined
tile
>
col
</v-card>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
computed: {
cols () {
const { lg, sm } = this.$vuetify.breakpoint
return lg ? [3, 9] : sm ? [9, 3] : [6, 6]
},
},
}
</script>
独特的布局
Vuetify 栅格系统的强大和灵活性使您可以创建出色的用户界面。
template
<template>
<v-container class="grey lighten-5">
<!-- Stack the columns on mobile by making one full-width and the other half-width -->
<v-row>
<v-col
cols="12"
md="8"
>
<v-card
class="pa-2"
outlined
tile
>
.col-12 .col-md-8
</v-card>
</v-col>
<v-col
cols="6"
md="4"
>
<v-card
class="pa-2"
outlined
tile
>
.col-6 .col-md-4
</v-card>
</v-col>
</v-row>
<!-- Columns start at 50% wide on mobile and bump up to 33.3% wide on desktop -->
<v-row>
<v-col
v-for="n in 3"
:key="n"
cols="6"
md="4"
>
<v-card
class="pa-2"
outlined
tile
>
.col-6 .col-md-4
</v-card>
</v-col>
</v-row>
<!-- Columns are always 50% wide, on mobile and desktop -->
<v-row>
<v-col
v-for="n in 2"
:key="n"
cols="6"
>
<v-card
class="pa-2"
outlined
tile
>
.col-6
</v-card>
</v-col>
</v-row>
</v-container>
</template>
垂直对齐
使用 align 和 align-self 属性更改队列及其上级的垂直对齐。
template script
<template>
<div>
<v-container
v-for="align in alignments"
:key="align"
class="grey lighten-5 mb-6"
>
<v-row
:align="align"
no-gutters
style="height: 150px;"
>
<v-col
v-for="n in 3"
:key="n"
>
<v-card
class="pa-2"
outlined
tile
>
One of three columns
</v-card>
</v-col>
</v-row>
</v-container>
<v-container class="grey lighten-5">
<v-row
no-gutters
style="height: 150px;"
>
<v-col
v-for="align in alignments"
:key="align"
:align-self="align"
>
<v-card
class="pa-2"
outlined
tile
>
One of three columns
</v-card>
</v-col>
</v-row>
</v-container>
</div>
</template>
<script>
export default {
data: () => ({
alignments: [
'start',
'center',
'end',
],
}),
}
</script>
水平对齐
使用 justify 和 justify-self 属性更改伸缩项及其父项的水平对齐。
template script
<template>
<v-container class="grey lighten-5">
<v-row
v-for="j in justify"
:key="j"
:justify="j"
>
<v-col
v-for="k in 2"
:key="k"
md="4"
>
<v-card
class="pa-2"
outlined
tile
>
One of two columns
</v-card>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
data: () => ({
justify: [
'start',
'center',
'end',
'space-around',
'space-between',
],
}),
}
</script>
Vue School
Learn Vue.js and modern and cutting-edge front-end technologies with our premium tutorials and video courses.
ads by Vuetify
](https://vueschool.io/?ref=vuetifyjs.com&friend=vuetify)
没有边距槽
您可以使用 no-gutters 属性去掉 v-row
的负边距让其直接的 v-col
子代的填充。
template
<template>
<v-container class="grey lighten-5">
<v-row no-gutters>
<v-col
cols="12"
sm="6"
md="8"
>
<v-card
class="pa-2"
outlined
tile
>
.col-12 .col-sm-6 .col-md-8
</v-card>
</v-col>
<v-col
cols="6"
md="4"
>
<v-card
class="pa-2"
outlined
tile
>
.col-6 .col-md-4
</v-card>
</v-col>
</v-row>
</v-container>
</template>
列包装
当给定行中放置超过 12 列时(不使用 .flex-nowrap
工具类),每组额外的列将换行。
template
<template>
<v-container class="grey lighten-5">
<v-row no-gutters>
<v-col cols="9">
<v-card
class="pa-2"
outlined
tile
>
.col-9
</v-card>
</v-col>
<v-col cols="4">
<v-card
class="pa-2"
outlined
tile
>
.col-4<br>Since 9 + 4 = 13 > 12, this 4-column-wide div gets wrapped onto a new line as one contiguous unit.
</v-card>
</v-col>
<v-col cols="6">
<v-card
class="pa-2"
outlined
tile
>
.col-6<br>Subsequent columns continue along the new line.
</v-card>
</v-col>
</v-row>
</v-container>
</template>
顺序类
您可以控制栅格子项目的排序。与偏移一样,您可以为不同的尺寸设置不同的排序,设计适合任何应用程序的专门的屏幕布局。
template
<template>
<v-container class="grey lighten-5">
<v-row no-gutters>
<v-col>
<v-card
class="pa-2"
outlined
tile
>
First, but unordered
</v-card>
</v-col>
<v-col order="12">
<v-card
class="pa-2"
outlined
tile
>
Second, but last
</v-card>
</v-col>
<v-col order="1">
<v-card
class="pa-2"
outlined
tile
>
Third, but first
</v-card>
</v-col>
</v-row>
</v-container>
</template>
顺序 最后/最前
您还可以显式指定 first 或 last,这将分别为 order
CSS 属性分配 -1 或 13 值。
template
<template>
<v-container class="grey lighten-5">
<v-row no-gutters>
<v-col order="last">
<v-card
class="pa-2"
outlined
tile
>
First, but last
</v-card>
</v-col>
<v-col>
<v-card
class="pa-2"
outlined
tile
>
Second, but unordered
</v-card>
</v-col>
<v-col order="first">
<v-card
class="pa-2"
outlined
tile
>
Third, but first
</v-card>
</v-col>
</v-row>
</v-container>
</template>
偏移
偏移对于补偿可能还不可见的元素或控制内容的位置很有用。就像断点一样,您可以为仍和可用的大小设置偏移量,这使您可以根据需要精确调整应用程序布局。
template
<template>
<v-container class="grey lighten-5">
<v-row
class="mb-6"
no-gutters
>
<v-col md="4">
<v-card
class="pa-2"
outlined
tile
>
.col-md-4
</v-card>
</v-col>
<v-col
md="4"
offset-md="4"
>
<v-card
class="pa-2"
outlined
tile
>
.col-md-4 .offset-md-4
</v-card>
</v-col>
</v-row>
<v-row
class="mb-6"
no-gutters
>
<v-col
md="3"
offset-md="3"
>
<v-card
class="pa-2"
outlined
tile
>
.col-md-3 .offset-md-3
</v-card>
</v-col>
<v-col
md="3"
offset-md="3"
>
<v-card
class="pa-2"
outlined
tile
>
.col-md-3 .offset-md-3
</v-card>
</v-col>
</v-row>
<v-row no-gutters>
<v-col
md="6"
offset-md="3"
>
<v-card
class="pa-2"
outlined
tile
>
.col-md-6 .offset-md-3
</v-card>
</v-col>
</v-row>
</v-container>
</template>
偏移断点
每个断点也可偏移。
template
<template>
<v-container class="grey lighten-5">
<v-row
class="mb-6"
no-gutters
>
<v-col
sm="5"
md="6"
>
<v-card
class="pa-2"
outlined
tile
>
.col-sm-5 .col-md-6
</v-card>
</v-col>
<v-col
sm="5"
offset-sm="2"
md="6"
offset-md="0"
>
<v-card
class="pa-2"
outlined
tile
>
.col-sm-5 .offset-sm-2 .col-md-6 .offset-md-0
</v-card>
</v-col>
</v-row>
<v-row no-gutters>
<v-col
sm="6"
md="5"
lg="6"
>
<v-card
class="pa-2"
outlined
tile
>
.col-sm-6 .col-md-5 .col-lg-6
</v-card>
</v-col>
<v-col
sm="6"
md="5"
offset-md="2"
lg="6"
offset-lg="0"
>
<v-card
class="pa-2"
outlined
tile
>
.col-sm-6 .col-md-5 .offset-md-2 .col-lg-6 .offset-lg-0
</v-card>
</v-col>
</v-row>
</v-container>
</template>
边距工具
使用 auto margin helper utilities 你可以强行将列从彼此分离。
template
<template>
<div class="ma-5 pa-5">
<v-container class="grey lighten-5">
<v-row>
<v-col md="4">
<v-card
class="pa-2"
outlined
tile
>
.col-md-4
</v-card>
</v-col>
<v-col
md="4"
class="ml-auto"
>
<v-card
class="pa-2"
outlined
tile
>
.col-md-4 .ml-auto
</v-card>
</v-col>
</v-row>
<v-row>
<v-col
md="3"
class="ml-md-auto"
>
<v-card
class="pa-2"
outlined
tile
>
.col-md-3 .ml-md-auto
</v-card>
</v-col>
<v-col
md="3"
class="ml-md-auto"
>
<v-card
class="pa-2"
outlined
tile
>
.col-md-3 .ml-md-auto
</v-card>
</v-col>
</v-row>
<v-row>
<v-col
cols="auto"
class="mr-auto"
>
<v-card
class="pa-2"
outlined
tile
>
.col-auto .mr-auto
</v-card>
</v-col>
<v-col cols="auto">
<v-card
class="pa-2"
outlined
tile
>
.col-auto
</v-card>
</v-col>
</v-row>
</v-container>
</div>
</template>
嵌套栅格
栅格可以被嵌套,类似于其它框架,以实现非常自定义的布局。
template
<template>
<v-container class="grey lighten-5">
<v-row>
<v-col sm="9">
<v-card
class="pa-2"
outlined
tile
>
Level 1: .col-sm-9
</v-card>
<v-row no-gutters>
<v-col
cols="8"
sm="6"
>
<v-card
class="pa-2"
outlined
style="background-color: lightgrey;"
tile
>
Level 2: .col-8 .col-sm-6
</v-card>
</v-col>
<v-col
cols="4"
sm="6"
>
<v-card
class="pa-2"
outlined
style="background-color: lightgrey;"
tile
>
Level 3: .col-4 .col-sm-6
</v-card>
</v-col>
</v-row>
</v-col>
</v-row>
</v-container>
</template>
空格
当您想要填充可用空间或在两个组件之间留出空间时,v-spacer
组件会很有用。
template
<template>
<v-container class="grey lighten-5">
<v-row>
<v-col>
<v-card
class="pa-2"
outlined
tile
>
.col
</v-card>
</v-col>
<v-spacer></v-spacer>
<v-col>
<v-card
class="pa-2"
outlined
tile
>
.col
</v-card>
</v-col>
</v-row>
<v-row>
<v-col
cols="auto"
lg="3"
>
<v-card
class="pa-2"
outlined
tile
>
.col-auto
</v-card>
</v-col>
<v-spacer></v-spacer>
<v-col>
<v-card
class="pa-2"
outlined
tile
>
.col
</v-card>
</v-col>
<v-spacer></v-spacer>
<v-col md="5">
<v-card
class="pa-2"
cols="auto"
outlined
tile
>
.col-md-5
</v-card>
</v-col>
</v-row>
</v-container>
</template>