Vue3 + Vite + Css3切换主题

这篇具有很好参考价值的文章主要介绍了Vue3 + Vite + Css3切换主题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、css3中变量的作用

一个系统或者说一个项目中,往往涉及到很多颜色,但是如果系统看起来样式规整统一的话可能在色值方面偏靠一个色系,字体,颜色,背景颜色,图标颜色等等。
所有可以在css中定义统一的变量,就不用到处去改防止在修改的时候遗漏。

2、css3中如何声明变量

/**局部设置*/
div {
--bg-color: red;
}
/**全局设置*/
:root{
  --common-background-color: #FFF;
  --common-font-color: #333333;
}

3、css3中如何使用变量

  background-color: var(--common-background-color);

4、css3中设备备用值

   background-color: var(--common-background-color, #ffffff);

5、定义变量中遇到的问题

	// 这样是不生效的
	-- color: #333333
    box-shadow: 0 4px 12px 10px rgba(var(-- color), 0.08);
    // 改成这样是可以的
    -- shadow-color: rgba(var(-- color), 0.08)
     box-shadow: 0 4px 12px 10px var(--shadow-color);
     
     // 不生效
     --size: '30px';
     // 这样可以的
     --size: 30px;

6、切换主题思路(提供了俩种思路)

在网上一顿查找后找到两条思路,可以参考一下element-ui 或者vant-ui 官网上都有切换主题的,但是都是第一种形式
Vue3 + Vite + Css3切换主题,css3,前端,css
Vue3 + Vite + Css3切换主题,css3,前端,css
Vue3 + Vite + Css3切换主题,css3,前端,css
Vue3 + Vite + Css3切换主题,css3,前端,css

  1. 第一种:在根节点或者父节点追加类名,通过动态修改类名来切换主题样式
  2. 第二种:可以通过 document.documentElement.style.setProperty() 动态修改 css3变量中的值
    分析了一下,第二种不可行的原因,你在项目中设置了100个css3变量,然后你切换主题的时候修改100个值?不现实吧,也可能是我对前端的了解还是比较少,所以采用的第一种。

7、样式主题涉及到那几部分内容的切换?

  1. 背景颜色
  2. 字体颜色
  3. 阴影效果
  4. 图标
  5. 引用的第三方样式

8、上代码

  1. 定义一个切换主题的按钮或者组件 ThemeButton.vue
<template>
  <div class="ThemeButton" @click="changeTheme">
    <img src="https://b.yzcdn.cn/vant/light-theme.svg" alt="" v-if="darkOrLight" />
    <img src="https://b.yzcdn.cn/vant/dark-theme.svg" alt="" v-else />
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import { useThemeStore } from '@/stores/theme';

const darkOrLight = ref(true);
const themeStore = useThemeStore();
const changeTheme = () => {
  darkOrLight.value = !darkOrLight.value;
  themeStore.changeTheme();
};
</script>

<style scoped lang="less">
.ThemeButton {
  width: 35px;
  height: 35px;
  border-radius: 50%;
  display: flex;
  justify-content: center;
  align-items: center;

  img {
    width: 30px;
    height: 30px;
  }

  background-color: #fff;
}
</style>
  1. 在全局中存储一下当前主题(piana)theme.ts
import { defineStore } from 'pinia';
import { ThemeEnums } from '@/utils/ThemeEnums';

export const useThemeStore = defineStore({
  id: 'theme',
  state: () => ({
    theme: ThemeEnums.LIGHT_THEME
  }),
  actions: {
    changeTheme() {
      this.theme = this.theme === ThemeEnums.LIGHT_THEME ? ThemeEnums.DARK_THEME : ThemeEnums.LIGHT_THEME;
    }
  },
  persist: {
    enabled: true,
    storage: sessionStorage
  } as any
});

  1. 主题的枚举 ThemeEnums.ts
export enum ThemeEnums {
  // 暗黑主题
  DARK_THEME = 'dark',
  // 明亮主题
  LIGHT_THEME = 'light'
}

  1. 在vue的跟组件也就是APP.vue 中添加动态class
<template>
  <div class="App AppClass" v-loading="globalLoading" :class="useThemeStore().theme">
    <router-view v-slot="{ Component, route }">
      <keep-alive :include="cacheList">
        <component :is="Component" />
      </keep-alive>
    </router-view>
    <TabBar class="option_menu" v-if="isShowTabBar" />
  </div>
</template>
  1. 定义俩套主题(dark.less light.less)别忘记在main.css 中把这俩个主题引入一下
:root {
  --light-background-color: #FFFFFF;
  --light-font-color: #333333;
  --light-tab-bar-shadow-color: rgba(#121621, 0.08);
}

.light {
  background-color: var(--light-background-color);

  .home_content_wrapper {
    background-color: var(--light-background-color);

    .menu li span {
      color: var(--light-font-color);
    }
  }

  .tabBarClass .tabBar {
    box-shadow: 0 4px 12px 10px var(--light-tab-bar-shadow-color);
  }

  // 消息列表
  .MessageListClass {
    .list_wrap {
      background-color: var(--light-background-color);

      .list_item {
        background-color: var(--light-background-color);
      }
    }
  }

}

light 其实就是默认原来的样式,黑暗主题涉及的可能更多是颜色的对比后,包括第三方组件的样式重写等文章来源地址https://www.toymoban.com/news/detail-811971.html


:root {
  --dark-background-color: #242424;
  --dark-font-color: #FFF;
  --dark-tab-bar-shadow-color: rgba(#d5cbcb, 0.08);
  --dark-item-content-shadow-color: rgba(#eeeaea, 0.12);
  --color: #eeeaea;
}

.dark {
  background-color: var(--dark-background-color);

  .home_content_wrapper {
    background-color: var(--dark-background-color);

    .menu li span {
      color: var(--dark-font-color);
    }
  }

  .tabBarClass .tabBar {
    box-shadow: 0 4px 12px 10px var(--dark-tab-bar-shadow-color);
  }

  // vant 样式重置
  .van-cell-group {
    border: none;
  }

  .van-cell {
    background-color: var(--dark-background-color);
    color: var(--dark-font-color);
  }

  .van-field__label {
    color: var(--dark-font-color);
  }

  .van-cell:after {
    border-bottom: none;
  }

  .van-hairline--top-bottom:after {
    border: none;
  }

  .van-tabs__nav {
    background-color: var(--dark-background-color);
  }

  .van-tab {
    color: var(--dark-font-color);
  }

  .van-text-ellipsis {
    color: var(--dark-font-color);
  }

  .van-popup {
    background-color: var(--dark-background-color);
  }

  .van-cascader__title {
    color: var(--dark-font-color);
  }

  .van-cascader__option {
    color: var(--dark-font-color);
  }

  .van-field__control {
    color: var(--dark-font-color);
  }
  .van-checkbox__label{
    color: var(--dark-font-color);
  }

  // 带统计的按钮
  .total_content_wrapper {
    .van-submit-bar__text {
      color: var(--dark-font-color);
    }
  }
  .van-collapse-item__content{
    background-color: var(--dark-background-color);
    border: 1px solid var(--dark-item-content-shadow-color);
    .inspection_content{
      color: var(--dark-font-color) !important;
    }
    .van-radio__label{
      color: var(--dark-font-color) !important;
    }
  }
  .content_wrapper{
    border: 1px solid var(--dark-item-content-shadow-color);
    border-radius: 5px;
  }

  // 列表样式
  .item_content_wrapper {
    border: 1px solid var(--dark-item-content-shadow-color);
    box-shadow: 3px 3px 6px var(--dark-item-content-shadow-color);

    .title_content {
      color: var(--dark-font-color);
    }
  }

  // 消息列表
  .MessageListClass {
    .list_wrap {
      background-color: var(--dark-background-color);

      .list_item {
        background-color: var(--dark-background-color);
        border: 1px solid var(--dark-item-content-shadow-color);
        box-shadow: 3px 3px 6px var(--dark-item-content-shadow-color);
      }
    }
  }

  // 企业首页
  .statistic_content{
    border: 1px solid var(--dark-item-content-shadow-color);
    color: var(--dark-font-color);
    .time_bgc{
      background-color: var(--dark-background-color);
      .time{
        background-color: var(--dark-background-color) !important;
      }
    }
  }
  .van-cell-group {
    .van-cell {
      &:nth-child(odd) {
        background-color: var(--dark-background-color) !important;
      }
      :deep(.van-cell__title) {
        color: var(--dark-font-color) !important;
      }

      .van-cell__value {
        color: var(--dark-font-color) !important;
      }
    }
  }
  .company_name{
    color: var(--dark-font-color);
  }

  .ConfirmCheckBtnClass{
    background-color: var(--dark-background-color) !important;
    border: 1px solid var(--dark-background-color) !important;
    .tip_content{
      color: var(--dark-font-color);
    }
  }
  .LoadingClass{
    background-color: var(--dark-background-color) !important;
  }
}
/*重置样式*/
@import './reset.css';

/*样式初始化*/
@import './base.scss';

/*通用样式*/
@import "./common.css";

/*主题-黑色*/
/*@import "./theme.css";*/
@import "./theme/dark.less";
@import "./theme/light.less";


到了这里,关于Vue3 + Vite + Css3切换主题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用CSS3 + Vue3 + js-tool-big-box工具,实现炫酷五一倒计时动效

    时间过得真是飞速,很快又要到一年一度的五一劳动节啦,今年五天假,做好准备了吗?今天我们用 CSS3 + Vue3 + 一个前端工具库 js-tool-big-box 来实现一个炫酷的五一倒计时动效吧。 目录 1  先制作一个CSS3样式 2 Vue3功能提前准备  3 使用js-tool-big-box工具完成倒计时 3.1 安装工具

    2024年04月25日
    浏览(46)
  • 前端小白的学习之路(CSS3 三)

    提示:过渡属性transition,动画属性animation,转化属性transform,裁剪属性clip-path,倒影属性box-reflect,模糊度属性filter  目录 一、transition  二、animation  三、transform  四、clip-path   五、box-reflect  六、filter  过渡:以看见标签从一个属性变化到另一个属性值的过程。 transition-pro

    2024年03月19日
    浏览(43)
  • HTML5+CSS3小实例:3D翻转Tab选项卡切换特效

    实例:3D翻转Tab选项卡切换特效 技术栈:HTML+CSS 效果: 源码: 【HTML】

    2024年02月04日
    浏览(59)
  • 【前端从0开始】CSS3新增选择器

    1 什么是CSS3 CSS3是CSS(层叠样式表)技术的升级版本,于1999年开始制订,2001年5月23日W3C完成了CSS3的工作草案,主要包括盒子模型、列表模块、超链接方式、语言模块、背景和边框、文字特效(阴影)、多栏布局(display:flex)、2D3D和动画等模块 2 CSS选择器 选择器 例子 例子描

    2024年02月11日
    浏览(42)
  • css3-----3D变换,前端开发入门到精通

    x y z 的方向: 2、3d移动 translate3d 1.transform:translateX(npx);在x轴方向移动 2.transform:translateY(npx); 在y轴方向移动 3.transform:translateZ(npx); 在Z轴方向移动 4.transform:translate3d(x,y,z);综合写法 3、视距perspective 给元素添加3D效果,要给其父元素添加3D效果 视距:眼睛到屏幕的距离。视距与物

    2024年04月25日
    浏览(41)
  • 前端必学的CSS3波浪效果演示

    使用 translateX 和 translateZ 属性创建波浪效果: 使用场景: 适用于需要在X轴上平移和在Z轴上应用3D变换的波浪效果。 可以用于创建具有起伏效果的海浪、水面波纹等效果。 优点: 通过3D变换,可以实现更加真实的波浪效果。 可以通过调整 translateX 和 translateZ 的值来控制波浪

    2024年02月02日
    浏览(49)
  • 前端学习——css盒子模型、css3新特性、伪类、布局0711TODO

    样式还是得具体使用才能理解,不然会忘记也理解不透彻;还有定位,元素溢出,浮动,布局水平垂直对齐: css3新特性 1过渡 2 动画 3 2D、3D转换 伪类 三种定位方式 弹性布局/栅格布局

    2024年02月15日
    浏览(61)
  • CSS3基础之3D转换(1),前端开发架构

    3. 透视perspective 3.1`translateZ` 4. 3D旋转`rotate3d` 5. 3D呈现`transform-style` 1. 三维坐标系 ======================================================================== 三维坐标系 其实就是指立体空间,立体空间是由3个轴共同组成的 x轴: 水平向右 注意: x 右边是正值,左边是负值 y轴: 垂直向下 注意:

    2024年04月13日
    浏览(44)
  • 黑马 pink h5+css3+移动端前端

    网页概念 网页是网站的一页,网页有很多元素组成,包括视频图片文字视频链接等等,以.htm和.html后缀结尾,俗称html文件 HTML 超文本 标记语言,描述网页语言,不是编程语言,是标记语言,有标签组成 超文本指的是不光文本,还有图片视频等等标签 常用浏览器 firefox google safari opera ed

    2024年02月16日
    浏览(79)
  • vue3 + Tailwind Css + Vite 搭建快速开发前端样式环境

    一个功能类优先的 CSS 框架,用于快速构建定制的用户界面。这是来自 TailwindCss 官方定义。 中文网站 Tailwindcss 基于原子化理念,将样式重复性代码降到最小,原本开发最大限度基于类名的声明块不重复,现在Tailwindcss基于单独一句声明不重复。 活跃度 github starts 数量达到

    2024年02月04日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包