UnoCSS
01. UnoCSS 介绍
1.1 什么是 UnoCSS
UnoCSS 是一个即时按需原子 CSS 引擎,它可以让你用简短的类名来控制元素的样式,而不需要写复杂的 CSS 代码。
当然,原子样式也有很多选择,最著名的就是
Tailwind
。 但由于 Tailwind 会生成大量样式定义,会导致全量的 CSS 文件往往体积会多至数 MB,从而有性能上有一些不足。
什么是原子化
- 原子化 CSS 是一种 CSS 架构方式,其支持小型、单一用途的类,其名称基于视觉功能。
- 更加通俗的来讲,原子化 CSS 是一种新的 CSS 编程思路,它倾向于创建小巧且单一用途的 class,并且以视觉效果进行命名。
1.2 UnoCSS 的优点
- 它可以让你快速地开发和原型设计,而不需要考虑 CSS 的细节。
- 它可以让你的 CSS 文件更小,因为它只生成你用到的工具类。
- 它可以让你的 CSS 更一致,因为它遵循一套预设的规则和变量。
- 它可以让你的 CSS 更灵活,因为它支持自定义工具类,变体,指令和图标。
- 它可以让你的 CSS 更易于维护,因为它避免了样式冲突和重复代码。
1.3 资源地址
02. 在项目中使用
以 Vite + Vue3 为示例
2.1 安装
2.1.1 初始化 Vite + Vue3 项目
npm create vite@latest unocss-demo
cd unocss-demo & npm install
2.1.2 安装 UnoCSS
npm install unocss -D
2.1.3 配置
vite.config.js
配置
// vite.config.js
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import UnoCSS from "unocss/vite";
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
plugins: [vue(), UnoCSS()],
});
- 创建
uno.config.js
配置文件
// uno.config.js
import { defineConfig } from "unocss";
export default defineConfig({
// ...UnoCSS options
});
- 引入样式
// main.js
import 'virtual:uno.css';
2.2 使用
<template>
<button class="h-32px flex justify-center items-center text-14px cursor-pointer select-none px-15pxpy-8px border-rd-4px border-none box-border text-#fff bg-#409eff m-auto hover-bg-#67c23a">按钮</button>
</template>
03. 常见用法
3.1 交互式文档
对应刚入手 unocss 的同学来说,规则怎么写是不知道的,但不用着急,官方(大佬 antfu)给出了 交互式文档输入你想要的css样式,就可以获得对应的class名称。
3.2 基础用法
UnoCSS支持用预设单位(预设单位是rem),也可以自定义单位
padding
相关用法
.px-1 {
padding-left: 0.25rem;
padding-right: 0.25rem;
}
.px-10rpx {
padding-left: 10rpx;
padding-right: 10rpx;
}
.p-t-1 {
padding-top: 0.25rem;
}
.p-b-1 {
padding-bottom: 0.25rem;
}
.p-l-1 {
padding-left: 0.25rem;
}
.p-r-1 {
padding-right: 0.25rem;
}
.p-1 {
padding: 10px;
}
.px-1 {
padding-left: 0.25rem;
padding-right: 0.25rem;
}
.py-1 {
padding-top: 0.25rem;
padding-bottom: 0.25rem;
}
margin
相关用法 - margin 相关可以参照 padding
.mx-1 {
margin-left: 0.25rem;
margin-right: 0.25rem;
}
.my-1 {
margin-top: 0.25rem;
margin-bottom: 0.25rem;
}
flex
相关用法
.flex {
display: flex;
}
.flex-1 {
flex: 1 1 0%;
}
.items-center {
align-items: center;
}
.justify-center {
justify-content: center;
}
文本
相关
.color-#999 {
--un-text-opacity: 1;
color: rgba(153, 153, 153, var(--un-text-opacity));
}
.text-12px {
font-size: 12px;
}
.break-all {
word-break: break-all;
}
在 unocss 中,自定义颜色想要给到 类名后面,并且 RGB 格式的颜色会被转成 RGBA 类型,如:
.color-#999 {
--un-text-opacity: 1;
color: rgba(153, 153, 153, var(--un-text-opacity));
}
.bg-#fcc {
--un-bg-opacity: 1;
background-color: rgba(255, 204, 204, var(--un-bg-opacity));
}
04. 自定义规则
4.1 静态规则
// uno.config.js
import { defineConfig } from "unocss";
export default defineConfig({
rules: [
['m-1', { margin: '0.3rem' }] // 一个配置为一个数组
]
});
// 伪代码: 如上配置之后,在css中检测到m-1就会编译成
.m-1 { margin: 0.3rem; }
4.2 动态规则
export default defineConfig({
rules: [
/** match[1]代表获取到的值 */
[/^m-(\d+)$/, match => ({ margin: `${+match[1] * 10}px` })],
[/^p-(\d+)$/, match => ({ padding: `${+match[1] * 10}px` })],
]
})
// 伪代码: 这样就可以修改unocss预设的大小,例如m-1会编译成
.m-1 { margin: 10px; }
4.3 配置样式集合
export default defineConfig({
shortcuts: [
{'flex-center': 'flex items-center justify-center',}, // 静态快捷方式,是一个对象,可配多个
]
})
export default defineConfig({
shortcuts: [
[/^base-border-(.*)$/, match => `border-1 border-style-dashed border-${match[1]}`], // 动态快捷方式,一个配置为一个数组
]
})
// 伪代码: 编译结果
.base-border-red {
border-width: 1px;
--un-border-opacity: 1;
border-color: rgba(248, 113, 113, var(--un-border-opacity));
border-style: dashed;
}
05. 其他
5.1 图标库
Pure CSS icons,对UnoCSS使用任何带有纯CSS的图标。
- 安装
pnpm add -D @iconify/json
yarn add -D @iconify/json
npm install -D @iconify/json
- 配置
// uno.config.js
import {
defineConfig,
presetUno,
presetIcons,
} from "unocss";
export default defineConfig({
// ...UnoCSS options
presets: [
presetUno(),
presetIcons({
extraProperties: {
display: "inline-block",
"vertical-align": "middle",
// ...
},
}),
],
});
- 使用
<template>
<div class="w-full flex items-center justify-center gap-x-4 text-4xl mt-4">
<div class="i-ph-anchor-simple-thin" />
<div class="i-mdi-alarm text-orange-400 hover:text-teal-400" />
<div class="w-2em h-2em i-logos:vue transform transition-800 hover:rotate-180" />
<button class="i-carbon:sun dark:i-carbon:moon !w-2em !h-2em" />
<div class="i-twemoji-grinning-face-with-smiling-eyes hover:i-twemoji-face-with-tears-of-joy" />
<p class="text-14px">←Hover it</p>
</div>
<div class="w-full flex items-center justify-center gap-x-4 text-4xl mt-4">
<div class="i-vscode-icons:file-type-light-pnpm" />
<div class="i-vscode-icons:file-type-light-pnpm?mask text-red-300" />
</div>
</template>
5.2 特有的属性模式
Attributify Mode,这将启用其他预设的属性模式。
- 原始
假设您使用Tailwind CSS的实用程序拥有此按钮。当属性列表变长时,阅读和维护就变得非常困难。
<button class="bg-blue-400 hover:bg-blue-500 text-sm text-white font-mono font-light py-2 px-4 rounded border-2 border-blue-200 dark:bg-blue-500 dark:hover:bg-blue-600">
Button
</button>
- 配置
// uno.config.js
import {
defineConfig,
presetUno,
presetIcons,
presetAttributify,
} from "unocss";
export default defineConfig({
// ...UnoCSS options
presets: [
presetUno(),
presetIcons({
extraProperties: {
display: "inline-block",
"vertical-align": "middle",
// ...
},
}),
presetAttributify(),
],
});
- 使用
<button
bg="blue-400 hover:blue-500 dark:blue-500 dark:hover:blue-600"
text="sm white"
font="mono light"
p="y-2 x-4"
border="2 rounded blue-200"
>
Button
</button>
5.3 属性组的写法转换
Variant Groups,为UnoCSS启用Windi CSS的属性组功能。
- 配置
// uno.config.js
import {
defineConfig,
presetUno,
presetAttributify,
presetIcons,
transformerVariantGroup,
} from "unocss";
export default defineConfig({
// ...UnoCSS options
presets: [
presetUno(),
presetAttributify(),
presetIcons({
extraProperties: {
display: "inline-block",
"vertical-align": "middle",
// ...
},
}),
],
transformers: [
transformerVariantGroup(),
],
});
- 使用
<div class="w-25 h-25 bg-gray-200 hover:(bg-gray-400 font-medium) font-(light mono)"></div>
以上代码会转换为:
<div class="w-25 h-25 bg-gray-200 hover:bg-gray-400 hover:font-medium font-light font-mono"></div>
5.4 快捷写法
- 配置
// uno.config.js
import {
defineConfig,
presetUno,
presetAttributify,
presetIcons,
transformerVariantGroup,
} from "unocss";
export default defineConfig({
// ...UnoCSS options
// ...
shortcuts: [
{
// shortcuts to multiple utilities
'btn': 'py-2 px-4 font-semibold text-#fff rounded-lg m-4 shadow-md bg-blue-500',
'btn-green': 'text-white m-4 px-4 py-2 rounded-lg bg-green-500 hover:bg-green-700',
// single utility alias
'red': 'text-red-500',
},
// dynamic shortcuts
// 除了普通映射之外,UnoCSS还允许您定义动态快捷方式。 与规则类似,动态快捷方式是匹配器正则表达式和处理函数的组合。
[/^btn-(.*)$/, ([, c]) => `m-4 bg-${c}-400 text-${c}-100 py-2 px-4 rounded-lg`],
],
});
- 使用
<template>
<div class="btn">按钮</div>
<div class="btn-green red">按钮</div>
<div class="btn-red">按钮</div>
</template>
5.5 标记
Tagify,这将为其他预设启用tagify模式。
- 配置
// uno.config.js
import {
defineConfig,
presetUno,
presetAttributify,
presetIcons,
transformerVariantGroup,
presetTagify,
} from "unocss";
export default defineConfig({
// ...UnoCSS options
presets: [
// ...
presetTagify(),
],
// ...
});
- 使用
使用tagify模式,您可以将CSS样式嵌入HTML标签:
<template>
<text-red> red text </text-red>
<flex> flexbox </flex>
I'm feeling <i-line-md-emoji-grin /> today!
</template>
以上代码会转换为:
<template>
<span class="text-red"> red text </span>
<div class="flex"> flexbox </div>
I'm feeling <span class="i-line-md-emoji-grin"></span> today!
</template>
5.6 网页字体
Web fonts,只需提供字体名称,即可使用Google Fonts、FontShare中的网络字体。
5.7 CDN运行时
CDN Runtime,UnoCSS运行时提供一个可在浏览器中运行UnoCSS的CDN构建。它将检测DOM的变化并动态生成样式。
5.8 检查
Inspector,UnoCSS的检查器UI:@ UnoCSS/inspector。由unocss和@unocss/vite一起实现。
访问Vite dev服务器中的http://127.0.0.1:5173/__unocss以查看检查器。检查器允许您检查为每个文件生成的CSS规则和应用的类。它还提供了一个REPL来测试基于您当前配置的实用程序。
06. VsCode插件
6.1 安装插件UnoCSS
安装启用后,页面上就能看出哪些 class 使用 unocss 提供 (带有虚线),并且能显示类名对应的样式内容。
6.2 代码提示
ctrl + shift + p
=> 输入open Setting
=> 选择首选项:打开用户设置
- 添加以下配置
"editor.quickSuggestions": {
"strings": true,
"other": true,
"comments": true,
},
配置完成后,在输入类名时会对 unocss 中存在的 class 进行智能提示。