Skip to content

UnoCSS 配置

UnoCSS 是即时原子化 CSS 引擎,本项目通过详细配置实现高效的原子化样式开发。

⚙️ 配置文件结构

uno.config.ts 完整配置

typescript
import {
  defineConfig,
  presetAttributify,
  presetIcons,
  presetTypography,
  presetUno,
  presetWebFonts,
  transformerDirectives,
  transformerVariantGroup
} from 'unocss'
import { ICONIFY_ICONS } from './src/types/icons.d'

export default defineConfig({
  // 快捷方式定义
  shortcuts: { },
  
  // 主题配置
  theme: { },
  
  // 安全列表
  safelist: [ ],
  
  // 自定义规则
  rules: [ ],
  
  // 预设配置
  presets: [ ],
  
  // 转换器
  transformers: [ ]
})

🚀 快捷方式 (Shortcuts)

将常用样式组合定义为简单类名:

面板组件样式

typescript
shortcuts: {
  // 面板标题
  'panel-title': 'pb-[5px] font-sans leading-[1.1] font-medium text-base text-[#6379bb] border-b border-b-solid border-[var(--el-border-color-light)] mb-5 mt-0',
}

使用示例

html
<h3 class="panel-title">用户管理</h3>
<!-- 等同于 -->
<h3 class="pb-[5px] font-sans leading-[1.1] font-medium text-base text-[#6379bb] border-b border-b-solid border-[var(--el-border-color-light)] mb-5 mt-0">用户管理</h3>

布局快捷方式

typescript
shortcuts: {
  // 居中对齐
  'flex-center': 'flex items-center justify-center',
  'flex-between': 'flex items-center justify-between',
  'absolute-center': 'absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2',
  
  // 容器样式
  'card': 'bg-white dark:bg-dark-800 rounded shadow p-4',
  'tag': 'inline-block px-2 py-1 text-xs rounded'
}

使用示例

html
<!-- 居中布局 -->
<div class="flex-center h-screen">
  <div class="card">卡片内容</div>
</div>

<!-- 两端对齐 -->
<div class="flex-between">
  <h2>标题</h2>
  <span class="tag">新</span>
</div>

🎨 主题配置 (Theme)

颜色系统

typescript
theme: {
  colors: {
    // 状态颜色 - 与Element Plus保持一致
    'primary': 'var(--el-color-primary)',
    'primary_dark': 'var(--el-color-primary-light-5)',
    'success': 'var(--color-success)',
    'warning': 'var(--color-warning)',
    'danger': 'var(--color-danger)',
    'info': 'var(--color-info)',
    
    // 文本颜色层级
    'text-base': 'var(--text-color)',
    'text-secondary': 'var(--text-color-secondary)',
    'text-muted': 'var(--text-muted)',
    'heading': 'var(--heading-color)',
    
    // 边框颜色
    'border': 'var(--border-color)',
    'border-light': 'var(--border-color-light)',
    'border-lighter': 'var(--border-color-lighter)',
    
    // 背景颜色
    'bg-base': 'var(--bg-color)',
    'bg-page': 'var(--bg-color-page)',
    'bg-overlay': 'var(--bg-color-overlay)',
    
    // 菜单颜色
    'menu-bg': 'var(--menu-bg)',
    'menu-text': 'var(--menu-color)',
    'menu-active': 'var(--menu-active-text)',
    'menu-hover': 'var(--menu-hover)'
  }
}

使用示例

html
<!-- 状态颜色 -->
<button class="bg-primary text-white">主要按钮</button>
<div class="text-success">成功消息</div>
<span class="border-warning border-2">警告边框</span>

<!-- 语义颜色 -->
<h1 class="text-heading">页面标题</h1>
<p class="text-secondary">次要文本</p>
<div class="bg-page">页面背景</div>

间距系统

typescript
theme: {
  spacing: {
    'sidebar': 'var(--sidebar-width)',      // 侧边栏宽度
    'header': 'var(--header-height)',       // 头部高度  
    'tags-view': 'var(--tags-view-height)'  // 标签视图高度
  }
}

使用示例

html
<aside class="w-sidebar">侧边栏</aside>
<header class="h-header">头部</header>

字体和阴影

typescript
theme: {
  fontFamily: {
    'base': 'var(--font-family-base)'
  },
  boxShadow: {
    'base': 'var(--shadow-base)',
    'light': 'var(--shadow-light)'
  },
  borderRadius: {
    'base': 'var(--border-radius-base)',
    'small': 'var(--border-radius-small)'
  }
}

🛡️ 安全列表 (Safelist)

确保图标类名被包含,即使未直接使用:

typescript
safelist: [
  // 添加所有预设图标的类名
  ...ICONIFY_ICONS.map((icon) => icon.value)
  // 例如: 'i-carbon-home', 'i-mdi-user', 'i-heroicons-settings'
]

作用说明

  • 防止未使用的图标类被清理
  • 支持动态图标加载
  • 确保打包后图标可用

⚡ 自定义规则 (Rules)

处理无法用预设满足的特殊样式:

布局规则

