Vue中动态样式绑定+CSS变量实现切换明暗主题功能——从入门到进阶

1.直接借助Vue的动态绑定样式绑定

Vue动态样式绑定

在Vue中,动态样式绑定是一种强大的功能,它允许开发者根据数据的变化动态地更新元素的样式。以下是对Vue动态样式绑定的详细知识梳理与详解:

一、基础知识

Vue的动态样式绑定主要通过v-bind:style(或简写为:style)指令来实现。通过该指令,可以将样式属性与Vue组件中的数据进行绑定,从而实现样式的动态变化。

二、对象语法

对象语法是动态样式绑定中最直观且常用的方法。它允许开发者通过对象的属性和值来动态设置样式。

  1. 基本用法
<template>
  <div :style="styleObject">Hello World</div>
</template>

<script>
export default {
  data() {
    return {
      styleObject: {
        color: 'red',
        fontSize: '14px'
      }
    };
  }
};
</script>

在上面的例子中,styleObject是一个包含样式属性和值的对象。当styleObject的属性值发生变化时,<div>元素的样式也会相应地发生变化。

  1. 驼峰式与短横线分隔式

Vue中的样式属性可以是驼峰式(如fontSize)或短横线分隔式(如font-size)。在模板中,推荐使用短横线分隔式,因为这与CSS中的写法保持一致。但在JavaScript对象中,由于驼峰式是标准的属性命名方式,所以也可以使用驼峰式。Vue会自动将驼峰式属性转换为短横线分隔式。

三、数组语法

数组语法允许开发者结合多个样式对象,这在需要组合多种条件下的样式时非常有用。

  1. 基本用法
<template>
  <div :style="[baseStyles, overridingStyles]">Hello World</div>
</template>

<script>
export default {
  data() {
    return {
      baseStyles: {
        color: 'blue',
        fontSize: '14px'
      },
      overridingStyles: {
        color: 'green'
      }
    };
  }
};
</script>

在上面的例子中,baseStylesoverridingStyles是两个包含样式属性的对象。当它们被组合在一起并绑定到<div>元素的style属性上时,overridingStyles中的样式会覆盖baseStyles中相同属性的样式。

四、条件样式

条件样式允许开发者根据条件动态地改变样式。这可以通过三元表达式、计算属性或方法来实现。

  1. 三元表达式
<template>
  <div :style="{ color: isActive ? 'green' : 'red' }">Hello World</div>
</template>

<script>
export default {
  data() {
    return {
      isActive: true
    };
  }
};
</script>

在上面的例子中,isActive是一个条件变量。当isActivetrue时,<div>元素的文字颜色为绿色;当isActivefalse时,文字颜色为红色。

  1. 计算属性

计算属性可以将复杂的样式逻辑封装起来,使模板更加简洁。

<template>
  <div :style="computedStyles">Hello World</div>
</template>

<script>
export default {
  data() {
    return {
      isActive: true
    };
  },
  computed: {
    computedStyles() {
      return {
        color: this.isActive ? 'green' : 'red',
        fontSize: '14px'
      };
    }
  }
};
</script>

在上面的例子中,computedStyles是一个计算属性,它根据isActive的值动态计算样式并返回。

五、结合类名与内联样式

在Vue中,还可以将动态样式与外部样式表结合使用。这可以通过动态地添加或移除类名来实现。

  1. 对象语法绑定类名
<template>
  <div :class="{ active: isActive }">Hello World</div>
</template>

<script>
export default {
  data() {
    return {
      isActive: true
    };
  }
};
</script>

<style>
.active {
  font-weight: bold;
}
</style>

在上面的例子中,当isActivetrue时,<div>元素会添加active类名,从而应用.active样式。

  1. 数组语法绑定多个类名
<template>
  <div :class="[classOne, classTwo]">Hello World</div>
</template>

<script>
export default {
  data() {
    return {
      classOne: 'class-a',
      classTwo: 'class-b'
    };
  }
};
</script>

<style>
.class-a {
  color: red;
}

.class-b {
  font-size: 20px;
}
</style>

在上面的例子中,classOneclassTwo是两个数据属性,它们的值分别是样式类名。通过数组语法,可以将这两个样式类同时应用到一个元素上。

六、实际应用场景

动态样式绑定在Vue中有广泛的应用场景,如:

  • 响应式设计:根据屏幕尺寸动态调整样式。
  • 交互效果:根据用户操作(如点击、悬停)动态改变样式。
  • 状态显示:根据数据状态(如错误提示、成功信息)动态应用样式。
  • 主题切换:根据用户选择动态切换不同的主题样式。

七、主题切换实现

<template>
 <el-header class="header" :style="style1">
 </el-header>
