利用var()实现主题切换

const themeColor = {
  "text-color": {
    "light": '#fff',
    "dark": '#000'
  },
  "text-bgc": {
    "light": 'white',
    "dark": 'black'
  }
};

function setTheme(theme) {
  const root = document.documentElement;
  
  for (const key in theme) {
    root.style.setProperty(`--${key}`, theme[key]);
  }
}

// 初始设置为 light 主题
setTheme(themeColor["text-color"]["light"]);

// 切换主题
function toggleTheme() {
  const currentTheme = getComputedStyle(document.documentElement).getPropertyValue('--text-color');  const newTheme = currentTheme === themeColor["text-color"]["light"] ? themeColor["text-color"]["dark"] : themeColor["text-color"]["light"];
  setTheme(newTheme);
}

<template>
  <div>
    <h1 :style="{ color: themeColor['text-color'][currentTheme] }">Hello, World!</h1>
    <button @click="toggleTheme">切换主题</button>
  </div>
</template>

<script>
import { reactive, watch } from 'vue';

export default {
  setup() {
    // 定义主题样式对象
    const themeColor = reactive({
      "text-color": {
        "light": 'white',
        "dark": 'black'
      },
    });

    // 当前主题状态变量
    const currentTheme = reactive({
      value: 'light'
    });

    // 切换主题的函数
    const toggleTheme = () => {
      currentTheme.value = currentTheme.value === 'light' ? 'dark' : 'light';
    };

    // 监听当前主题变化,重新应用样式
    watch(currentTheme, () => {
      // 执行主题切换后的操作,比如更新全局样式等
    });

    return {
      themeColor,
      currentTheme,
      toggleTheme,
    };
  },
};
</script>
在Vue 3中,您可以使用reactive函数和watch API来实现页面主题切换。下面是一个使用Vue 3语法的示例:

<template>
  <div>
    <h1 :style="{ color: themeColor['text-color'][currentTheme] }">Hello, World!</h1>
    <button @click="toggleTheme">切换主题</button>
  </div>
</template>

<script>
import { reactive, watch } from 'vue';

export default {
  setup() {
    // 定义主题样式对象
    const themeColor = reactive({
      "text-color": {
        "light": 'white',
        "dark": 'black'
      },
    });

    // 当前主题状态变量
    const currentTheme = reactive({
      value: 'light'
    });

    // 监听当前主题变化,重新应用样式
    watch(currentTheme, () => {
      applyTheme();
    });

    // 切换主题的函数
    const toggleTheme = () => {
      currentTheme.value = currentTheme.value === 'light' ? 'dark' : 'light';
    };

    // 应用主题样式
    const applyTheme = () => {
      document.documentElement.style.setProperty('--text-color', themeColor['text-color'][currentTheme.value]);
    };

    // 初始化应用主题
    applyTheme();

    return {
      themeColor,
      currentTheme,
      toggleTheme,
    };
  },
};
</script>

<style>
  :root {
    --text-color: white;
  }

  h1 {
    color: var(--text-color);
  }
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记忆怪 bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值