当前位置:   article > 正文

深色模式(Vue)_黑vue

黑vue

template中Switch触发深色模式

  <i-switch v-model="on_off" @on-change="changeColor" />
  1. //初始化on_off
  2. on_off: false
  3. //调用changColor方法
  4. methods: {
  5. //status是该方法默认返回的参数,当关闭状态时为false,打开状态为true
  6. changeColor(status) {
  7. const theme_name = status ? 'dark' : 'light';
  8. //调用了应用主题方法
  9. this.applyTheme(theme_name);
  10. localStorage.setItem('theme', theme_name);
  11. },
  12. }

2.在main.js中注册applyTheme方法

  1. // 主题、字号、api
  2. import applyTheme, { getCurrentTheme } from './support/themes/theme';
  3. window.applyTheme = applyTheme;
  4. Vue.prototype.applyTheme = applyTheme;

 3.在App.vue中挂载

  1. mounted() {
  2. // 使用默认主题
  3. // this.applyTheme();
  4. // 使用默认字号大小
  5. // this.changeFontSize('62.5%');
  6. let theme = localStorage.getItem('theme');
  7. if (theme) {
  8. this.applyTheme(theme);
  9. } else {
  10. this.applyTheme('light');
  11. }
  12. let fontSize = localStorage.getItem('fontSize');
  13. if (fontSize) {
  14. this.changeFontSize(fontSize);
  15. } else {
  16. this.changeFontSize('62.5%');
  17. }
  18. }

并引入style样式

  1. <style src="./support/themes/theme-light.less" lang="less"></style>
  2. <style src="./support/themes/theme-dark.less" lang="less"></style>
  3. <style src="./support/font-mode/font-size-style.less" lang="less"></style>

4. 在App.vue的同级目录下定义样式

5. 在theme.js中定义theme_map,applyTheme方法,getCurrentTheme方法并导出applyTheme

  1. const theme_map = {
  2. light: {
  3. name: '亮色模式',
  4. content: 'light',
  5. klass: 'theme-light',
  6. is_active: false
  7. },
  8. dark: {
  9. name: '暗色模式',
  10. content: 'dark',
  11. klass: 'theme-dark',
  12. is_active: false
  13. }
  14. };
  15. //获取主题方法并导出
  16. export function getCurrentTheme() {
  17. const theme_list = Object.values(theme_map);
  18. const theme_data = theme_list.filter(item => item.is_active === true);
  19. return theme_data[0];
  20. }
  21. export default applyTheme;
  22. //书写应用主题方法
  23. function applyTheme(theme_name = 'light') {
  24. if (theme_name in theme_map) {
  25. const appElement = document.getElementById('app');
  26. // 获取已有的样式类
  27. const klass_content = appElement.getAttribute('class');
  28. // 获取此次要设置的主题数据
  29. const theme_data = theme_map[theme_name];
  30. const klass_name = theme_data.klass;
  31. if (klass_content == null) {
  32. // 如果未设置样式,直接加上主题样式
  33. appElement.setAttribute('class', klass_name);
  34. } else {
  35. // 已经设置样式
  36. const klass_list = klass_content.split(' ');
  37. const arr = [];
  38. // 遍历已有的样式,移除和主题有关的样式类
  39. klass_list.forEach(item => {
  40. if (item) {
  41. if (item.indexOf('theme-') === 0) {
  42. // 已有的主题类需要移除
  43. const pre_active_theme_name = item.replace('theme-', '');
  44. const pre_active_theme_data = theme_map[pre_active_theme_name];
  45. pre_active_theme_data.is_active = false;
  46. } else {
  47. arr.push(item);
  48. }
  49. }
  50. });
  51. // 添加新的主题样式类
  52. arr.push(klass_name);
  53. theme_data.is_active = true;
  54. const klass_value = arr.join(' ');
  55. // 设置class属性
  56. appElement.setAttribute('class', klass_value);
  57. }
  58. } else {
  59. }
  60. }

6.在theme-dark.less,theme-dark.css,theme-light.css,theme-light.less书写样式

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

闽ICP备14008679号