首页 > 其他分享 >三种方式实现主题切换方案

三种方式实现主题切换方案

时间:2023-11-03 11:16:17浏览次数:28  
标签:name color 主题 site -- 三种 切换 config id

前端主题切换

有些时候我们在网站上会进行夜间/白天模式的切换。
这里我们介绍一种流行的切换模式 css变量 + 动态类名来进行切换
非常的简单。废话不多说。我们直接上代码。
第1种是通过 类名和变量来实现的
第2种是通过 属性和变量还实现的
最后1种 给body加 filter: invert(1);

设置两种模式的颜色

//白天模式
body {
  --site-config-color-bar: #fff; //
  --site-config-color-text: #555; //
  --site-config-color-border: rgba(0, 0, 0, 0.12); //
  --site-config-color-shadow: #eee; //
  --site-config-color-introduce-border: #2196f3; //
  --site-config-color-primary: #2196f3; //
  --site-config-color-side-bar: #3a7afe; //
  --site-config-color-side-bar-active-background: #3a7afe1a; //
}

//夜间模式
body.dark {
    --site-config-color-bar: #1e1e1e; //
    --site-config-color-text: #fff; //
    --site-config-color-border: #333; //
    --site-config-color-shadow: #121212; //
    --site-config-color-introduce-border: #555;  //
    --site-config-color-primary: #96cbfe; //
    --site-config-color-side-bar: #4a7afe; //
    --site-config-color-side-bar-active-background: #4a7afe1a; //
}

ps:将这两种模式的代码放置在全局中。比如app.vue文件中。
反正要在项目的全局中可以使用就行了。

通过给body设置dark类名和移除类名来显示夜间和白天

<template>
  <div>
    <div class="top-header">
       我是顶部的标题
      <button class="change-btn" @click="changeBgHandler">切换皮肤</button>
    </div>
    <div class="cont-box">
      <div class="left-asider-box">
        <div class="item-cont-css" :class="{activecss:item.id==1}" 
          v-for="(item,index) in leftData" :key="index">
            {{item.name}}
        </div>
      </div>

      <div class="center-cont">
        <h3 class="h3-css">我是标题</h3>
        <div class="top-center-header">
            <p class="p1-cont" v-for="item in 10" :key="item">
              {{ item}}
              组件库使用中文作为默认语言,支持多语言切换,内置支持 <a> 中文</a>,<a>英文</a>。
            </p>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() { 
    return {
      msg: 'xx',
      leftData: [
        { name: '优秀的功能1', id: 1 },
        { name: '优秀的功能2', id: 2 },
        { name: '优秀的功能3', id: 3 },
        {name:'优秀的功能4', id:4},
        {name:'优秀的功能5', id:5},
        { name: '优秀的功能6', id: 6 },
        { name: '优秀的功能7', id: 7 },
        { name: '优秀的功能8', id: 8 },
        {name:'优秀的功能9', id:9},
        {name:'优秀的功能10', id:10},
        {name:'优秀的功能11', id:11},
        {name:'优秀的功能12', id:12},
        { name: '优秀的功能13', id: 13 },
        {name:'优秀的功能14', id:14},
        { name: '优秀的功能15', id: 15 },
        { name: '优秀的功能16', id: 16 },
        { name: '优秀的功能17', id: 17 },
        {name:'优秀的功能18', id:18},
        { name: '优秀的功能19', id: 19 },
        { name: '优秀的功能20', id: 20 },
        { name: '优秀的功能21', id: 21 },
        { name: '优秀的功能22', id: 22 },
        { name: '优秀的功能23', id: 23 },
        { name: '优秀的功能24', id: 24 },
      ],
    }
  },
  methods: {
    changeBgHandler() {
      if (!document.body.className) {
        document.body.className = "dark"
      } else {
        document.body.className = ""
      }
    }
  }
  
}
</script>

<style lang="scss" scoped>
.top-header{
  height: 46px;
  line-height: 46px;
  text-align: center;
  background: var(--site-config-color-bar);
  border-bottom: 1px solid var(--site-config-color-border);
  color: var(--site-config-color-text);
  position: relative;
  .change-btn {
    position: absolute;
    right: 20px;
    top: 14px;
  }
}

.cont-box {
  display: flex;
  background: var(--site-config-color-bar);
  .left-asider-box {
    width: 240px;
    box-shadow: 0 8px 12px var(--site-config-color-shadow);
    background: var(--site-config-color-bar);
    .item-cont-css {
      cursor: pointer;
      padding-left: 20px;
      height: 40px;
      line-height: 40px;
      color: var(--site-config-color-text);
    }

    .activecss {
      color: var(--site-config-color-side-bar);
      background: var(--site-config-color-side-bar-active-background);
      transition: color .2s;
    }
  }
}

.center-cont{
  padding-left: 20px;
  padding-right: 20px;
  flex:1;
  .h3-css {
    color: var(--site-config-color-text);
    margin-top: 10px;
    margin-bottom: 10px;
  }
  .top-center-header {
    border-radius: 4px;
    background: var(--site-config-color-bar);
    padding: 20px;
    margin-bottom: 30px;
    box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px rgba(0, 0, 0, 0.14), 0 1px 5px rgba(0, 0, 0, 0.12);
  }
  .p1-cont {
    height: 20px;
    color: var(--site-config-color-text);
  }
  .p1-cont a {
    color: var(--site-config-color-primary);
  }
}
</style>

 

这些网站有夜间模式

https://varlet.gitee.io/varlet-ui/#/zh-CN/home

第2种-变量+属性

