当前位置: 首页 > news >正文

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

相关文章:

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

1.直接借助Vue的动态绑定样式绑定 Vue动态样式绑定 在Vue中&#xff0c;动态样式绑定是一种强大的功能&#xff0c;它允许开发者根据数据的变化动态地更新元素的样式。以下是对Vue动态样式绑定的详细知识梳理与详解&#xff1a; 一、基础知识 Vue的动态样式绑定主要通过v-b…...

vue3 video 播放rtmp视频?(360浏览器支持)

** 注意&#xff1a;目前只能在360浏览器播放rtmp视频** 谷歌浏览器不支持Flash Player的问题 试过上面这个方法&#xff0c;目前没能实现&#xff08;没解决&#xff09;&#xff0c;如果有更好的解决方法&#xff0c;告诉我一下 需要下载版本较低的video.js版本库&#xff0…...

RK356x bsp 7 - PCF8563 RTC调试记录

文章目录 1、环境介绍2、目标3、PCF85634、dts配置5、内核配置6、测试验证 1、环境介绍 硬件&#xff1a;飞凌ok3568-c开发板 软件&#xff1a;原厂rk356x sdk 2、目标 开发板断电后仍正常计时。 3、PCF8563 PCF8563 是由 NXP Semiconductors 公司生产的低功耗 CMOS 实时…...

定义Shape:打造属于你的独特图形

自定义Shape:打造属于你的独特图形 在Android开发中,自定义图形绘制是一个非常重要的技能,尤其是在需要实现复杂UI或特定设计需求时。Android提供了android.graphics.drawable.shapes包,其中包含了一些基本的形状类,如RectShape、OvalShape等。然而,有时这些基本形状无法…...

JavaWeb(一) | 基本概念(web服务器、Tomcat、HTTP、Maven)、Servlet 简介

1. 基本概念 1.1、前言 web开发&#xff1a; web&#xff0c;网页的意思&#xff0c;www.baidu.com静态 web html,css提供给所有人看的数据始终不会发生变化&#xff01; 动态 web 淘宝&#xff0c;几乎是所有的网站&#xff1b;提供给所有人看的数据始终会发生变化&#xf…...

python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶

【1】引言 前序已经掌握了使用cv2.circle()绘制圆形的基本操作&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;二十&#xff09;使用cv2.circle()绘制圆形-CSDN博客 由于圆形本身绘制起来比较简单&#xff0c;因此可以自由操作的空间也就大&#x…...

CLIP:连接文本与图像, 从自然语言监督中学习可迁移的视觉模型

CLIP&#xff1a;连接文本与图像&#xff0c; 从自然语言监督中学习可迁移的视觉模型 flyfish Learning Transferable Visual Models From Natural Language Supervision https://github.com/OpenAI/CLIP 摘要 CLIP Contrastive Language-Image Pre-Training Contrastive&…...

Linux 硬盘扩容 分区 挂载

Linux 硬盘扩容 分区 & 挂载 1. 添加分区 1.1. 查看新添加的硬盘 fdisk -l假设当前未挂载的盘符是/dev/sdb&#xff0c;后文中所有操作都按挂载/dev/sdb 操作 1.2. 分区管理 小硬盘 fdisk /dev/sdb大硬盘&#xff08;2TB以上&#xff09; gdisk /dev/sdb1.3. 编辑分…...

基于 Slf4j 和 AOP 的自动化方法执行时间日志记录方案

前言 其实这个需求很简单&#xff0c;但是这个需求又是项目中必不可少的&#xff0c;尤其对于性能调优这块&#xff0c;但是使用哪种方式更加方便呢&#xff0c;这就是本篇博文需要讨论的重点 系统时间 可以通过 System.currentTimeMillis() 或 System.nanoTime() 来实现。 …...

关于 K8s 的一些基础概念整理-补充【k8s系列之二】

