当前位置: 首页 > 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诊断全量测试用例清单系列:第十九节】
  • 成都世运会倒计时100天,中国代表团运动员规模将创新高
  • 比熬夜更伤肝的事,你可能每天都在做
  • 上海74岁老人宜春旅游时救起落水儿童,“小孩在挣扎容不得多想”
  • 保利发展去年净利润约50亿元,在手现金1342亿元
  • 最近这75年,谁建造了上海?
  • 国家发改委回应美加征关税:典型的单边主义霸凌做法