</template>
<script setup lang="ts">
const variables = reactive({
  //默认主题颜色
  'dark': '#374151',
  //鲜明色
  'light': '#ffffff'
})
const curTheme=ref("dark")

let color=computed(()=>{
  return variables[curTheme.value];
})
// 使用 computed 动态计算样式
const style1 = computed(() => {
  return {
    'background-color': color.value
  }
})
const toggleTheme=()=>{
curTheme.value=curTheme.value==="dark"?"light":"dark";
}
</script>
<style>
.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  color: white;
  padding: 0 20px;
  height: 7%;
}
</style>

2.Vue中样式绑定动态变量传递给CSS {’–bg’:color}

Vue中CSS动态样式绑定

<template>
 <el-header class="header" :style="{'--bg':color}">
 </el-header>
</template>
<script setup lang="ts">
const variables = reactive({
  //默认主题颜色
  'dark': '#374151',
  //鲜明色
  'light': '#ffffff'
})
const curTheme=ref("dark")

let color=computed(()=>{
  return variables[curTheme.value];
})

</script>
<style>
.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  color: white;
  padding: 0 20px;
  height: 7%;
  background-color: var(--bg);
}
</style>

3.利用SCSS变量+动态类样式切换:class="[‘header’,curTheme]"

3.1定义css变量

//variable.css
//默认主题颜色
$dark: #374151;
//鲜明色
$light:#ffffff;
$header-default-height:20%;

3.2导入scss文件

<style scoped lang="scss">
@import "src/assets/styles/variables";
</style>

3.3使用css变量构建不同类样式

<style scoped lang="scss">
@import "src/assets/styles/variables";
.light{
  background-color:$light;
}
.dark{
  background-color:$dark;
}
.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  color: white;
  padding: 0 20px;
  height: 7%;
}
</style>

3.4 设置切换逻辑

<script setup lang="ts">
const curTheme=ref("dark")
const toggleTheme=()=>{
curTheme.value=curTheme.value==="dark"?"light":"dark";
}
</script>

3.5绑定动态类样式

<template>
 <el-header :class="['header',curTheme]">
 </el-header>
 </template>

4.修改scss变量值

在 Vue 中,你可以通过直接修改 CSS 变量的值来实现主题切换。CSS 变量(也称为自定义属性)允许你在 CSS 中定义可以在整个文档或特定元素范围内重用的值。通过 JavaScript,你可以动态地改变这些变量的值,从而改变页面的样式。

以下是一个简单的例子,展示了如何在 Vue 组件中通过修改 CSS 变量的值来切换主题:

  1. 在 CSS/SCSS 中定义 CSS 变量

首先,在你的全局样式文件(如 styles.scss 或直接在组件的 <style> 标签内)中定义 CSS 变量。

:root {
  --primary-color: #374151; // 默认主题颜色
  --background-color: #f0f0f0; // 默认背景颜色
}

.dark-theme {
  --primary-color: #ffffff; // 深色主题颜色
  --background-color: #374151; // 深色背景颜色
}

注意:虽然 .dark-theme 类在这里被定义了,但我们稍后将通过 JavaScript 直接修改根元素的 CSS 变量,而不是切换类名。

  1. 在 Vue 组件中

在你的 Vue 组件中,你可以通过 mounted 钩子、计算属性或方法来访问和修改这些 CSS 变量的值。

<template>
  <div :class="[isDarkTheme ? 'dark-theme-indicator' : '']">
    <!-- 你的内容 -->
    <button @click="toggleTheme">切换主题</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDarkTheme: false, // 初始主题为浅色
    };
  },
  methods: {
    toggleTheme() {
      this.isDarkTheme = !this.isDarkTheme;
      this.updateThemeVariables();
    },
    updateThemeVariables() {
      const root = document.documentElement;
      root.style.setProperty('--primary-color', this.isDarkTheme ? '#ffffff' : '#374151');
      root.style.setProperty('--background-color', this.isDarkTheme ? '#374151' : '#f0f0f0');
    },
  },
  mounted() {
    // 初始化主题(可选)
    this.updateThemeVariables();
  },
};
</script>

<style scoped>
/* 你可以在这里添加一些基于 CSS 变量的样式 */
.dark-theme-indicator {
  /* 只是一个指示器,用于显示当前是深色主题 */
  border: 1px solid red; /* 仅为示例 */
}

/* 使用 CSS 变量 */
body {
  background-color: var(--background-color);
  color: var(--primary-color);
}

/* ... 其他样式 ... */
</style>

在这个例子中,toggleTheme 方法会切换 isDarkTheme 的值,并调用 updateThemeVariables 方法来更新 CSS 变量的值。updateThemeVariables 方法通过访问 document.documentElement(即 <html> 元素)并设置其 style.setProperty 方法来更改 CSS 变量的值。

