切换主题 | 切换白天和夜晚模式

简介: 夜晚浏览网页太亮,试试夜晚模式吧,此以 vue3 为例

image.png

夜晚浏览网页太亮,试试夜晚模式吧,此以 vue3 为例

本项目自定义了两种模式,即白天模式和夜晚模式,当然可以添加更多的模式。

image.png

1.新建一个 base.scss 文件,里面写上需要的主题颜色。

// 主题
$themes: (
  // 白天模式
  light:
    (
      bgColor: #ebeaea,
      textColor: #121212,
      cardBgColor: #ffffff,
    ),
  // 夜间模式
  dark:
    (
      bgColor: #121212,
      textColor: #ebeaea,
      cardBgColor: #3a3a3a,
    )
);

2.新建一个 theme.scss 文件,文件主要是解析 theme(这里主要是采自网上写法)


//遍历主题map
@mixin themeify {
  @each $theme-name, $theme-map in $themes {
    //!global 把局部变量强升为全局变量
    $theme-map: $theme-map !global;
    //判断html的data-theme的属性值  #{}是sass的插值表达式
    //& sass嵌套里的父容器标识   @content是混合器插槽,像vue的slot
    [data-theme="#{$theme-name}"] & {
      @content;
    }
  }
}

//声明一个根据Key获取颜色的function
@function themed($key) {
  @return map-get($theme-map, $key);
}

//获取背景颜色
@mixin background_color($color) {
  @include themeify {
    background-color: themed($color) !important;
  }
}

//获取字体颜色
@mixin font_color($color) {
  @include themeify {
    color: themed($color) !important;
  }
}

//获取边框颜色
@mixin border_color($color) {
  @include themeify {
    border-color: themed($color) !important;
  }
}

3.新建 color.scss 文件,主要是自定义颜色样式,在项目任何地方即可使用。


@import "./theme.scss";

// 页面背景色
.page-bgColor {
  @include background_color("bgColor");
}

// 字体颜色
.basis-text-color {
  @include font_color("textColor");
}

// 导航卡片的颜色
.nav-card-bgColor {
  @include background_color("cardBgColor");
}

4.根据需求,切换主题。

假如这里有一个切换的按钮(这里使用两个 icon 代替)

<div class="theme-icon">
  <i
    class="iconfont icon-yueduqi_yewanmoshi-98 title"
    @click="handleChangeThemes"
    v-if="themeData.isDark"
  />
  <i
    class="iconfont icon-baitianmoshi light title"
    @click="handleChangeThemes"
    v-else
  />
</div>

点击切换按钮切换主题(这里是用 vue3,并将其 ts 代码分离)

新建一个 changeTheme.ts 文件


import { onMounted, reactive } from 'vue'

export const changeTheme = () => {
    const themeData = reactive({
        isDark: false
    })
    const handleChangeThemes = () => {
        themeData.isDark = !themeData.isDark
        if (themeData.isDark) {
            window.document.documentElement.setAttribute('data-theme', 'light')
        } else {
            window.document.documentElement.setAttribute('data-theme', 'dark')
        }
    }
    onMounted(() => {
        handleChangeThemes()
    })
    return { themeData, handleChangeThemes }
}

在需要使用的页面引用即可

export default defineComponent({
  name: "",
  setup() {
    const { themeData, handleChangeThemes } = changeTheme()
    return {
      themeData,
      handleChangeThemes
    }
  }
})
相关文章
|
移动开发 API PHP
分享101个PHP源码,总有一款适合您
分享101个PHP源码,总有一款适合您
276 1
|
存储
(pinia-plugin-persistedstate)pinia 持久化存储
(pinia-plugin-persistedstate)pinia 持久化存储
1181 1
|
3月前
|
人工智能 架构师 API
小微企业零成本搭建:Excel任务到期提醒工具的VBA自动推送系统(附保姆级教程)
职场中因忘记截止日期导致的项目延误屡见不鲜。本文剖析传统提醒方式的三大失效原因,测评五类智能任务提醒工具,并提供板栗看板等工具的实操方案,助你实现任务有迹可循、提醒精准到位,从“被动忘”转变为“主动追”。
小微企业零成本搭建:Excel任务到期提醒工具的VBA自动推送系统(附保姆级教程)
|
3月前
|
编解码 缓存 Ubuntu
在Ubuntu平台搭建RTMP直播服务器使用SRS简要指南
这个简要指南提供了搭建基本 RTMP 直播服务所需知道信息. SRS 还提供许多高级特性如 DVR、转码、边缘缓存等. 若要利用这些特性, 需要进一步阅读官方文档并相应地调整配置文件.
364 0
|
3月前
|
JavaScript 调度
BOM如何编制与管理?
BOM英文全称 Bill of Material,即“物料清单”,也称产品结构表。在制造业管理信息系统中,经常会提到BOM。物料清单是指产品所需零部件明细表及其结构。在ERP系统中,“物料”一词有着广泛的含义,它是所有产品、半成品、在制品、原材料、配套件、协作件、易耗品等与生产有关的物料的统称。
|
算法 调度
作业调度算法_先来先服务算法_短作业优先算法_高响应比优先算法
本文介绍了作业调度算法,包括先来先服务(FCFS)、短进程优先(SJF)和高响应比优先(HRRN)算法。通过分析进程的到达时间和所需CPU服务时间,计算进程的开始时间、完成时间、平均周转时间和平均带权周转时间,以评估不同算法的性能。FCFS适合长作业,SJF适合短作业,而HRRN则综合了两者的优点。
734 12
Mac每次都要执行source ~/.bash_profile配置的环境变量才生效
Mac每次都要执行source ~/.bash_profile配置的环境变量才生效
529 2
|
前端开发
Wordpress自定义鼠标样式插件
使用此插件可一键自定义Wordpress前端鼠标指针样式。利用该插件,站长可以快速实现替换多种鼠标指针样式于网站前端。,该插件允许用户一键自定义网站前端的鼠标指针样式,提供多种图案选择。插件资源来源于网络并已开源,无商业性质。包含插件截图和使用教程:用户可从蓝奏云或GitHub下载插件zip文件,然后在WordPress中安装。
252 6
|
缓存 前端开发 JavaScript
前端vue3分享——项目封装axios、vite使用env环境变量
前端vue3分享——项目封装axios、vite使用env环境变量
1630 0
Vue3聊天气泡简单实现思路
Vue3聊天气泡简单实现思路
727 0
Vue3聊天气泡简单实现思路