全局的颜色样式-app.vue中
<style lang="scss">
*{
  padding: 0;
  margin: 0;
}
/* 默认白天主题 */
:root {
  --bg-color: #fff;
  --text-color: #555;
  // 白天的颜色放置在这里
}
/* 夜间模式主题 */
:root[theme='light'] {
  --bg-color: #1e1e1e;
  --text-color: #fff;
  // 页面模式的放置在这里
}
// 设置整个页面的背景色
html,body{
  background-color: var(--bg-color);
}
</style>

在页面中的使用

<template>
  <div>
      <div class="center-cont">
        <h3 class="h3-css">我是标题</h3>
        <div class="top-center-header">
          <p class="p1-cont" v-for="item in 10" :key="item">{{ item}}组件库使用中文作为默认语言,支持多语言切换,内置支持 <a> 中文</a>,<a>英文</a>。</p>
        </div>
      </div>
      <button class="change-btn" @click="changeBgHandler">切换皮肤</button>
  </div>
</template>

<script>
export default {
  methods: {
    changeBgHandler() {
      if (document.documentElement.getAttribute('theme')) {
        document.documentElement.removeAttribute('theme')
      } else {
        document.documentElement.setAttribute('theme', 'light')
      }
    }
  }
  
}
</script>
<style lang="scss" scoped>
.center-cont{
  background: var(--bg-color);
  .h3-css{
    color: var(--text-color);
  }
  .p1-cont{
    color: var(--text-color);
  }
}
</style>

 

还有没有更加简单的切换模式 --有的

给body加 filter: invert(1);
但是这一种只能够临时解决问题。

标签:name,color,主题,site,--,三种,切换,config,id
From: https://www.cnblogs.com/yuwenjing0727/p/17807132.html

相关文章

  • 博客园自定义主题教程
    https://www.cnblogs.com/cainiao-chuanqi/p/11388719.htmlhttps://blog.csdn.net/cxyliangzai/article/details/125094052?spm=1001.2101.3001.6650.8......
  • UE5打包后,无法切换关卡的问题
    首先是普通的会遇到的问题,比如多个Level不在同一目录,或者不在默认的Maps目录打包不成功这时候要设置,ProjectSettings->Packaging上面保证没问题之后,打包发现依然有问题,不管切换路径为相对或者绝对路径都不行把蓝图中的OpenLevel,变为按引用传递可以了,详细请看如下:https://www......
  • 公司在职第四党支部开展 “传承红色基因,发扬两弹精神”主题党日活动,金刚石刀具
    成都工具研究所有限公司的前身是成都工具研究所,于1956年创建于北京,是原机械工业部的直属研究所,是我国机械工业的综合性工具科研机构。公司官网:http://www.ctri.com.cn/公司主要从事精密切削工具、精密测量仪器以及表面改性处理技术的技术研究、产品开发和应用服务。2020年9月5日,......
  • WSD、USB 和 TCP/IP 端口是连接和使用打印机的三种不同方法
    WSD、USB和TCP/IP端口是连接和使用打印机的三种不同方法,各自的特点如下:WSD(WebServicesonDevices)端口:WSD是一种基于网络的打印服务,允许计算机和打印机在局域网中通过网络发现彼此。它使用的是一种标准的网络协议,支持动态设备发现和配置。通常用于无线和有线的网络打......
  • 终于有人把VMware虚拟机三种网络模式讲清楚了!
    你们好,我的网工朋友。前段时间VMware更新了,你用上最新版了吗?有几个网工朋友留言说,在操作中遇到过各种各样的问题。比如说由于公司服务器重启导致出现下面的问题:在Xshell里连接虚拟机映射时连接失败;能够连接上虚拟机的映射地址,但gitpull时报错无法解析hostname……其实这些都是ip问......
  • hosts切换服务
    正式环境全局事务获取失败导致审批不了申请,报错:io.seata.rm.datasource.exec.LockWaitTimeoutException:Globallockwaittimeout执行以下步骤可行:1、hosts连天津服务【此电脑】-》【c盘】-》【Windows】-》【System32】-》【drivers】-》【etc】-》hosts找到hosts文件,右击......
  • 三种简单实用的方法帮助你去除抖音视频上的水印
    如今越来越多的人涉足自媒体工作,在这个过程中,我们经常会遇到一个普遍的问题在寻找素材时,发现视频上带有抖音的水印,这些水印可能会对我们的创作产生负面影响,不过别担心!我将与你分享三种简单实用的方法,帮助你抖音视频去水印。第一种方法、水印云水印云是一款快速去水印的软件可以帮你......
  • 如何使用Git实现切换分支开发 操作步骤
     现在gitee上新增了一个develop-v1.0.0分支,新增的需求基于分支develop-v1.0.0开发,需要把master分支切换到该分支,代码提交到该分支。步骤一: 步骤二:查看分支输入:gitbranch--remote  步骤三、执行切换分支的命令gitcheckout-b  develop-v1.0.0origin/develop......
  • 「2023·最新盘点」十大热门WebStorm主题
    WebStorm 是jetbrains公司旗下一款JavaScript开发工具。被广大中国JS开发者誉为"Web前端开发神器""最强大的HTML5编辑器""最智能的JavaSscriptIDE"等。与IntelliJIDEA同源,继承了IntelliJIDEA强大的JS部分的功能。在IDE中,开发者的感觉舒服很重要。WebStorm定制程度高,您可以按照......
  • 关于二叉树中三种深度遍历方式的理解
    今日刷题,538.把二叉搜索树转换为累加树。明确知道利用二叉搜索树中序遍历的情况下是有序数组这一个特点,进行“逆中序”来累加。但是在递归时却还是有些没有搞清楚一些细节,终究还是没有掌握。问题主要还是在于递归返回值的处理上:在中序遍历的情况下,似乎对于左右两个节点的遍历,不......