You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular Ionic PWA实现浅色/深色/自动三种主题模式切换求助

Ionic PWA 外观模式切换失效解决方案

1. 补全全局深色模式样式

默认初始化的Ionic项目未自动绑定body.dark类对应的深色主题变量,需要在src/theme/variables.scss或src/global.scss中添加如下样式:

body.dark {
  --ion-background-color: #121212;
  --ion-background-color-rgb: 18,18,18;

  --ion-text-color: #ffffff;
  --ion-text-color-rgb: 255,255,255;

  --ion-border-color: #222222;

  --ion-color-step-50: #1e1e1e;
  --ion-color-step-100: #2a2a2a;
  --ion-color-step-150: #363636;
  --ion-color-step-200: #414141;
  --ion-color-step-250: #4d4d4d;
  --ion-color-step-300: #595959;
  --ion-color-step-350: #656565;
  --ion-color-step-400: #717171;
  --ion-color-step-450: #7d7d7d;
  --ion-color-step-500: #898989;
  --ion-color-step-550: #949494;
  --ion-color-step-600: #a0a0a0;
  --ion-color-step-650: #acacac;
  --ion-color-step-700: #b8b8b8;
  --ion-color-step-750: #c4c4c4;
  --ion-color-step-800: #d0d0d0;
  --ion-color-step-850: #dbdbdb;
  --ion-color-step-900: #e7e7e7;
  --ion-color-step-950: #f3f3f3;

  --ion-toolbar-background: #1e1e1e;
  --ion-item-background: #1e1e1e;
  --ion-card-background: #1e1e1e;
}

2. 修正模式切换逻辑

原有代码存在两个问题:

  • setMode方法固定添加dark类,没有根据选择的Light|Dark|Auto模式做判断
  • 系统主题变化监听、初始化读取存储值后没有触发样式更新
    修正后的TS代码如下:
mode = 'auto';
prefersDark = window.matchMedia('(prefers-color-scheme: dark)');

constructor() {
  // 系统主题变化时,仅在Auto模式下更新样式
  this.prefersDark.addEventListener('change', (e) => {
    if (this.mode === 'auto') {
      document.body.classList.toggle('dark', e.matches);
    }
  });
}

ngOnInit() {
  // 页面初始化时读取存储的模式并应用
  this.checkAwake();
}

setMode = async (): Promise<void> => {
  const storeMode = this.mode;
  await Storage.set({
    key: 'keep',
    value: storeMode
  });
  this.applyMode();
};

checkAwake = async (): Promise<void> => {
  const { value } = await Storage.get({ key: 'keep' });
  if (value) {
    this.mode = value;
  }
  this.applyMode();
};

// 抽离模式应用公共方法
private applyMode = () => {
  let shouldAddDark = false;
  switch(this.mode) {
    case 'dark':
      shouldAddDark = true;
      break;
    case 'light':
      shouldAddDark = false;
      break;
    case 'auto':
      shouldAddDark = this.prefersDark.matches;
      break;
  }
  document.body.classList.toggle('dark', shouldAddDark);
};

3. 切换控件绑定

将切换控件的选中值双向绑定到mode变量,选择变更时触发setMode方法即可实现三种模式的正常切换。

内容的提问来源于stack exchange,提问作者Duncan Law

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:21:01