unocss 的使用

时间:2025-04-07 19:31:48

unocss 的使用

官网/guide/unocss 进行了详细的介绍,这里只记录要点。

unocss 集成

官网有介绍并推荐使用专用的位于根目录的 配置文件来对 unocss 进行配置,这要能得到更好的 IDE 支持和其他集成。不过官网也给出了使用 vite 集成 unocss 的解决方案,简单地说就是通过 unocss/vite 包默认暴露的方法来将 unocss 配置为 vite 的插件,然后将,该插件传递给 plugins 配置中。详细可查文档

配置

unocss 的配置项有以下这些:

  • preset:预置,用于配置预置的一些配置。
  • rules:定义规则。
  • shortcuts:定义简写。
  • theme:定义主题变量。
  • variants:将自定义约定应用于规则。
  • transformers:按照官方的说法,转换器用于转换源代码以支持约定。它提供了一个统一的接口来转换源代码以支持约定。
  • 其他。

下面分别详细介绍这些配置的功能和配置方法。

preset

presetunocss 的核心之一,在这里我们可以选择是否使用 unocss 本身的配置,以及我们还可以自定义自己的 preset 团队及自己用。比如如果我们需要使用 unocss 自己的 rules,就需要在 preset 配置中添加 presetUno 配置,如果使用通过属性来添加样式类名的功能就需要将 presetAttributify 配置到 preset 中。

rules

用来自定义生成 css 的规则,比如我们进行如下设置:

rules: [['ml-1', { 'margin-left': '8px' }]]

那么我们在元素或者组件上面就可以这样写来控制元素的样式:

<a-button type="primary" class="ml-1" important-color-red @click="handleClick">{{ a }}</a-button>

但是这样配置有个缺点:不够灵活,unocss 提供了更加灵活的配置方式:

rules: [[/^ml-(\d+)$/, ([, d]) => ({ 'margin-left': `${parseInt(d) * 8}px` })]]

这样子就可以这样子更加灵活地去写样式:

<template>
  <div>
    <a-button type="primary" status="danger" ml-2>Danger Button</a-button>
  </div>
  <div>
    <a-button type="primary" status="danger" ml-3>Danger Button</a-button>
  </div>
</template>
shortcuts

按照官方的介绍,shortcuts 可以让我们把多个 rule 合并为一个简写形式。用法举例:

shortcuts: {
    'flex-center': ["flex", "justify-center", "items-center"],
    'flex-btw': ["flex", "flex-justify-between", "items-center"]
}
theme

unocss 同样支持主题系统,我们可以在配置中通过配置 theme 字段来主题变量,和 Mui 的主题配置是有类似的地方的。用法:

theme: {
      colors: {
        primary: '#3f51b5',
        light: '#fff'
      }
    }

当然 theme 配置项不只是配置颜色,还可以配置断点(breakpoints)等,具体查看官方文档

variants

variants 允许我们对现有的规则应用一些变体,比如下面的例子:

variants: [
  // hover:
  (matcher) => {
    if (!matcher.startsWith('children:')) return matcher
    return {
      // slice `hover:` prefix and passed to the next variants and rules
      matcher: matcher.slice(9),
      selector: (s) => `${s}>*`
    }
  }
]

这个 variants 定义好后,我们在组件中这样使用:

<div children:ml-5>
  <p text-light bg-primary>this is primary text</p>
</div>
<div children:ml-10>
  <p text-light bg-primary>this is primary text</p>
</div>

unocss 会生成如下的 css 配置:

[children\:ml-5=''] > * {
  margin-left: 40px;
}

[children\:ml-10=''] > * {
  margin-left: 80px;
}

我们还可以用 hover 效果来举例:
配置:

// hover
variants: [
  (matcher) => {
    if (!matcher.startsWith('hover:')) return matcher
    return {
      // slice `hover:` prefix and passed to the next variants and rules
      matcher: matcher.slice(6),
      selector: (s) => `${s}:hover`
    }
  }
]

使用:

<p text-light bg-primary hover:bg-white hover:text-primary>this is primary text</p>

生成的 css:

[hover\:text-primary='']:hover {
  --un-text-opacity: 1;
  color: rgba(63, 81, 181, var(--un-text-opacity));
}

[hover\:bg-white='']:hover {
  --un-bg-opacity: 1;
  background-color: rgba(255, 255, 255, var(--un-bg-opacity));
}