🎨 主题定制
ERP组件库提供了强大而灵活的主题定制系统,让您轻松打造符合品牌风格的界面。
🌈 设计理念
我们的主题系统基于以下设计理念:
- 一致性 - 统一的设计语言和视觉规范
- 灵活性 - 支持深度定制和品牌化
- 可访问性 - 符合无障碍设计标准
- 响应式 - 适配各种设备和屏幕尺寸
🎯 快速开始
基础主题配置
通过CSS变量快速定制主题:
css
:root {
/* 品牌色彩 */
--fk-color-primary: #667eea;
--fk-color-primary-light: #8b9df0;
--fk-color-primary-dark: #4c63d2;
/* 功能色彩 */
--fk-color-success: #28a745;
--fk-color-warning: #ffc107;
--fk-color-danger: #dc3545;
--fk-color-info: #17a2b8;
/* 中性色彩 */
--fk-color-text-primary: #2c3e50;
--fk-color-text-secondary: #6c757d;
--fk-color-text-placeholder: #adb5bd;
--fk-color-border: #dee2e6;
--fk-color-background: #ffffff;
--fk-color-background-light: #f8f9fa;
/* 字体系统 */
--fk-font-family: 'HarmonyOS Sans SC', -apple-system, BlinkMacSystemFont, sans-serif;
--fk-font-size-xs: 12px;
--fk-font-size-sm: 14px;
--fk-font-size-base: 16px;
--fk-font-size-lg: 18px;
--fk-font-size-xl: 20px;
/* 间距系统 */
--fk-spacing-xs: 4px;
--fk-spacing-sm: 8px;
--fk-spacing-md: 16px;
--fk-spacing-lg: 24px;
--fk-spacing-xl: 32px;
/* 圆角系统 */
--fk-border-radius-sm: 4px;
--fk-border-radius-base: 6px;
--fk-border-radius-lg: 8px;
--fk-border-radius-xl: 12px;
/* 阴影系统 */
--fk-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1);
--fk-shadow-base: 0 4px 6px rgba(0, 0, 0, 0.1);
--fk-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
--fk-shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1);
/* 动画系统 */
--fk-transition-fast: 0.15s ease;
--fk-transition-base: 0.3s ease;
--fk-transition-slow: 0.5s ease;
}深色模式
支持自动切换和手动控制的深色模式:
css
[data-theme='dark'] {
/* 深色模式色彩 */
--fk-color-text-primary: #ffffff;
--fk-color-text-secondary: #e9ecef;
--fk-color-text-placeholder: #6c757d;
--fk-color-border: #495057;
--fk-color-background: #1a1a1a;
--fk-color-background-light: #2d3748;
/* 深色模式下的品牌色调整 */
--fk-color-primary: #7c8df0;
--fk-color-primary-light: #9ca8f3;
--fk-color-primary-dark: #5a6fd8;
}
/* 自动深色模式 */
@media (prefers-color-scheme: dark) {
:root {
--fk-color-text-primary: #ffffff;
--fk-color-text-secondary: #e9ecef;
--fk-color-background: #1a1a1a;
--fk-color-background-light: #2d3748;
}
}🎨 预设主题
我们提供了多套精心设计的预设主题:
科技蓝主题
css
:root {
--fk-color-primary: #0066cc;
--fk-color-primary-light: #3385d6;
--fk-color-primary-dark: #0052a3;
--fk-gradient-primary: linear-gradient(135deg, #0066cc 0%, #004499 100%);
}商务绿主题
css
:root {
--fk-color-primary: #28a745;
--fk-color-primary-light: #5cb85c;
--fk-color-primary-dark: #1e7e34;
--fk-gradient-primary: linear-gradient(135deg, #28a745 0%, #20c997 100%);
}优雅紫主题
css
:root {
--fk-color-primary: #6f42c1;
--fk-color-primary-light: #8a63d2;
--fk-color-primary-dark: #59359a;
--fk-gradient-primary: linear-gradient(135deg, #6f42c1 0%, #e83e8c 100%);
}🔧 高级定制
组件级别定制
针对特定组件进行深度定制:
css
/* 按钮组件定制 */
.fk-button {
--button-height: 40px;
--button-padding: 0 20px;
--button-font-weight: 500;
--button-border-width: 1px;
--button-transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.fk-button--primary {
--button-bg: var(--fk-gradient-primary);
--button-border: transparent;
--button-color: #ffffff;
--button-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
}
.fk-button--primary:hover {
--button-shadow: 0 6px 16px rgba(102, 126, 234, 0.6);
transform: translateY(-2px);
}
/* 输入框组件定制 */
.fk-input {
--input-height: 40px;
--input-padding: 0 12px;
--input-border-radius: var(--fk-border-radius-base);
--input-border-color: var(--fk-color-border);
--input-focus-border-color: var(--fk-color-primary);
--input-focus-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
}
/* 表格组件定制 */
.fk-table {
--table-border-color: var(--fk-color-border);
--table-header-bg: var(--fk-color-background-light);
--table-row-hover-bg: rgba(102, 126, 234, 0.05);
--table-stripe-bg: rgba(0, 0, 0, 0.02);
}响应式主题
根据屏幕尺寸调整主题:
css
/* 移动端适配 */
@media (max-width: 768px) {
:root {
--fk-font-size-base: 14px;
--fk-spacing-md: 12px;
--fk-spacing-lg: 16px;
--fk-border-radius-base: 4px;
}
.fk-button {
--button-height: 36px;
--button-padding: 0 16px;
}
.fk-input {
--input-height: 36px;
}
}
/* 大屏幕优化 */
@media (min-width: 1200px) {
:root {
--fk-font-size-base: 16px;
--fk-spacing-lg: 32px;
--fk-spacing-xl: 48px;
}
}🎭 动态主题切换
JavaScript API
通过JavaScript动态切换主题:
typescript
// 主题管理器
class ThemeManager {
private currentTheme: string = 'light'
// 切换主题
switchTheme(theme: 'light' | 'dark' | 'auto') {
document.documentElement.setAttribute('data-theme', theme)
this.currentTheme = theme
localStorage.setItem('theme', theme)
}
// 获取当前主题
getCurrentTheme(): string {
return this.currentTheme
}
// 初始化主题
initTheme() {
const savedTheme = localStorage.getItem('theme') || 'auto'
if (savedTheme === 'auto') {
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
this.switchTheme(prefersDark ? 'dark' : 'light')
} else {
this.switchTheme(savedTheme as any)
}
}
// 监听系统主题变化
watchSystemTheme() {
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
if (this.currentTheme === 'auto') {
this.switchTheme(e.matches ? 'dark' : 'light')
}
})
}
}
// 使用示例
const themeManager = new ThemeManager()
themeManager.initTheme()
themeManager.watchSystemTheme()
// 切换到深色模式
themeManager.switchTheme('dark')Vue组件示例
创建主题切换组件:
vue
<template>
<div class="theme-switcher">
<button
v-for="theme in themes"
:key="theme.value"
class="theme-button"
:class="{ active: currentTheme === theme.value }"
@click="switchTheme(theme.value)"
>
<component :is="theme.icon" />
{{ theme.label }}
</button>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
interface Theme {
value: string
label: string
icon: string
}
const themes: Theme[] = [
{ value: 'light', label: '浅色', icon: 'sun-icon' },
{ value: 'dark', label: '深色', icon: 'moon-icon' },
{ value: 'auto', label: '自动', icon: 'auto-icon' }
]
const currentTheme = ref('light')
const switchTheme = (theme: string) => {
currentTheme.value = theme
document.documentElement.setAttribute('data-theme', theme)
localStorage.setItem('theme', theme)
}
onMounted(() => {
const savedTheme = localStorage.getItem('theme') || 'auto'
currentTheme.value = savedTheme
switchTheme(savedTheme)
})
</script>
<style scoped>
.theme-switcher {
display: flex;
gap: 8px;
padding: 4px;
background: var(--fk-color-background-light);
border-radius: var(--fk-border-radius-lg);
border: 1px solid var(--fk-color-border);
}
.theme-button {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 12px;
background: transparent;
border: none;
border-radius: var(--fk-border-radius-base);
color: var(--fk-color-text-secondary);
font-size: var(--fk-font-size-sm);
cursor: pointer;
transition: var(--fk-transition-base);
}
.theme-button:hover {
background: var(--fk-color-primary);
color: #ffffff;
transform: translateY(-1px);
}
.theme-button.active {
background: var(--fk-color-primary);
color: #ffffff;
box-shadow: var(--fk-shadow-sm);
}
</style>🎨 品牌定制
企业品牌色彩
根据企业VI定制品牌色彩:
css
/* 企业品牌主题 */
:root {
/* 主品牌色 */
--brand-primary: #your-brand-color;
--brand-secondary: #your-secondary-color;
--brand-accent: #your-accent-color;
/* 应用到组件 */
--fk-color-primary: var(--brand-primary);
--fk-color-secondary: var(--brand-secondary);
/* 渐变效果 */
--fk-gradient-primary: linear-gradient(135deg, var(--brand-primary) 0%, var(--brand-secondary) 100%);
--fk-gradient-accent: linear-gradient(135deg, var(--brand-accent) 0%, var(--brand-primary) 100%);
}Logo和图标定制
css
/* Logo定制 */
.fk-logo {
--logo-height: 40px;
--logo-width: auto;
content: url('path/to/your/logo.svg');
}
/* 图标主题色 */
.fk-icon {
--icon-color: var(--fk-color-primary);
--icon-size: 16px;
}
.fk-icon--primary {
color: var(--fk-color-primary);
}
.fk-icon--secondary {
color: var(--fk-color-text-secondary);
}📱 移动端适配
触摸友好设计
css
/* 移动端触摸优化 */
@media (max-width: 768px) {
.fk-button {
--button-height: 44px; /* 符合触摸标准 */
--button-padding: 0 20px;
--button-font-size: 16px; /* 防止缩放 */
}
.fk-input {
--input-height: 44px;
--input-font-size: 16px;
}
.fk-table {
--table-font-size: 14px;
--table-cell-padding: 8px;
}
}
/* 触摸反馈 */
.fk-button:active {
transform: scale(0.98);
}
.fk-card:active {
transform: scale(0.99);
}🔍 调试工具
主题调试面板
vue
<template>
<div class="theme-debug-panel" v-if="showDebug">
<h3>主题调试面板</h3>
<div class="debug-section">
<h4>色彩系统</h4>
<div class="color-palette">
<div
v-for="color in colors"
:key="color.name"
class="color-item"
:style="{ backgroundColor: `var(${color.variable})` }"
>
<span class="color-name">{{ color.name }}</span>
<span class="color-value">{{ color.variable }}</span>
</div>
</div>
</div>
<div class="debug-section">
<h4>字体系统</h4>
<div class="font-samples">
<div
v-for="font in fonts"
:key="font.name"
class="font-item"
:style="{ fontSize: `var(${font.variable})` }"
>
{{ font.name }} - {{ font.variable }}
</div>
</div>
</div>
<div class="debug-section">
<h4>间距系统</h4>
<div class="spacing-samples">
<div
v-for="spacing in spacings"
:key="spacing.name"
class="spacing-item"
>
<div
class="spacing-box"
:style="{ width: `var(${spacing.variable})`, height: `var(${spacing.variable})` }"
></div>
<span>{{ spacing.name }}</span>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const showDebug = ref(false)
const colors = [
{ name: '主色', variable: '--fk-color-primary' },
{ name: '成功色', variable: '--fk-color-success' },
{ name: '警告色', variable: '--fk-color-warning' },
{ name: '危险色', variable: '--fk-color-danger' }
]
const fonts = [
{ name: '超小', variable: '--fk-font-size-xs' },
{ name: '小', variable: '--fk-font-size-sm' },
{ name: '基础', variable: '--fk-font-size-base' },
{ name: '大', variable: '--fk-font-size-lg' }
]
const spacings = [
{ name: 'XS', variable: '--fk-spacing-xs' },
{ name: 'SM', variable: '--fk-spacing-sm' },
{ name: 'MD', variable: '--fk-spacing-md' },
{ name: 'LG', variable: '--fk-spacing-lg' }
]
// 快捷键切换调试面板
document.addEventListener('keydown', (e) => {
if (e.ctrlKey && e.shiftKey && e.key === 'T') {
showDebug.value = !showDebug.value
}
})
</script>🚀 最佳实践
1. 渐进式定制
从基础变量开始,逐步深入定制:
css
/* 第一步:基础色彩 */
:root {
--fk-color-primary: #your-color;
}
/* 第二步:扩展色彩 */
:root {
--fk-color-primary-light: #lighter-color;
--fk-color-primary-dark: #darker-color;
}
/* 第三步:组件级定制 */
.fk-button--primary {
--button-bg: linear-gradient(135deg, var(--fk-color-primary), var(--fk-color-primary-dark));
}2. 保持一致性
使用设计令牌确保一致性:
css
/* 设计令牌 */
:root {
/* 间距令牌 */
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-5: 20px;
--space-6: 24px;
/* 应用令牌 */
--fk-spacing-xs: var(--space-1);
--fk-spacing-sm: var(--space-2);
--fk-spacing-md: var(--space-4);
--fk-spacing-lg: var(--space-6);
}3. 性能优化
避免过度使用CSS变量:
css
/* ❌ 不推荐:过度使用变量 */
.element {
color: var(--color-1);
background: var(--color-2);
border: var(--border-1);
margin: var(--margin-1);
padding: var(--padding-1);
}
/* ✅ 推荐:合理使用变量 */
.element {
color: var(--fk-color-primary);
background: #ffffff;
border: 1px solid var(--fk-color-border);
margin: 16px;
padding: 12px;
}📚 更多资源
通过这套完整的主题系统,您可以轻松打造出符合品牌特色的ERP界面。如果需要更多帮助,请查看我们的设计系统文档或联系我们的设计团队。