什么是原子化CSS,UnoCSS又是什么,对此有疑问的推荐看下antfu的这篇文章——重新构想原子化 CSS (antfu.me) 相信看完这篇文章的你也会跟我一样热衷于UnoCSS.

介绍

今天介绍一个CSS开发利器 UnoCSS , 是一个具有高性能且极具灵活性的即时原子化 CSS 引擎,具有按需加载的特性,相信使用过 Tailwind CSS,Windi CSS ,等CSS框架的同学对CSS原子化这个概念都不会陌生,原子化 CSS 是一种 CSS 的架构方式,它倾向于小巧且用途单一的 class,并且会以视觉效果进行命名。

UnoCss(原子化css引擎) 让你的开发更轻松愉快-LMLPHP

对比

unocss 的作者是Anthony Fu,是 Vite 团队的成员,也是 Vitesse (Vite 社区最受欢迎的起手模板之一) 的作者。Anthony Fu 在开发Vitesse是使用 Tailwind CSS 作为 Vitesse 的默认 UI 框架。但由于 Tailwind 生成了数 MB 的 CSS,使得加载与更新 CSS 成为了整个 Vite 应用的性能瓶颈。后来作者发现了Windi CSS,相比于Tailwind CSS 具有按需加载,零依赖等特性。在CSS文件打包的大小与加载速度上得到了很大的提升.

使用和配置

UnoCSS 是一个引擎,而非一款框架,因为它并未提供核心工具类,所有功能可以通过预设和内联配置提供。

    • 规则(Rules) - 定义原子 CSS 实用程序
    • 预设(Presets) - 常见用例的预定义配置。
    • 快捷方式(Shortcuts) - 将多个规则组合成一个简写。
    • 主题(Theme) - 定义主题变量。
    • 变体(Variants) - 将自定义约定应用于规则。
    • 转换器(Transformers) - 将转换器编码为用户源代码以支持约定。
    • 提取器(Extractors) - 定义提取实用程序的位置和方式。
    • 预检(Preflights) - 定义全局 CSS 规则。
    • 层(Layers) - 定义每个实用程序层的顺序。
    • 自动完成(Presets) - 定义自定义自动完成建议。

准备

首先,使用 vite 创建一个最基础的vue模板

pnpm create vite

Copy

安装依赖 unocss,@unocss/reset

pnpm i unocss,@unocss/reset

Copy

如果需要使用 UnoCSS 的图标预设,还需要安装@iconify/json

pnpm i @iconify/json

Copy

如果需要使用 UnoCSS 的深色模式,最好再安装一下@vueuse/core,方便切换深色模式

pnpm i @vueuse/core

Copy

集成 UnoCSS

1.修改vite.config.ts,添加 unocss plugin

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import unocss from 'unocss/vite'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue(), unocss()]
})

Copy

2.修改main.ts

import { createApp } from 'vue'

/** 重置样式 这里引入自定义的重置样式也可 */
import '@unocss/reset/tailwind.css'
/** 
 *  项目内的样式,
 *  注意:最好放在重置样式后,uno.css前
 */
import './style.css'
/** 引入uno.css,不引入不生效 */
import 'uno.css'

import App from './App.vue'

createApp(App).mount('#app')

Copy

3.新增unocss.config.ts

import { defineConfig, presetAttributify, presetUno, presetIcons } from 'unocss'

export default defineConfig({
  presets: [presetUno(), presetAttributify(), presetIcons({scale: 1.2, warn: true})],
  shortcuts: [
    'wh-full': 'w-full h-full',
    'flex-center': 'flex justify-center items-center',
    'flex-col-center': 'flex-center flex-col',
    'flex-x-center': 'flex justify-center',
    'flex-y-center': 'flex items-center',
    'i-flex-center': 'inline-flex justify-center items-center',
    'i-flex-x-center': 'inline-flex justify-center',
    'i-flex-y-center': 'inline-flex items-center',
    'flex-col': 'flex flex-col',
    'flex-col-stretch': 'flex-col items-stretch',
    'i-flex-col': 'inline-flex flex-col',
    'i-flex-col-stretch': 'i-flex-col items-stretch',
    'flex-1-hidden': 'flex-1 overflow-hidden',
    /***** grid布局 *****/
    'grid-column-2': 'grid grid-cols-2 grid-rows-none',
    'grid-column-3': 'grid grid-cols-3 grid-rows-none',
    'grid-column-4': 'grid grid-cols-4 grid-rows-none',
    'grid-column-5': 'grid grid-cols-5 grid-rows-none',
    /**定位相关**/
    'absolute-lt': 'absolute left-0 top-0',
    'absolute-lb': 'absolute left-0 bottom-0',
    'absolute-rt': 'absolute right-0 top-0',
    'absolute-rb': 'absolute right-0 bottom-0',
    'absolute-tl': 'absolute-lt',
    'absolute-tr': 'absolute-rt',
    'absolute-bl': 'absolute-lb',
    'absolute-br': 'absolute-rb',
    'absolute-center': 'absolute-lt flex-center wh-full',
    'fixed-lt': 'fixed left-0 top-0',
    'fixed-lb': 'fixed left-0 bottom-0',
    'fixed-rt': 'fixed right-0 top-0',
    'fixed-rb': 'fixed right-0 bottom-0',
    'fixed-tl': 'fixed-lt',
    'fixed-tr': 'fixed-rt',
    'fixed-bl': 'fixed-lb',
    'fixed-br': 'fixed-rb',
    'fixed-center': 'fixed-lt flex-center wh-full',
    'nowrap-hidden': 'whitespace-nowrap overflow-hidden',
    'ellipsis-text': 'nowrap-hidden text-ellipsis',
    'transition-base': 'transition-all duration-300 ease-in-out'
  ],
  rules: [
    [/^bc-(.+)$/, ([, color]) => ({ 'border-color': `#${color}` })],
    [/^m-(\d+)$/, ([, d]) => ({ margin: `${d / 4}rem` })],
    [/^p-(\d+)$/, (match) => ({ padding: `${match[1] / 4}rem` })],
    ['card-shadow', { 'box-shadow': '0 1px 2px -2px #00000029, 0 3px 6px #0000001f, 0 5px 12px 4px #00000017' }],
  ],
  theme: {
    colors: {
      //primary: 'var(--primary-color)',
      //dark_bg: 'var(--dark-bg)',
    },
  },
})

Copy

使用UnoCSS

UnoCss(原子化css引擎) 让你的开发更轻松愉快-LMLPHP

预览效果

UnoCss(原子化css引擎) 让你的开发更轻松愉快-LMLPHP

插件推荐 (UnoCSS)

此插件非常强大,不仅有输入提示,并且还可以鼠标悬浮显示编译后的css样式,对自定义的 shortcuts、rules 和 colors 都生效哦, 效果如下图

UnoCss(原子化css引擎) 让你的开发更轻松愉快-LMLPHP

总结

UnoCSS 绝对是我用过的最好用的原子化CSS了,没有之一,它设计很优雅, 足够轻,用着非常爽,并且它对 tailwindcss 和 windicss 的写法做了兼容,你甚至可以直接对着 tailwindcss 文档写 UnoCSS,过渡成本无限接近 0。可能你刚开始写原子化CSS的时候会有点痛苦,但请相信我,写熟了之后你一定会直呼:真香!

11-18 11:52