注意,虽然我们在组件中定义了 .dark-theme 类,但实际上并没有将其应用到任何元素上。这是因为我们直接通过 JavaScript 修改了 CSS 变量的值,而不是通过切换类名来改变样式。不过,你仍然可以保留这个类作为一个指示器或用于其他目的(比如添加一些仅在深色主题下显示的额外样式)。

另外,请注意,如果你的项目中使用了 SCSS,并且你希望在 SCSS 文件中使用这些变量,你需要确保在编译 SCSS 时这些变量已经被定义。由于 CSS 变量是在运行时通过 JavaScript 修改的,SCSS 编译时无法知道它们的最终值。因此,你通常会在全局样式表或组件的 <style> 标签中定义这些变量,并在 JavaScript 中动态地修改它们。

注意事项

有些时候明明导入scss,但确发现不起作用,还是找不到css变量!!!
在这里插入图片描述
在这里插入图片描述
考虑CSS 文件加载顺序问题,是真的先加载scss文件了吗?
如果你的 CSS 变量定义在一个后加载的 CSS 文件中,而你在一个先加载的 CSS 文件或 JavaScript 代码中尝试访问它,那么就会出现未定义的错误。确保定义变量的 CSS 文件在访问变量的文件之前被加载。
不妨定义一个全局的变量并在main.ts就导入(虚拟DOM生成前就导入)
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/943621.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为管理变革之道:奋斗文化与活力

目录 企业文化是什么&#xff1f; 为什么活下去是华为的文化&#xff1f; 活下来&#xff0c;是华为公司的最低纲领&#xff0c;也是华为公司的最高纲领&#xff01; 资源终会枯竭&#xff0c;唯有文化才能生生不息 企业文化之一&#xff1a;以客户为中心 企业文化之二&a…

强化数据治理能力,夯实数字政府建设基石!

当下&#xff0c;数字政府建设已成为推动国家治理体系和治理能力现代化的关键路径。数据作为数字化时代的关键生产要素&#xff0c;直接影响着数字政府建设的能效&#xff0c;关系着政府决策的科学性、公共服务的精准性以及社会治理的有效性。因此&#xff0c;通过数据治理来全…

NFC 碰一碰发视频源码搭建技术详解,支持OEM

一、引言 NFC&#xff08;Near Field Communication&#xff09;近场通信技术以其便捷性和安全性在现代移动应用中得到了广泛应用。结合视频播放功能&#xff0c;实现 NFC 碰一碰发视频的应用场景&#xff0c;能够为用户带来全新的交互体验&#xff0c;例如在商场的产品推广、景…

【论文阅读】AllMatch: Exploiting All Unlabeled Data for Semi-Supervised Learning

一、引言 在当今的机器学习领域&#xff0c;半监督学习&#xff08;SSL&#xff09;作为一种重要的学习范式&#xff0c;受到了广泛的关注。它旨在利用有限的标记数据和大量的未标记数据来提升模型的性能&#xff0c;从而在数据标记成本较高而未标记数据丰富的情况下发挥重要作…

光谱相机与普通相机的区别

一、成像目的 普通相机&#xff1a;主要目的是记录物体的外观形态&#xff0c;生成人眼可见的、直观的二维图像&#xff0c;重点在于还原物体的形状、颜色和纹理等视觉特征&#xff0c;以供人们进行观赏、记录场景或人物等用途。例如&#xff0c;拍摄旅游风景照片、人物肖像等…

基于单片机的蓄电池内阻检测系统设计(论文+源码)

1 系统的功能及方案设计 在本次设计中&#xff0c;考虑到整体设计难度。在此选择了上述的方法一来作为本次蓄电池内阻检测的方案。其系统整个框图如下图1所示。其主要的核心控制模块由LCD显示模块&#xff0c;负载电路模块&#xff0c;AD模数转换模块&#xff0c;继电器控制模…

Git核心概念

版本控制 什么是版本控制 版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 除了项目源代码&#xff0c;你可以对任何类型的文件进行版本控制。 为什么要版本控制 有了它你就可以将某个文件回溯到之前的状态&#xff0c;甚至将整…

Kotlin 协程基础知识总结二 —— 启动与取消

协程启动与取消的主要内容&#xff1a; 启动协程&#xff1a;启动构建器、启动模式、作用域构建器、Job 生命周期取消协程&#xff1a;协程的取消、CPU 密集型任务取消、协程取消的副作用、超时任务 1、协程构建器 &#xff08;P20&#xff09;launch 与 aysnc 两种协程构建…

kong网关使用pre-function插件,改写接口的返回数据

