Skip to content

Icons 插件

@pikacss/plugin-icons 讓你可以使用 Iconify 上的任何圖示作為原子化 CSS class——由 @iconify/utils@unocss/preset-icons 提供支援。圖示在建置時期解析並以優化的 CSS data URI 嵌入,零執行期開銷。

安裝

此插件需要 @iconify/utils 作為 peer dependency:

sh
pnpm add @pikacss/plugin-icons @iconify/utils

基本設定

ts
// pika.config.ts
import { icons } from '@pikacss/plugin-icons'
import { defineEngineConfig } from '@pikacss/unplugin-pikacss'

export default defineEngineConfig({
	plugins: [icons()],
	icons: {
		autoInstall: true,
	},
})

圖示命名慣例

圖示遵循以下模式:prefix + collection:name

預設前綴為 i-。使用 Iconify collection 和圖示名稱以冒號分隔來參照圖示:

簡寫Collection圖示
i-mdi:homeMaterial Design Iconshome
i-lucide:settingsLucidesettings
i-carbon:warningCarbonwarning
i-tabler:brand-githubTabler Iconsbrand-github

瀏覽可用圖示:Iconify

使用方式

ts
// pika() is available as a global function — no import needed

// Basic icon usage: prefix + collection:name
pika('i-mdi:home')
pika('i-mdi:account')
pika('i-lucide:settings')

// Force mask mode (icon inherits text color via currentColor)
pika('i-mdi:home?mask')

// Force background mode (icon keeps original colors)
pika('i-mdi:home?bg')

// Auto mode (default): uses mask if SVG contains currentColor, otherwise bg
pika('i-mdi:home?auto')

在 Vue 元件中:

vue
<template>
	<div>
		<!-- Basic icon -->
		<span :class="pika('i-mdi:home')" />

		<!-- Force mask mode: icon color follows text color -->
		<span
			:class="pika('i-mdi:account?mask')"
			style="color: red;"
		/>

		<!-- Force bg mode: icon keeps its original SVG colors -->
		<span :class="pika('i-mdi:palette?bg')" />
	</div>
</template>

渲染模式

插件支援兩種渲染模式,決定如何將圖示 SVG 作為 CSS 套用:

Mask 模式

mask 模式中,SVG 作為 CSS mask 使用。圖示繼承元素的文字 color,便於主題化:

css
/* Mask mode: icon inherits text color via currentColor */
.pika-xxxx {
  --svg-icon: var(--pika-svg-icon-mdi-home);
  -webkit-mask: var(--svg-icon) no-repeat;
  mask: var(--svg-icon) no-repeat;
  -webkit-mask-size: 100% 100%;
  mask-size: 100% 100%;
  background-color: currentColor;
  color: inherit;
}

Background 模式

background 模式中,SVG 作為 CSS 背景圖片使用。圖示保留其原始 SVG 顏色:

css
/* Background mode: icon retains its original SVG colors */
.pika-xxxx {
  --svg-icon: var(--pika-svg-icon-mdi-home);
  background: var(--svg-icon) no-repeat;
  background-size: 100% 100%;
  background-color: transparent;
}

Auto 模式(預設)

mode'auto'(預設值)時,插件自動選擇適合的模式:

  • mask — 若 SVG 包含 currentColor
  • bg — 否則

你可以在 shortcut 名稱後加上 ?mask?bg?auto 來覆蓋每個圖示的模式。

自訂 Collection

你可以在設定中定義內嵌 SVG collection:

ts
// pika.config.ts
import { icons } from '@pikacss/plugin-icons'
import { defineEngineConfig } from '@pikacss/unplugin-pikacss'

export default defineEngineConfig({
	plugins: [icons()],
	icons: {
		collections: {
			// Inline SVG collection
			custom: {
				logo: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10" fill="currentColor"/></svg>',
			},
		},
	},
})
// Usage: pika('i-custom:logo')

自訂處理器

使用 processor 選項在 CSS 屬性發出前修改它們:

ts
// pika.config.ts
import { icons } from '@pikacss/plugin-icons'
import { defineEngineConfig } from '@pikacss/unplugin-pikacss'

export default defineEngineConfig({
	plugins: [icons()],
	icons: {
		// Custom processor to modify icon CSS before output
		processor: (styleItem, meta) => {
			// Add display: inline-block to all icons
			styleItem.display = 'inline-block'
			styleItem['vertical-align'] = 'middle'

			// Access icon metadata
			console.log(`Processing icon: ${meta.collection}:${meta.name}, mode: ${meta.mode}`)
		},
	},
})

自動完成

提供圖示名稱清單以增強 IDE 自動完成建議:

ts
// pika.config.ts
import { icons } from '@pikacss/plugin-icons'
import { defineEngineConfig } from '@pikacss/unplugin-pikacss'

export default defineEngineConfig({
	plugins: [icons()],
	icons: {
		// Add custom entries to IDE autocomplete suggestions
		autocomplete: [
			'mdi:home',
			'mdi:account',
			'mdi:settings',
			'lucide:check',
			'lucide:x',
		],
	},
})

進階設定

ts
// pika.config.ts
import { icons } from '@pikacss/plugin-icons'
import { defineEngineConfig } from '@pikacss/unplugin-pikacss'

export default defineEngineConfig({
	plugins: [icons()],
	icons: {
		// Icon scale factor (default: 1)
		scale: 1.2,
		// Rendering mode: 'auto' | 'mask' | 'bg' (default: 'auto')
		mode: 'mask',
		// Shortcut prefix (default: 'i-')
		prefix: 'i-',
		// Auto-install icon packages on demand
		autoInstall: true,
		// Extra CSS properties applied to every icon
		extraProperties: {
			'display': 'inline-block',
			'vertical-align': 'middle',
		},
		// CSS unit for width/height (e.g., 'em', 'rem')
		unit: 'em',
		// CDN URL for loading icons (optional)
		// cdn: 'https://esm.sh/',
	},
})

設定參考

此插件以 icons 欄位擴充 EngineConfig

ts
interface EngineConfig {
  icons?: IconsConfig
}

IconsConfig 繼承 @unocss/preset-icons 的選項(排除 warnlayercustomFetcher),並加入 PikaCSS 特定的項目:

選項型別預設值說明
scalenumber1圖示縮放係數
mode'auto' | 'mask' | 'bg''auto'預設渲染模式
prefixstring | string[]'i-'圖示 shortcut 的 class 名稱前綴
collectionsRecord<string, IconifyJSON | (() => Awaitable<IconifyJSON>)>自訂圖示 collection
customizationsIconCustomizations轉換圖示(旋轉、調整大小等)
autoInstallbooleanfalse依需求自動安裝圖示套件
cdnstring載入圖示的 CDN 基底 URL
unitstring圖示尺寸的 CSS 單位(例如 'em'
extraPropertiesRecord<string, string>每個圖示的額外 CSS 屬性
processor(styleItem: StyleItem, meta: Required<IconMeta>) => void修改每個圖示的 CSS 輸出
autocompletestring[]額外的自動完成項目

運作原理

  1. 插件註冊一個符合 regex 模式 /^(?:i-)([\w:-]+)(?:\?(mask|bg|auto))?$/ 的動態 shortcut
  2. 當符合的 shortcut 被解析時,它會解析圖示名稱(collection:name 格式)
  3. SVG 透過 @iconify/utils@unocss/preset-icons 載入器載入
  4. SVG 被編碼為 CSS data URI 並儲存為 CSS 變數(--<prefix>svg-icon-...),標記為 pruneUnused: true
  5. 根據解析的模式,產生以 mask 為基礎或以背景為基礎的 CSS 屬性

下一步