缘起
2021/11.
想选基于vue的UI框架, 搜索一圈后, 发现比较集中于以下3个选项:
- 饿了么的ElementUI
- Vuetify
- Quasar
通过知乎的了解, 似乎ElementUI上手容易但永久了会发现一些小毛病. 于是在Vuetify和Quasar里面选择.
看了两者的安装文档, 发现Vuetify是完全基于vue-cli
的, 而Quasar更推荐使用自己的cli工具. 尝试在vuetify基础上再装Quasar, 发现结果不能渲染… 也许是某种冲突? 另外Quasar是默认使用vue3, 而vuetify默认是vue2. 目前这个时间看vue-cli默认的还是vue2, 那就先用基于vue-cli和vue2的vuetify吧, 再者说了, EvanYou在知乎上也推荐的是这个.
文档
不少知乎上的回答者说vuetify的文档跟屎一样… 我开始也是摸不到门儿, 按文档的Getting Started
安装以后, 后面的章节不是按入门学习逻辑顺序排列而是按字母序排列的, 哈…
另外还有个问题是, 中文翻译的文档/网站和英文存在一定的差异性. 我开始是在中文下阅读的, 读到一个莫名其妙的断点
的概念的时候, 点链接进去竟然是响应式布局
! 连忙切换英文看看, 原来这一章节名字就是Display Breakpoints 显示断点
, 而译者意译为了响应式布局
, 因为断点的作用就是为了响应式布局. 然而, 除了标题以外,其他地方的翻译又统统变成了断点. 这个时候忽然看了下右上角菜单有个Learn
, 里面有个Guide
!这不就是要找的学习指南吗?! 点进去, 这个章节竟然不在Getting Started里面, 而是Introduction->Why Vuetify文章的一个子章节! 我想很多看文档的人是为了开始学习, 大概已经不需要告诉自己为什么还要用Vuetify了吧, 估计都会跳过这最重要的入门一章不看了.
安装
倒也简单. 基于vue-cli的. vue-cli的安装方式和以前不一样了. 以前是npm i -g vue-cli
,现在变成了:
npm i -g @vue/cli
安装完以后, 创建一个项目, 再加上vuetify插件支持就搞定!
npm create someproject
cd someproject
vue add vuetify
生产环境编译使用npm run build
,会在dist
目录下生成目标文件.
开发环境编译使用npm run serve
. 提示建立了服务器后, 在浏览器打开即可. 后面开发保存即编译. 后面语法错误/编译问题都会在浏览器中查阅.
源文件
都在src
目录中. 其中:
- 入口文件
main.js
是不需要改的. app.vue
是页面框架, 包括页头页尾和中间的内容, 其中页头页尾需要在这儿修改. Vuetify的根标签是, 内容标签是 . 页头可以用 components/HelloWorld.vue
是内容区, 主要修改的内容在这儿. 当然HelloWorld
这个名称根据自己需要修改就好了.plugins/vuetify.js
在需要配置修改vuetify的时候, 就需要修改这个文件, 而不是修改main.js哦.- 自定义css的话, 需要建立一个
sass/variables.scss
的目录和文件.
基础概念
接着看文档的Why Vuetify
最后一个章节功能指南
.
双向性
可以跳过, 反正我们都是从左到右的.
全局配置
可以花10秒看一下, 里面只有一句话就是在vuetify.js
中可以配置一个全局参数Vuetify.config
且目前只有一个布尔值silent
能配置.
海拔
所有元素都支持elevation=n
属性, n取值0~24.
图标icon
快速了解下, 就是Vuetify默认带了一套Material Design的图标, 可以直接在Vue的Template里面调用. 图标名称是mdi-
加上Material Design图标网站中搜索出来的图标名称. 不过要注意的是, 其中的图标有可能部分在@mdi/js
图标库中没有. 这时候可以试着重新安装最新的版本npm install @mdi/js -D
<v-icon large color="yellow">mdi-dots-horizontal</v-icon>
有一系列的大小属性: x-small, small, medium (默认), large, and x-large
有left/right的位置属性, 可以放置在v-btn内,指示图标的位置.
颜色可以通过color属性修改
要将图标嵌入打包的文件, 而不是每次都从CDN上获取, 查看https://vuetifyjs.com/zh-Hans/features/icon-fonts/#material-design56fe6807, 这儿也可以搜索图标名称.
方法是:
$ yarn add @mdi/js -D
// 或
$ npm install @mdi/js -D
import Vue from 'vue'
import Vuetify from 'vuetify/lib'
Vue.use(Vuetify)
export default new Vuetify({
icons: {
iconfont: 'mdiSvg',
},
})
在.vue文件中如下书写,导入需要的图标
<template>
<v-icon>{{ svgPath }}</v-icon>
</template>
<script>
import { mdiAccount } from '@mdi/js'
export default {
data: () => ({
svgPath: mdiAccount
}),
}
</script>
布局layouts
文档说的太简单, 就给了一个下面的格式.
<v-app>
<v-app-bar app></v-app-bar>
<v-main>
<v-container>
Hello World
</v-container>
</v-main>
</v-app>
除了前面说过的v-app
, v-app-bar
, v-main
以外, 还有一个v-footer
. 其中v-app-bar
和v-footer
需要与v-main
并列, 而且需要有app
这个属性. 有了这个属性后, 页头页脚才会挤占main的空间, 并且在每个页面上都显示出来.
v-container
属于网格布局Grid的一部分, 后面讲到网格布局的时候再说.
跟布局相关的有这么几个
- 断点breakpoints
- 网格grids
- 弹性布局flex
- 显示辅助display Helpers属性
主题Themes
需要修改vuetify.js
文件.
如下.
默认的颜色库需要单独引入.
默认的主题名称是light
, 如果不需要换主题的话, 只需要在这儿增加light就可以.
import Vue from 'vue'
import Vuetify from 'vuetify/lib'
import colors from 'vuetify/lib/util/colors'
const vuetify = new Vuetify({
theme: {
themes: {
light: {
primary: colors.purple,
secondary: colors.grey.darken1,
accent: colors.shades.black,
error: colors.red.accent3,
},
dark: {
primary: colors.blue.lighten3,
},
},
},
})
主题的使用方式, 如建一个按钮, 使用primary主题, 定义color属性即可.
<v-btn tile outlined color="primary">
<v-icon left>mdi-pencil</v-icon> Edit
</v-btn>
断点布局breakpoint
不知道为什么要起这样奇怪的名字. 断点实际上是设备的大小分类. 从超小号到超大号分成了5类. 其中超小号是默认类
- xs, 超小号, 指的是手机
- sm, 小号, 指的是平板
- md, 中号, 指的是笔记本电脑(或特大号平板)
- lg, 大号, 指的是台式机
- xl, 超大号, 指的是4k显示设备
网格Grid
网格是12列的
网格由上到下结构依次为<v-container>
, <v-row>
, <v-col>
也就是面-行-列的顺序. 其中<v-row>
标准是24px的.
另外还有一个<v-spacer>
可以夹在
no-gutters
属性在一行中不留”排水沟”, 也就是列与列中间没有空隙.align
属性是垂直对齐方式, 也适用于v-col
justify
属性是水平对齐方式, 如justify="end"
是所有列对齐到最后面
内容可以是<v-card>
, 感觉类似一个div.
cols
属性指定占用的列数, 如cols=3
. 不指定则所有列均分. 其他尺寸屏幕下直接用断点名称指定, 如sm=4
offset
属性是偏移的列数, 如offset=2
, 其他尺寸用offset-断点
指定, 如offset-sm=2
order
属性是指定位置.order=数字
, 数字越小越靠前. 但没有order属性的将排在最前面.order="first"
是排在第一order="last"
是排在最后.
显示辅助display Helpers
实际是一类class,以d-
开头, 指示标签css的display属性类型以及适配的断点类型.
包括none
,inline
, block
, inline-block
, flex
, inline-flex
,table
, table-row
, table-cell
等. 如d-inline
. 其中d-none
是隐藏的意思.
其他屏幕大小, 将断电名放在中间, 如d-sm-inline
flex弹性布局
- 父元素class都是
d-flex
就可以使用. - 父元素class可以增加
flex-方向
可以设置浮动方向(轴),包括flex-row
,flex-row-reverse
,flex-column
,flex-column-reverse
, 相当于改变css的flex-direction
- 父元素class增加
justify-位置
来设置沿轴浮动位置, 包括justify-start
,justify-center
,justify-end
,justify-space-between
,justify-space-around
, 相当于改变css的justify
- 父元素class增加
align-位置
来设置垂直于轴的浮动位置, 包括align-start
,align-
,align-center
,align-end
,align-baseline
,align-stretch
, 相当于改变css的align-items
. - 元素自身class增加
align-self-位置
可修改自身的位置. 相当于改变css的align-self
- 元素自身class增加
m位置字母-auto
, (位置字母是l, r, t, b之一, 指的是left/right/top/bottom)似乎可以让此元素的对应位置(m指的是margin)充满空间, 将其他元素挤到边上. - 元素自身class增加
order-数字
可以排序. n=0~12,或者first/last - 元素自身class增加
flex-grow-布尔值``flex-shrink-布尔值
可以让此元素在空间不足的时候挤占其他元素空间或者被其他元素挤占.
间距margin/padding
是一组class, 构成是这样的:
m位置字母-可选断点-数字
和p可选位置字母-可选断点-数字
- 位置字母是a/l/r/t/b/x/y
- 可选断点是断点名称
- 数字为n16(负16)~16, 每加1表示4px.
举个例子,如ma-4',
pa-n5,
mr-sm-7`
字体
全部通过class设置.
字体大小是一组class
text-值
, 具体为如下之一:
text-h1
text-h2
text-h3
text-h4
text-h5
text-h6
text-subtitle-1
text-subtitle-2
text-body-1
text-body-2
text-button
text-caption
text-overline
字体重量一组class, 具体为如下之一:
font-weight-black
font-weight-bold
font-weight-medium
font-weight-regular
font-weight-light
font-weight-thin
斜体是font-italic
文字横向位置:
text-left
text-center
text-right