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

news2025/2/12 16:12:49

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生成前就导入)
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科汛网校KesionEDU CheckOrder SQL注入漏洞复现

0x01 产品简介 科汛网校KesionEDU是KESION科汛开发的在线教育建站系统,支持在线直播教学、课程点播、录播授课等多种教学方式,满足不同场景下的教学需求。提供问答互动、学习点评、在线笔记等功能,增强学员与教师之间的互动交流。拥有在线考试系统,支持单选、多选、问答等…

Windows Subsystem for Linux——设置默认登录用户名

大纲 问题解法 问题 在《Windows Subsystem for Linux——安装多个相同的操作系统》一文中&#xff0c;我们实现了子系统的导出和导入&#xff0c;但是也带来了一个问题&#xff1a;登录到系统时&#xff0c;会使用root用户。在一些场景下&#xff0c;这并不符合我们的使用场景…

【编译原理】往年题汇总(山东大学软件学院用)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;编译原理_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …

智慧农业物联网传感器:开启农业新时代

在当今科技飞速发展的时代&#xff0c;农业领域正经历着一场前所未有的变革&#xff0c;而智慧农业物联网传感器无疑是这场变革中的关键利器。它宛如农业的 “智慧大脑”&#xff0c;悄然渗透到农业生产的各个环节&#xff0c;为传统农业注入了全新的活力&#xff0c;让农业生产…

观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?

大家好&#xff0c;我是锋哥。今天分享关于【观察者模式和发布-订阅模式有什么异同&#xff1f;它们在哪些情况下会被使用&#xff1f;】面试题。希望对大家有帮助&#xff1b; 观察者模式和发布-订阅模式有什么异同&#xff1f;它们在哪些情况下会被使用&#xff1f; 1000道 …

C# OpenCvSharp DNN 卡证检测矫正

目录 说明 效果 模型 项目 代码 下载 参考 说明 源码地址&#xff1a;https://modelscope.cn/models/iic/cv_resnet_carddetection_scrfd34gkps 在实人认证、文档电子化等场景中需要自动化提取卡证的信息&#xff0c;以便进一步做录入处理。这类场景通常存在两类问题&…

前端入门之VUE--ajax、vuex、router,最后的前端总结

前言 VUE是前端用的最多的框架&#xff1b;这篇文章是本人大一上学习前端的笔记&#xff1b;欢迎点赞 收藏 关注&#xff0c;本人将会持续更新。本人不是学前端的&#xff0c;这个是大一的时候上学的和做的笔记&#xff0c;那个时候学的也蒙&#xff0c;故这里对前端做一个总…

要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量

文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量&#xff0c;你可以使用以下 SQL 查询语句&#xff1a; SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释&#xff1a; …

RocketMQ的集群架构是怎样的?

大家好&#xff0c;我是锋哥。今天分享关于【RocketMQ的集群架构是怎样的?】面试题。希望对大家有帮助&#xff1b; RocketMQ的集群架构是怎样的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 是阿里巴巴开源的分布式消息中间件&#xff0c;广泛用于处…

使用DynadotAPI查看域名清仓中的过期域名列表

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

uni-app 中使用微信小程序第三方 SDK 及资源汇总

&#x1f380;&#x1f380;&#x1f380;uni-app 跨端开发系列 &#x1f380;&#x1f380;&#x1f380; 一、uni-app 组成和跨端原理 二、uni-app 各端差异注意事项 三、uni-app 离线本地存储方案 四、uni-app UI库、框架、组件选型指南 五、uni-app 蓝牙开发 六、uni-app …

探索 Pencils Swap 的叙事:为 DeFi 的再次爆发蓄力

Pencils Protocol 最初是 Scroll 生态上一个综合性的 DeFi 平台&#xff0c;以 Farming、Vaults 以及 Auction 等系列产品板块为基础&#xff0c;其不仅成为了 Scroll 上重要的流动性、收益枢纽&#xff0c;同时也是重要的 LaunchPad 市场以及流量池&#xff0c;为 Scroll 生态…

基于STM32单片机矿井矿工作业安全监测设计

基于STM32单片机矿井矿工作业安全监测设计 目录 项目开发背景设计实现的功能项目硬件模块组成设计思路系统功能总结使用的模块技术详情介绍总结 1. 项目开发背景 随着矿井矿工作业环境的复杂性和危险性逐渐增加&#xff0c;矿井作业安全问题引起了社会各界的广泛关注。传统的…

数学建模与数学建模竞赛

什么是数学建模&#xff1f; 数学建模是通过数学的方法和工具&#xff0c;对现实世界的一个特定对象&#xff0c;依据其内在规律&#xff0c;做出一些必要的简化假设&#xff0c;从而建立一个数学结构的过程。数学建模的历史和数学的起源几乎同步开始&#xff0c;2000多年前&a…

stm32四联七段数码管,LED8*8点阵

一、七段数码管的整体代码和仿真 1&#xff09;代码 seg74.c #include "stm32f10x.h" // Device headervoid seg74_init(void) {GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(…

SpringCloudAlibaba技术栈-Dubbo

1、什么是Dubbo? 简单来说&#xff0c;dubbo就像是个看不见的手&#xff0c;负责专门从注册中心nacos调用注册到nacos上面的服务的&#xff0c;因为在微服务环境下不同的功能模块可能在不同的服务器上。dubbo调用服务就像是在调用本地的服务一样。 分布式调用与高并发处理 Du…

“AI智能安全管理系统:让安全无处不在

嘿&#xff0c;大家好&#xff01;今天咱们来聊聊一个超级酷炫又至关重要的东西——AI智能安全管理系统。想象一下&#xff0c;如果有一个系统可以像私人保镖一样24小时不间断地保护你和你的财产&#xff0c;是不是感觉特别安心&#xff1f;这就是AI智能安全管理系统带给我们的…

【hackmyvm】soul靶机wp

tags: HMVrbash绕过图片隐写PHP配置解析 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集3. 图片解密3.1. 爆破用户名3.2. 绕过rbash3.3. 提权检测 4. 获取webshell4.1. 修改php配置 5. www-data提权gabriel6. gabriel提取到Peter7. Peter提权root 靶机链接 https://ha…

PaddleOCR训练自己的私有数据集(包括标注、制作数据集、训练及应用)

目录 一、制作数据集 1、进入到PaddleOCR-releas-2.7目录 2、首先启用PPOCRLabel&#xff1a;在终端激活环境 3、接着点击左下角的自动标注 4、确认完成后点击左上角 5、新建gen_ocr_train_val_test.py 二、训练文字检测模型 1、模型下载 2.、配置ppocr检测模型文件 …

网络层协议--ip协议

目录 引言 IP协议 协议头格式 16位标识与3位标志与13位片偏移讲解 网段划分(重要) DHCP技术 CIDR技术 特殊的IP地址 广播主机 IP地址的数量限制 私有IP地址和公网IP地址 路由&#xff1a;在复杂的网络结构中, 找出一条通往终点的路线 简单认识路由器 路由表生成算…