typescript
rules: [
  // 布局相关
  ['sidebar-width', { 'width': 'var(--sidebar-width)' }],
  ['header-height', { 'height': 'var(--header-height)' }],
  
  // 滚动条控制
  ['scrollbar', { 'overflow': 'auto' }],
  ['scrollbar-y', { 'overflow-y': 'auto', 'overflow-x': 'hidden' }],
  ['scrollbar-x', { 'overflow-x': 'auto', 'overflow-y': 'hidden' }]
]

文本处理规则

typescript
rules: [
  // 单行文本省略
  ['text-ellipsis', { 
    'white-space': 'nowrap', 
    'overflow': 'hidden', 
    'text-overflow': 'ellipsis' 
  }],
  
  // 多行文本省略
  ['line-clamp-2', {
    'overflow': 'hidden',
    'display': '-webkit-box',
    '-webkit-line-clamp': '2',
    '-webkit-box-orient': 'vertical'
  }]
]

定位规则

typescript
rules: [
  // 填满容器的相对定位
  ['relative-full', { 
    'position': 'relative', 
    'width': '100%', 
    'height': '100%' 
  }]
]

使用示例

html
<!-- 布局控制 -->
<div class="sidebar-width">侧边栏宽度</div>
<div class="scrollbar-y h-80">垂直滚动</div>

<!-- 文本处理 -->
<p class="text-ellipsis w-40">这是一段很长的文本将会被省略...</p>
<div class="line-clamp-2">
  这是一段很长的文本
  会被限制在两行内显示
  超出部分用省略号代替
</div>

<!-- 定位布局 -->
<div class="relative-full">
  <div class="absolute top-0 left-0">左上角</div>
</div>

🔧 预设系统 (Presets)

预设配置详解

typescript
presets: [
  // 1. 默认预设 - 提供基础原子化类
  presetUno(),
  
  // 2. 属性化模式 - 支持属性写法
  presetAttributify(),
  
  // 3. 图标预设 - 集成图标系统
  presetIcons({}),
  
  // 4. 排版预设 - 丰富文本样式
  presetTypography(),
  
  // 5. Web字体预设 - 在线字体支持
  presetWebFonts({
    fonts: {
      // 可添加自定义字体
      'custom': 'Inter'
    }
  })
]

预设使用示例

1. 默认预设 (presetUno)

html
<!-- 基础原子化类 -->
<div class="p-4 m-2 bg-blue-500 text-white rounded-lg">
  基础样式组合
</div>

2. 属性化模式 (presetAttributify)

html
<!-- 属性化写法 -->
<div 
  p="4" 
  m="2" 
  bg="blue-500" 
  text="white center" 
  border="rounded-lg"
>
  属性化样式
</div>

3. 图标预设 (presetIcons)

html
<!-- 图标使用 -->
<div class="i-carbon-home text-2xl"></div>
<span class="i-mdi-user text-lg text-blue-500"></span>

4. 排版预设 (presetTypography)

html
<!-- 排版样式 -->
<article class="prose prose-lg">
  <h1>标题</h1>
  <p>这是一段文本内容...</p>
</article>

🔄 转换器 (Transformers)

指令转换器

typescript
transformers: [
  // 支持 @apply 等指令
  transformerDirectives()
]

使用示例

scss
.custom-button {
  @apply px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600;
}

变体组转换器

typescript
transformers: [
  // 简化多变体写法
  transformerVariantGroup()
]

使用示例

html
<!-- 变体组简化 -->
<div class="hover:(bg-blue-500 text-white font-bold)">
  悬停效果组合
</div>

<!-- 等同于 -->
<div class="hover:bg-blue-500 hover:text-white hover:font-bold">
  悬停效果组合
</div>

🚀 性能优化配置

1. 按需生成

typescript
// vite 插件配置
export default () => {
  return UnoCss({
    // 禁用顶层 await,提高兼容性
    hmrTopLevelAwait: false
  })
}

2. 构建优化

typescript
export default defineConfig({
  // 开发模式配置
  mode: 'development',
  
  // 生产模式优化
  ...(process.env.NODE_ENV === 'production' && {
    // 启用压缩和优化
    minify: true,
    // 移除未使用的样式
    purge: {
      content: ['./src/**/*.{vue,ts,tsx}']
    }
  })
})

📋 使用最佳实践

1. 类名组织

html
<!-- ✅ 推荐:按功能分组 -->
<div class="
  flex items-center justify-between
  p-4 m-2
  bg-white shadow-lg rounded-lg
  hover:shadow-xl transition-shadow
">
  内容
</div>

2. 响应式设计

html
<!-- 响应式类名 -->
<div class="
  grid grid-cols-1 
  md:grid-cols-2 
  lg:grid-cols-3 
  gap-4
">
  响应式网格
</div>

3. 暗色模式支持

html
<!-- 主题适配 -->
<div class="
  bg-white dark:bg-gray-800
  text-gray-900 dark:text-gray-100
  border-gray-200 dark:border-gray-700
">
  主题适配内容
</div>

4. 状态管理

html
<!-- 状态相关样式 -->
<button class="
  bg-primary text-white
  disabled:opacity-50 disabled:cursor-not-allowed
  hover:bg-primary_dark
  focus:outline-none focus:ring-2 focus:ring-primary
">
  交互按钮
</button>

通过这样的 UnoCSS 配置,我们实现了高效的原子化 CSS 开发体验,同时保持了与设计系统的一致性。