〇、前言 本文继续整理下 K8s 的一些基础概念&#xff0c;作为前一篇概念汇总的补充。 前一篇博文链接&#xff1a;关于 K8s 的一些基础概念整理【k8s系列之一】_集群 master节点 控制节点 宿主机-CSDN博客 一、详情 1.1 Label Label 在 k8s 中是一个非常核心的概念&#xf…...

FPGA的DMA应用——pcileech

硬件通过pcie总线&#xff0c;访存本机的内存&#xff0c;并进行修改&#xff0c;可以进行很多操作。 学习视频&#xff1a;乱讲DMA及TLP 1-pcileech项目简介和自定义模块介绍_哔哩哔哩_bilibili vivado2024.1的下载文章链接和地址&#xff1a;AMD-Xilinx Vivado™ 2024.1 现…...

信息安全管理:运行管理checklist

运行管理checklist内容包括日常操作与维护管理、变更管理、备份与故障恢复、应急与业务连续性管理等内容。 一、日常操作与维护管理 ▼▼制度与流程 是否建立日常运行操作制度与流程&#xff1f;包括网络、主机、应用等方面的操作制度与流程&#xff1f; 是否明确相关部门和人…...

Linux系统之stat命令的基本使用

Linux系统之stat命令的基本使用 一、stat命令 介绍二、stat命令帮助2.1 查询帮助信息2.2 stat命令的帮助解释 三、stat命令的基本使用3.1 查询文件信息3.2 查看文件系统状态3.3 使用格式化输出3.4 以简洁形式打印信息 四、注意事项 一、stat命令 介绍 stat 命令用于显示文件或文…...

云手机+Facebook:让科技与娱乐完美结合

移动互联网时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;早已成为企业、品牌和组织竞相角逐的营销阵地。而云手机的出现&#xff0c;则为Facebook营销注入了新的活力&#xff0c;其独特的优势让营销活动更加高效、精准且灵活。本文将深入探讨云手机在Fa…...

为什么要在PHY芯片和RJ45网口中间加网络变压器

在PHY芯片和RJ45网口之间加入网络变压器是出于以下几个重要的考虑&#xff1a; 1. 电气隔离&#xff1a;网络变压器提供了电气隔离功能&#xff0c;有效阻断了PHY芯片与RJ45之间直流分量的直接连接。这样可以防止可能的电源冲突&#xff0c;降低系统故障的风险&#xff0c;并保…...

LeetCode 19:删除链表的倒数第N 个结点

题目&#xff1a; 地址&#xff1a;https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 方法一&#xff1a; 方法二&#xff1a; 代码&#xff1a; package com.zy.leetcode.LeetCode_19;/*** Author: zy* Date: 2024-12-25-13:01* Description: 删除链表…...

RT-DETR融合[IJCV2024]LSKNet中的LSKBlock模块

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《Large Selective Kernel Network for Remote Sensing Object Detection》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/pdf/2303.09030 代码链接&#xff1a;https:…...

C/C++ 数据结构与算法【树和森林】 树和森林 详细解析【日常学习,考研必备】带图+详细代码

一、树的存储结构 1&#xff09;双亲表示法实现&#xff1a; 定义结构数组存放树的结点&#xff0c;每个结点含两个域: 数据域&#xff1a;存放结点本身信息。双亲域&#xff1a;指示本结点的双亲结点在数组中的位置。 特点&#xff1a;找双亲简单&#xff0c;找孩子难 C语…...

新浪微博大数据面试题及参考答案(数据开发和数据分析)

介绍一下你所掌握的计算机网络和操作系统相关知识 计算机网络:计算机网络是将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。我掌握了网络协议…...

OpenHarmony怎么修改DPI密度值?RK3566鸿蒙开发板演示

本文介绍在开源鸿蒙OpenHarmony系统下&#xff0c;修改DPI密度值的方法&#xff0c;触觉智能Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566四核处理器&#xff0c;Laval鸿蒙社区推荐开发板&#xff0c;已适配全新开源鸿蒙OpenHarmony5.0 Release系统&#xff0c;适…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...