Ionic CSS变量系统 #

一、CSS变量概述 #

1.1 什么是CSS变量 #

Ionic使用CSS自定义属性(CSS Variables)来实现主题定制。这种方式具有以下优势:

优势 说明
动态更新 运行时可以动态修改
作用域控制 可以在任意层级定义
继承性 子元素自动继承父元素变量
兼容性 现代浏览器广泛支持

1.2 变量命名规范 #

scss
// Ionic变量命名规范
--ion-{property}-{variant}

// 示例
--ion-color-primary
--ion-background-color
--ion-toolbar-background

二、颜色变量 #

2.1 预设颜色 #

Ionic提供9种预设颜色:

scss
// src/theme/variables.scss
:root {
  --ion-color-primary: #3880ff;
  --ion-color-secondary: #5260ff;
  --ion-color-tertiary: #6a64ff;
  --ion-color-success: #2dd36f;
  --ion-color-warning: #ffc409;
  --ion-color-danger: #eb445a;
  --ion-color-dark: #222428;
  --ion-color-medium: #92949c;
  --ion-color-light: #f4f5f8;
}

2.2 颜色使用 #

html
<!-- 按钮颜色 -->
<ion-button color="primary">Primary</ion-button>
<ion-button color="secondary">Secondary</ion-button>
<ion-button color="danger">Danger</ion-button>

<!-- 文本颜色 -->
<p class="ion-color-primary">Primary文本</p>
<p class="ion-color-danger">Danger文本</p>

<!-- 背景颜色 -->
<div class="ion-background-primary">Primary背景</div>

2.3 自定义颜色 #

scss
// 添加新颜色
:root {
  --ion-color-favorite: #69bb7b;
  --ion-color-favorite-rgb: 105, 187, 123;
  --ion-color-favorite-contrast: #ffffff;
  --ion-color-favorite-contrast-rgb: 255, 255, 255;
  --ion-color-favorite-shade: #5ca56c;
  --ion-color-favorite-tint: #78c288;
}

.ion-color-favorite {
  --ion-color-base: var(--ion-color-favorite);
  --ion-color-base-rgb: var(--ion-color-favorite-rgb);
  --ion-color-contrast: var(--ion-color-favorite-contrast);
  --ion-color-contrast-rgb: var(--ion-color-favorite-contrast-rgb);
  --ion-color-shade: var(--ion-color-favorite-shade);
  --ion-color-tint: var(--ion-color-favorite-tint);
}
html
<!-- 使用自定义颜色 -->
<ion-button color="favorite">收藏</ion-button>

2.4 颜色变体 #

scss
// 颜色变体
:root {
  // Primary颜色
  --ion-color-primary: #3880ff;
  --ion-color-primary-rgb: 56, 128, 255;
  --ion-color-primary-contrast: #ffffff;
  --ion-color-primary-contrast-rgb: 255, 255, 255;
  --ion-color-primary-shade: #3171e0;
  --ion-color-primary-tint: #4c8dff;
}

三、全局变量 #

3.1 背景与文本 #

scss
:root {
  // 背景色
  --ion-background-color: #ffffff;
  --ion-background-color-rgb: 255, 255, 255;
  
  // 文本色
  --ion-text-color: #000000;
  --ion-text-color-rgb: 0, 0, 0;
  
  // 工具栏背景
  --ion-toolbar-background: #3880ff;
  
  // 工具栏文本
  --ion-toolbar-color: #ffffff;
  
  // 标签栏背景
  --ion-tab-bar-background: #ffffff;
  
  // 标签栏文本
  --ion-tab-bar-color: #92949c;
  --ion-tab-bar-color-selected: #3880ff;
}

3.2 字体设置 #

scss
:root {
  // 字体族
  --ion-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Roboto', sans-serif;
  
  // 字体大小
  --ion-font-size-xs: 10px;
  --ion-font-size-sm: 12px;
  --ion-font-size-md: 14px;
  --ion-font-size-lg: 16px;
  --ion-font-size-xl: 20px;
}

3.3 间距变量 #

scss
:root {
  // 内边距
  --ion-padding: 16px;
  --ion-padding-top: 16px;
  --ion-padding-bottom: 16px;
  --ion-padding-start: 16px;
  --ion-padding-end: 16px;
  
  // 外边距
  --ion-margin: 16px;
  --ion-margin-top: 16px;
  --ion-margin-bottom: 16px;
  --ion-margin-start: 16px;
  --ion-margin-end: 16px;
}

四、组件变量 #