一、背景 kong作为api网关&#xff0c;除了反向代理后端服务外&#xff0c;还可对接口进行预处理。 比如本文提及的一个小功能&#xff0c;根据http header某个字段的值&#xff0c;等于多少的时候&#xff0c;返回一个固定的报文。 使用到的kong插件是pre-function。 除了上…

群落生态学研究进展▌Hmsc包对于群落生态学假说的解读、Hmsc包开展单物种和多物种分析的技术细节及Hmsc包的实际应用

HMSC&#xff08;Hierarchical Species Distribution Models&#xff09;是一种用于预测物种分布的统计模型。它在群落生态学中的应用广泛&#xff0c;可以帮助科学家研究物种在不同环境条件下的分布规律&#xff0c;以及预测物种在未来环境变化下的潜在分布范围。 举例来说&a…

MacroSan 2500_24A配置

双控制器电源同时按下,切记/切记/切记 默认信息 默认地址:192.168.0.210 输入ODSP授权后设置密码## 配置端口 物理资源–>设备–>网口–>eth-1:0:0或eth-2:0:0 创建存储池 存储资源–>存储池 介质类型:混合(支持机械及SSD)全闪(仅支持SSD) RAID类型:CRAID-P(基于磁…

SQL-leetcode-180. 连续出现的数字

180. 连续出现的数字 表&#xff1a;Logs -------------------- | Column Name | Type | -------------------- | id | int | | num | varchar | -------------------- 在 SQL 中&#xff0c;id 是该表的主键。 id 是一个自增列。 找出所有至少连续出现三次的数字。 返回的…

ISDP010_基于DDD架构实现收银用例主成功场景

信息系统开发实践 &#xff5c; 系列文章传送门 ISDP001_课程概述 ISDP002_Maven上_创建Maven项目 ISDP003_Maven下_Maven项目依赖配置 ISDP004_创建SpringBoot3项目 ISDP005_Spring组件与自动装配 ISDP006_逻辑架构设计 ISDP007_Springboot日志配置与单元测试 ISDP008_SpringB…

ElementPlus 自定义封装 el-date-picker 的快捷功能

文章目录 需求分析 需求 分析 我们看到官网上给出的案例如下&#xff0c;但是不太满足我们用户想要的快捷功能&#xff0c;因为不太多&#xff0c;因此需要我们自己封装一些&#xff0c;方法如下 外部自定义该组件的快捷内容 export const getPickerOptions () > {cons…

怎么模仿磁盘 IO 慢的情况?并用于MySQL进行测试

今天给大家分享一篇在测试环境或者是自己想检验自己MySQL性能的文章 实验环境&#xff1a; Rocky Linux 8 镜像&#xff1a;Rocky-8.6-x86_64-dvd.iso 1. 创建一个大文件作为虚拟磁盘 [rootlocalhost ~] dd if/dev/zero of/tmp/slowdisk.img bs1M count100 记录了1000 的读入…

C++--------继承

一、继承的基本概念 继承是 C 中的一个重要特性&#xff0c;它允许一个类&#xff08;派生类或子类&#xff09;继承另一个类&#xff08;基类或父类&#xff09;的属性和方法。这样可以实现代码的重用和建立类之间的层次关系。 #include <iostream>// 基类 class Base…

Ubuntu24.04安装NVIDIA驱动及工具包

Ubuntu24.04安装NVIDIA驱动及工具包 安装nvidia显卡驱动安装cuda驱动安装cuDNN安装Anaconda 安装nvidia显卡驱动 NVIDIA 驱动程序&#xff08;NVIDIA Driver&#xff09;是专为 NVIDIA 图形处理单元&#xff08;GPU&#xff09;设计的软件&#xff0c;它充当操作系统与硬件之间…

探秘“香水的 ChatGPT”:AI 开启嗅觉奇幻之旅!

你没有看错&#xff0c;AI也能闻到味道了&#xff01;这是一家名为Osmo公司公布的信息&#xff0c;他们成功创造出了由AI生成的李子味道&#xff0c;快跟着小编一探究竟吧~ 【图片来源于网络&#xff0c;侵删】 Osmo公司的这项技术&#xff0c;通过分析香味的化学成分和人类嗅…

vue之axios基本使用

文章目录 1. axios 网络请求库2. axiosvue 1. axios 网络请求库 <body> <input type"button" value"get请求" class"get"> <input type"button" value"post请求" class"post"> <!-- 官网提供…

高通 ISP pipeline

目录 ISP理解&#xff1a; 1. IFE : Image front-end engine&#xff08;图像前端引擎&#xff09; 1.1 相关特点 1.2 IFE作用 2. BPS : Bayer processing segment&#xff08;拜耳加工段&#xff09; 2.1 相关特点 2.2 BPS基本概念 2.3 BPS与IFE区别&#xff1a; 3. …