当前位置: 首页 > news >正文

Vue 实现主题切换(明暗)

项目地址:https://gitee.com/abcdfdewrw/vue3_xiaohongshu_project

效果展示:
在这里插入图片描述

步骤1:定义明暗scss样式

// 浅色模式
html[data-theme="light"]:root {
  --header-height: 72px;
  --color-border-bottom: #eef2f9;
  --color-primary-label: #333;
  --color-secondary-label: rgba(51, 51, 51, 0.8);
  --color-tertiary-label: rgba(51, 51, 51, 0.6);
  --color-quaternary-label: rgba(51, 51, 51, 0.3);
  --color-link: #13386c;
  --color-inverted-label: #fff;
  --color-background: #fff;
  --color-active-background: rgba(0, 0, 0, 0.03);
  --color-border: rgba(0, 0, 0, 0.08);
  --color-shadow-border: rgba(0, 0, 0, 0.02);
  --elevation-low-background: #fff;
  --elevation-high-background: #fff;
  --elevation-note-background: #fff;
  --elevation-low-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.04),
    0 1px 2px 0 rgba(0, 0, 0, 0.02);
  --elevation-high-shadow: 0 4px 32px 0 rgba(0, 0, 0, 0.08),
    0 1px 4px 0 rgba(0, 0, 0, 0.04);
  --elevation-note-shadow: 0 8px 64px 0 rgba(0, 0, 0, 0.04),
    0 1px 4px 0 rgba(0, 0, 0, 0.02);
  --elevation-low-shadow-filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.04))
    drop-shadow(0 1px 2px rgba(0, 0, 0, 0.02));
  --elevation-high-shadow-filter: drop-shadow(0 4px 32px rgba(0, 0, 0, 0.08))
    drop-shadow(0 1px 4px rgba(0, 0, 0, 0.04));
  --material-filter: saturate(150%) blur(10px);
  --material-background: rgba(64, 64, 64, 0.25);
  --material-inverted-background: rgba(51, 51, 51, 0.9);
  --mask-backdrop: rgba(0, 0, 0, 0.25);
  --mask-note-card: rgba(0, 0, 0, 0.25);
  --mask-paper: rgba(255, 255, 255, 0.98);
  --color-white: #fff;
  --color-red: #ff2442;
  --color-tinted-red: rgba(255, 36, 66, 0.06);
  --color-blue: #3d8af5;
  --color-tinted-blue: rgba(61, 138, 245, 0.1);
  --mask-video-player-mask: linear-gradient(
    180deg,
    rgba(0, 0, 0, 0.25) 0%,
    rgba(0, 0, 0, 0) 24.48%,
    rgba(0, 0, 0, 0) 50%,
    rgba(0, 0, 0, 0.75) 100%
  );
  --search-hotspot-hint: linear-gradient(90deg, #ff2543 0%, #ff5225 100%);
  --color-vertical-channel: #fff9d5;
}

// 深色模式
html[data-theme="dark"]:root {
  --header-height: 72px;
  --color-primary-label: #fff;
  --color-secondary-label: rgba(255, 255, 255, 0.8);
  --color-tertiary-label: rgba(255, 255, 255, 0.6);
  --color-quaternary-label: rgba(255, 255, 255, 0.3);
  --color-link: #c7daef;
  --color-inverted-label: #0a0a0a;
  --color-background: #0a0a0a;
  --color-active-background: rgba(255, 255, 255, 0.04);
  --color-border: rgba(255, 255, 255, 0.08);
  --color-shadow-border: rgba(255, 255, 255, 0.02);
  --elevation-low-background: #121212;
  --elevation-high-background: #181818;
  --elevation-note-background: #121212;
  --elevation-low-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.04),
    0 1px 2px 0 rgba(0, 0, 0, 0.02), 0 0 0 1px rgba(255, 255, 255, 0.04) inset;
  --elevation-high-shadow: 0 4px 32px 0 rgba(0, 0, 0, 0.08),
    0 1px 4px 0 rgba(0, 0, 0, 0.04), 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
  --elevation-note-shadow: 0 8px 64px 0 rgba(0, 0, 0, 0.04),
    0 1px 4px 0 rgba(0, 0, 0, 0.02);
  --elevation-low-shadow-filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.04))
    drop-shadow(0 1px 2px rgba(0, 0, 0, 0.02))
    drop-shadow(0 0 1px rgba(255, 255, 255, 0.04));
  --elevation-high-shadow-filter: drop-shadow(0 4px 32px rgba(0, 0, 0, 0.08))
    drop-shadow(0 1px 4px rgba(0, 0, 0, 0.04))
    drop-shadow(0 0 1px rgba(255, 255, 255, 0.06));
  --material-filter: saturate(150%) blur(10px);
  --material-background: rgba(64, 64, 64, 0.25);
  --material-inverted-background: rgba(255, 255, 255, 0.9);
  --mask-backdrop: rgba(0, 0, 0, 0.5);
  --mask-note-card: rgba(0, 0, 0, 0.25);
  --mask-paper: rgba(10, 10, 10, 0.98);
  --color-white: #fff;
  --color-red: #ff2e4d;
  --color-tinted-red: rgba(255, 46, 77, 0.06);
  --color-blue: #3d8af5;
  --color-tinted-blue: rgba(61, 138, 245, 0.1);
  --mask-video-player-mask: linear-gradient(
    180deg,
    rgba(0, 0, 0, 0.25) 0%,
    rgba(0, 0, 0, 0) 24.48%,
    rgba(0, 0, 0, 0) 50%,
    rgba(0, 0, 0, 0.75) 100%
  );
  --search-hotspot-hint: linear-gradient(90deg, #ff2543 0%, #ff5225 100%);
  --color-vertical-channel: #181714;
}

所有页面就需要使用你定义的这些scss变量
在这里插入图片描述

步骤2:切换主题调用方法

// 主要代码
export const useTheme = (model = "light") => {
  window.document.documentElement.setAttribute("data-theme", model);
};

相关文章:

  • 解密DNSlog
  • FTP服务
  • 「软件设计模式」单例模式(Singleton)
  • Python的那些事第二十三篇:Express(Node.js)与 Python:一场跨语言的浪漫邂逅
  • MySQL DELETE 语句
  • 数据结构6-二叉树、时间复杂度
  • C# 使用FreeSpire.doc 生成带有页码的目录
  • 力扣 438.找到字符串中所有字母异位词
  • osgearth视点坐标及鼠标交点坐标的信息显示(七)
  • 仿叮咚买菜鸿蒙原生APP
  • rabbitmq五种模式的实现——springboot
  • 线性代数中的正交和标准正交向量
  • 数据结构:顺序表
  • flutter 专题四十八 Google发布Flutter 2.0正式版,支持全平台程序构建
  • 如何在不依赖函数调用功能的情况下结合工具与大型语言模型
  • ranges::set_intersection set_union set_difference set_symmetric_difference
  • ollama本地部署 deepseek离线模型安装 一套从安装到UI运行
  • 【系列专栏】银行IT的云原生架构-存储架构-数据库部署 10
  • python+halcon 解读labelme标注生成marksimage
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十九节】
  • 抖音开展“AI起号”专项治理,整治利用AI生成低俗猎奇视频等
  • 巴基斯坦副总理兼外长达尔将访华
  • 央媒:设施老化、应急预案套模板,养老机构消防隐患亟待排查
  • 人民日报评论员观察:稳就业,抓好存量、增量、质量
  • 水果预包装带来的环境成本谁来分担?
  • 北方首场高温将进入鼎盛阶段,江南华南多地需警惕降雨叠加致灾