4.1 按钮变量 #

scss
ion-button {
  // 背景
  --background: #3880ff;
  --background-hover: #4285f4;
  --background-activated: #3367d6;
  --background-focused: #2962ff;
  
  // 文本
  --color: #ffffff;
  --color-hover: #ffffff;
  --color-activated: #ffffff;
  --color-focused: #ffffff;
  
  // 边框
  --border-radius: 4px;
  --border-width: 1px;
  --border-style: solid;
  --border-color: transparent;
  
  // 阴影
  --box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
  
  // 内边距
  --padding-top: 10px;
  --padding-bottom: 10px;
  --padding-start: 16px;
  --padding-end: 16px;
}

4.2 卡片变量 #

scss
ion-card {
  --background: #ffffff;
  --color: #000000;
  margin: 16px;
  border-radius: 8px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}

ion-card-header {
  --color: #333333;
  padding: 16px;
}

ion-card-title {
  --color: #000000;
  font-size: 18px;
  font-weight: bold;
}

ion-card-subtitle {
  --color: #999999;
  font-size: 14px;
}

4.3 输入框变量 #

scss
ion-item {
  --background: transparent;
  --background-hover: #f5f5f5;
  --background-focused: #f5f5f5;
  --border-color: #e0e0e0;
  --highlight-color-focused: #3880ff;
  --highlight-height: 2px;
}

ion-input, ion-textarea {
  --background: transparent;
  --color: #000000;
  --placeholder-color: #999999;
  --placeholder-opacity: 0.5;
  --padding-start: 12px;
  --padding-end: 12px;
}

4.4 列表变量 #

scss
ion-list {
  --background: transparent;
}

ion-item {
  --background: transparent;
  --background-hover: #f5f5f5;
  --background-activated: #eeeeee;
  --border-color: #e0e0e0;
  --inner-border-width: 0 0 1px 0;
  --padding-start: 16px;
  --padding-end: 16px;
  --min-height: 48px;
}

4.5 工具栏变量 #

scss
ion-toolbar {
  --background: #3880ff;
  --color: #ffffff;
  --border-color: transparent;
  --border-width: 0;
  --min-height: 56px;
}

ion-title {
  --color: #ffffff;
  font-size: 18px;
  font-weight: bold;
}

五、平台变量 #

5.1 iOS样式 #

scss
.ios {
  // iOS特定样式
  ion-toolbar {
    --min-height: 44px;
  }
  
  ion-button {
    --border-radius: 10px;
    --padding-top: 12px;
    --padding-bottom: 12px;
  }
  
  ion-item {
    --padding-start: 16px;
  }
}

5.2 Android样式 #

scss
.md {
  // Android特定样式
  ion-toolbar {
    --min-height: 56px;
  }
  
  ion-button {
    --border-radius: 4px;
    --padding-top: 10px;
    --padding-bottom: 10px;
  }
  
  ion-item {
    --padding-start: 16px;
  }
}

六、暗黑模式 #

6.1 自动暗黑模式 #

scss
// 自动跟随系统
@media (prefers-color-scheme: dark) {
  :root {
    --ion-background-color: #1a1a1a;
    --ion-background-color-rgb: 26, 26, 26;
    
    --ion-text-color: #ffffff;
    --ion-text-color-rgb: 255, 255, 255;
    
    --ion-border-color: #333333;
    
    --ion-item-background: #1e1e1e;
    
    --ion-toolbar-background: #1f1f1f;
    
    --ion-tab-bar-background: #1f1f1f;
  }
}

6.2 手动暗黑模式 #

scss
// 定义暗黑模式类
.dark {
  --ion-background-color: #1a1a1a;
  --ion-background-color-rgb: 26, 26, 26;
  
  --ion-text-color: #ffffff;
  --ion-text-color-rgb: 255, 255, 255;
  
  --ion-border-color: #333333;
  
  --ion-item-background: #1e1e1e;
  
  --ion-toolbar-background: #1f1f1f;
  
  --ion-tab-bar-background: #1f1f1f;
  
  // 调整颜色
  --ion-color-primary: #428cff;
  --ion-color-primary-rgb: 66, 140, 255;
}
typescript
// 切换暗黑模式
import { Component } from '@angular/core';

@Component({
  selector: 'app-settings',
  templateUrl: 'settings.page.html'
})
export class SettingsPage {
  darkMode = false;
  
  toggleDarkMode() {
    this.darkMode = !this.darkMode;
    document.body.classList.toggle('dark', this.darkMode);
  }
}

