当前位置:   article > 正文

(详解)vue中实现主题切换的三种方式_vue主题切换方案

vue主题切换方案

目录

一、背景

二、实现思路 

方法1:定义全局的CSS变量

 方法2:切换已定义好的css文件

 方法3:切换顶级CSS类名 (需使用css处理器,如sass、less等)


一、背景

在我们开发中我们会遇到像是需要切换程序风格、主题切换啦这种应用场景。

参考大佬博客!!!

vue中实现 ‘换肤 / 切换样式主题’ 功能的三种方式详解(纯干huo)_vue换肤_Jason Ma丶丶前端工程师的博客-CSDN博客

vue中实现 ‘换肤 / 切换样式主题’ 功能的三种方式详解(纯干huo)_vue换肤_Jason Ma丶丶前端工程师的博客-CSDN博客 

二、实现思路 

方法1:定义全局的CSS变量

App.vue:

  1. <style>
  2. /* 定义全局的css变量 */
  3. :root {
  4. /* 背景色 */
  5. --theme_bg_color: red;
  6. /* 按钮颜色 */
  7. --theme_button_color: yellowgreen;
  8. }
  9. </style>

demo.vue(css):

  1. <style scoped>
  2. /* 使用全局的css变量设置颜色 */
  3. .myButton {
  4. background: var(--theme_bg_color);
  5. }
  6. .myDiv {
  7. background: var(--theme_button_color);
  8. width: 200px;
  9. height: 200px;
  10. }
  11. </style>

demo.vue(html):

  1. <h3>换肤 / 切换样式主题 方式1</h3>
  2. <button @click="changeTheme('Moccasin')">换肤为Moccasin</button>
  3. <button @click="changeTheme('#1E90FF')">换肤为#1E90FF</button>
  4. <button @click="changeTheme('#00FF7F')">换肤为#00FF7F</button>
  5. <button @click="changeTheme('DeepPink')">换肤为DeepPink</button>
  6. <button class="myButton">我是一个可以换肤的按钮</button>
  7. <div class="myDiv">我是一个可以换肤的div</div>

demo.vue(js):

  1. <script>
  2. export default {
  3. setup() {
  4. // 切换主题方式1:修改全局CSS变量
  5. let changeTheme = (color) => {
  6. document.documentElement.style.setProperty("--theme_bg_color", color);
  7. document.documentElement.style.setProperty("--theme_button_color", color);
  8. };
  9. return { changeTheme };
  10. },
  11. };
  12. </script>

效果:

 方法2:切换已定义好的css文件

Public/css/theme_1.css:

  1. .myButton2{
  2. background: Moccasin;
  3. }
  4. .myDiv2 {
  5. background: Moccasin;
  6. }

App.vue:

  1. <script>
  2. import { onMounted } from "vue";
  3. export default {
  4. name: "App",
  5. components: {},
  6. setup() {
  7. onMounted(() => {
  8. console.log("App.vue ---- onMounted");
  9. //方式2(创建link标签默认引入 ./css/theme_1.css 主题样式文件)
  10. let link = document.createElement("link");
  11. link.type = "text/css";
  12. link.id = "theme";
  13. link.rel = "stylesheet";
  14. link.href = "./css/theme_1.css";
  15. document.getElementsByTagName("head")[0].appendChild(link);
  16. });
  17. return {};
  18. },
  19. };
  20. </script>

 demo.vue(html):

  1. <h3>换肤 / 切换样式主题 方式2</h3>
  2. <button @click="changeTheme2(1)">换肤为Moccasin</button>
  3. <button @click="changeTheme2(2)">换肤为#1E90FF</button>
  4. <button @click="changeTheme2(3)">换肤为#00FF7F</button>
  5. <button @click="changeTheme2(4)">换肤为DeepPink</button>
  6. <button class="myButton2">我是一个可以换肤的按钮</button>
  7. <div class="myDiv2">我是一个可以换肤的div</div>

demo.vue(js):

  1. <script>
  2. export default {
  3. setup() {
  4. // 切换主题方式2:切换已定义好的css文件
  5. let changeTheme2 = (type) => {
  6. document.getElementById("theme").href = `./css/theme_${type}.css`;
  7. };
  8. return { changeTheme2 };
  9. },
  10. };
  11. </script>

效果:

 方法3:切换顶级CSS类名 (需使用css处理器,如sass、less等)

src/assets/css/theme.less:

  1. /* 预设四种主题 */
  2. .theme_1 {
  3. .myButton3 {
  4. background: #00ff7f;
  5. }
  6. .myDiv3 {
  7. background: #00ff7f;
  8. }
  9. }
  10. .theme_2 {
  11. .myButton3 {
  12. background: #00ff7f;
  13. }
  14. .myDiv3 {
  15. background: #00ff7f;
  16. }
  17. }
  18. .theme_3 {
  19. .myButton3 {
  20. background: #00ff7f;
  21. }
  22. .myDiv3 {
  23. background: #00ff7f;
  24. }
  25. }
  26. .theme_4 {
  27. .myButton3 {
  28. background: #00ff7f;
  29. }
  30. .myDiv3 {
  31. background: #00ff7f;
  32. }
  33. }

 main.js:

  1. // 方式3:需要先引入全局主题样式文件
  2. import "./assets/css/theme.less";

App.vue:

  1. <script>
  2. import { onMounted } from "vue";
  3. export default {
  4. name: "App",
  5. components: {},
  6. setup() {
  7. onMounted(() => {
  8. console.log("App.vue ---- onMounted");
  9. //方式3(设置顶层div的class类名)
  10. document.getElementById("app").setAttribute("class", "theme_1");
  11. });
  12. return {};
  13. },
  14. };
  15. </script>

demo.vue(html):

  1. <h3>换肤 / 切换样式主题 方式3</h3>
  2. <button @click="changeTheme3(1)">换肤为Moccasin</button>
  3. <button @click="changeTheme3(2)">换肤为#1E90FF</button>
  4. <button @click="changeTheme3(3)">换肤为#00FF7F</button>
  5. <button @click="changeTheme3(4)">换肤为DeepPink</button>
  6. <button class="myButton3">我是一个可以换肤的按钮</button>
  7. <div class="myDiv3">我是一个可以换肤的div</div>

demo.vue(js):

  1. <script>
  2. export default {
  3. setup() {
  4. // 切换主题方式3:切换顶级CSS类名 (需使用处理器)
  5. let changeTheme3 = (type) => {
  6. document.getElementById("app").setAttribute("class", `theme_${type}`);
  7. };
  8. return { changeTheme3 };
  9. },
  10. };
  11. </script>

效果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/82084
推荐阅读
相关标签
  

闽ICP备14008679号