uni-app x 项目开发时主题切换,如何统一切换字体颜色和button背景色等样式,并与系统暗夜模式同时渲染?求良策,详细聊一聊

发布于 1周前 作者 songsunli 来自 Uni-App

uni-app x 项目开发时主题切换,如何统一切换字体颜色和button背景色等样式,并与系统暗夜模式同时渲染?求良策,详细聊一聊

兄弟大佬们,小弟最近在用uniapp x 项目开发,遇到一个问题,就是主题切换时,怎么给字体颜色和button背景色等样式做统一切换,能和系统的暗夜模式同时渲染,谁有好的良策,详细聊一聊,最后能便于长期维护的方案,类似与起点APP那种,感谢!

信息类型 信息
开发工具 uniapp x
7 回复

我这边做过类似,有兴趣的话可以加q:1156854311一起讨论


买组件,很多组件支持主题 或 https://doc.dcloud.net.cn/uni-app-x/api/theme-change.html#onappthemechange
官方给出的,已经能够实现

就是用了官方的,才想着要渲染字体等样式

定义两个对象light/dark,里面放各种颜色值,然后动态绑定style样式呗 const dark={
bgColor:"#333"
}
const light={
bgColor:"#fff"
}
if(暗黑模式){
theme=dark
} <view :style={background:theme.bgColor}></view>

可不可以做成俩个css文件,根据theme值进行适配

在uni-app项目中实现主题切换,并统一切换字体颜色和button背景色等样式,同时与系统暗夜模式同步渲染,可以通过以下方法实现。以下是一个具体的实现思路和代码案例。

1. 使用CSS变量和JavaScript监听系统主题变化

首先,在全局样式文件(如App.vue<style>部分)中定义CSS变量:

:root {
  --font-color: #000;
  --button-bg-color: #fff;
}

@media (prefers-color-scheme: dark) {
  :root {
    --font-color: #fff;
    --button-bg-color: #000;
  }
}

2. 在组件中使用CSS变量

接下来,在你的组件(如Home.vue)中使用这些CSS变量:

<template>
  <view class="container">
    <text class="title">Hello, uni-app!</text>
    <button class="theme-button">Click Me</button>
  </view>
</template>

<style scoped>
.container {
  padding: 20px;
}

.title {
  color: var(--font-color);
}

.theme-button {
  background-color: var(--button-bg-color);
  color: var(--font-color);
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
}
</style>

3. 监听系统主题变化并更新CSS变量

App.vue的JavaScript部分,添加监听系统主题变化的逻辑:

export default {
  onLaunch() {
    const updateTheme = () => {
      const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
      if (isDarkMode) {
        document.documentElement.style.setProperty('--font-color', '#fff');
        document.documentElement.style.setProperty('--button-bg-color', '#000');
      } else {
        document.documentElement.style.setProperty('--font-color', '#000');
        document.documentElement.style.setProperty('--button-bg-color', '#fff');
      }
    };

    // Initial theme update
    updateTheme();

    // Listen for theme changes
    window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', updateTheme);
  },
};

4. 手动切换主题

为了手动切换主题,你可以在应用中添加一个主题切换按钮,并更新CSS变量:

methods: {
  toggleTheme() {
    const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
    if (isDarkMode) {
      document.documentElement.style.setProperty('--font-color', '#000');
      document.documentElement.style.setProperty('--button-bg-color', '#fff');
    } else {
      document.documentElement.style.setProperty('--font-color', '#fff');
      document.documentElement.style.setProperty('--button-bg-color', '#000');
    }
  },
},

在模板中添加一个按钮来调用这个方法:

<button @click="toggleTheme">Toggle Theme</button>

通过上述方法,你可以实现uni-app项目中主题切换,统一切换字体颜色和button背景色等样式,并与系统暗夜模式同步渲染。

回到顶部