6.3 暗黑模式颜色调整 #

scss
@media (prefers-color-scheme: dark) {
  :root {
    // 调整预设颜色以适应暗黑背景
    --ion-color-primary: #428cff;
    --ion-color-secondary: #50c8ff;
    --ion-color-tertiary: #6a64ff;
    --ion-color-success: #2fdf75;
    --ion-color-warning: #ffd534;
    --ion-color-danger: #ff4961;
    --ion-color-dark: #f4f5f8;
    --ion-color-medium: #989aa2;
    --ion-color-light: #222428;
  }
}

七、安全区域 #

7.1 安全区域变量 #

scss
:root {
  --ion-safe-area-top: env(safe-area-inset-top);
  --ion-safe-area-bottom: env(safe-area-inset-bottom);
  --ion-safe-area-left: env(safe-area-inset-left);
  --ion-safe-area-right: env(safe-area-inset-right);
}

7.2 应用安全区域 #

scss
// 工具栏
ion-toolbar {
  padding-top: var(--ion-safe-area-top);
}

// 标签栏
ion-tab-bar {
  padding-bottom: var(--ion-safe-area-bottom);
}

// 内容区域
ion-content {
  --padding-bottom: var(--ion-safe-area-bottom);
}

八、动态修改变量 #

8.1 JavaScript修改 #

typescript
// 修改CSS变量
setProperty(propertyName: string, value: string) {
  document.documentElement.style.setProperty(propertyName, value);
}

// 使用示例
this.setProperty('--ion-color-primary', '#ff0000');
this.setProperty('--ion-background-color', '#f5f5f5');

8.2 主题切换 #

typescript
// 主题服务
import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class ThemeService {
  private themes = {
    default: {
      '--ion-color-primary': '#3880ff',
      '--ion-background-color': '#ffffff',
      '--ion-text-color': '#000000'
    },
    dark: {
      '--ion-color-primary': '#428cff',
      '--ion-background-color': '#1a1a1a',
      '--ion-text-color': '#ffffff'
    },
    custom: {
      '--ion-color-primary': '#10dc60',
      '--ion-background-color': '#f4f5f8',
      '--ion-text-color': '#333333'
    }
  };
  
  setTheme(themeName: string) {
    const theme = this.themes[themeName as keyof typeof this.themes];
    if (theme) {
      Object.keys(theme).forEach(key => {
        document.documentElement.style.setProperty(key, theme[key as keyof typeof theme]);
      });
    }
  }
}

九、最佳实践 #

9.1 变量组织 #

scss
// variables.scss

// 颜色系统
:root {
  // 品牌颜色
  --color-brand-primary: #3880ff;
  --color-brand-secondary: #5260ff;
  
  // 语义颜色
  --color-success: #2dd36f;
  --color-warning: #ffc409;
  --color-danger: #eb445a;
  
  // 中性颜色
  --color-text-primary: #000000;
  --color-text-secondary: #666666;
  --color-text-disabled: #999999;
  
  // 背景颜色
  --color-background: #ffffff;
  --color-background-secondary: #f5f5f5;
  
  // 边框颜色
  --color-border: #e0e0e0;
  --color-border-light: #f0f0f0;
}

// 映射到Ionic变量
:root {
  --ion-color-primary: var(--color-brand-primary);
  --ion-background-color: var(--color-background);
  --ion-text-color: var(--color-text-primary);
}

9.2 响应式变量 #

scss
// 不同屏幕尺寸使用不同变量
:root {
  --font-size-base: 14px;
}

@media (min-width: 768px) {
  :root {
    --font-size-base: 16px;
  }
}

@media (min-width: 1024px) {
  :root {
    --font-size-base: 18px;
  }
}

9.3 组件封装 #

scss
// 自定义组件变量
my-custom-component {
  --background: var(--ion-background-color);
  --color: var(--ion-text-color);
  --border-radius: 8px;
  --padding: 16px;
  
  display: block;
  background: var(--background);
  color: var(--color);
  border-radius: var(--border-radius);
  padding: var(--padding);
}

十、总结 #

10.1 变量分类 #

类型 示例 用途
颜色变量 –ion-color-primary 定义应用颜色
全局变量 –ion-background-color 全局样式设置
组件变量 –background 组件样式定制
平台变量 .ios / .md 平台特定样式
安全区域 –ion-safe-area-top 适配刘海屏

10.2 下一步 #

掌握了CSS变量系统后,接下来让我们学习 主题定制,深入了解Ionic的主题配置!

最后更新:2026-03-28