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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能家居实训室中,STC单片机驱动的“互联网+”智能家居系统设计

一、引言 随着经济的快速发展&#xff0c;人们对家居环境的智能化、网络化需求日益增强&#xff0c;智能家居的研究也因此受到了国内外相关机构的广泛关注。STC单片机凭借其卓越的性能和广泛的应用领域&#xff0c;成为了智能家居系统设计的优选方案。作为一种先进的微控制器&…

计算机网络——期末复习(3)4-6章考试重点

第四章 根据IPv4第1个十进制数值判断&#xff0c;127以下为A类&#xff0c;128~191为B类&#xff0c;192~223为C类不能分配给主机或路由器接口的&#xff1a;A类网络号0和127&#xff0c;主机号全为0或全为1私有地址&#xff08;Private IP Address&#xff09;是指一类专门保…

内置ALC的前置放大器D2538A/D3308

一、概述 D2538A/D3308是芯谷科技推出的带有ALC&#xff08;自动电平控制&#xff09;的前置音频放大器芯片&#xff0c;最初产品为单声道/立体声收录机及盒式录音机而开发&#xff0c;作为录音/回放的磁头放大器使用&#xff1b;由于产品的高增益、低噪声及ALC外部可调的特性&…

【玩转MacBook】Git安装

Git 官网也提到了MacBook 可以使用 Homebrew 安装 Git&#xff0c;所以在此使用 Homebrew 安装。 1、安装 Homebrew 执行安装脚本 在 Terminal 中执行如下命令&#xff1a; /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.…

Speckly:基于Speckle文档的RAG智能问答机器人

前言 Speckly 是一个基于 检索增强生成 (RAG) 技术的智能问答机器人&#xff0c;它能像一位经验丰富的工程师&#xff0c;理解你的问题&#xff0c;并从 Speckle 文档中精准地找到答案。更厉害的是&#xff0c;它甚至可以帮你生成代码片段&#xff01;&#x1f680; 本文将详…

Excel无法插入新单元格怎么办?有解决方法吗?

在使用Excel时&#xff0c;有时会遇到无法插入新单元格的困扰。这可能是由于多种原因导致的&#xff0c;比如单元格被保护、冻结窗格、合并单元格等。本文将详细介绍3种可能的解决方案&#xff0c;帮助你顺利插入新单元格。 一、消冻结窗格 冻结窗格功能有助于在滚动工作表时保…

电子配件行业的未来之路:产品说明书数字化转型的力量

在科技飞速发展的今天&#xff0c;电子配件行业作为科技创新的前沿阵地&#xff0c;正经历着前所未有的变革。从智能手机、平板电脑到智能穿戴设备&#xff0c;各种新型电子配件层出不穷&#xff0c;极大地丰富了人们的生活。然而&#xff0c;随着产品种类的增多和功能的复杂化…

Python+Django 技术实现自动化漏洞扫描系统开发

作者简介 &#xff0c;徐师兄是一位拥有7年大厂经验的资深程序员&#xff0c;致力于Python技术领域的探索与实践&#xff0c;擅长毕业设计实战。他拥有超过12万的全网粉丝&#xff0c;是CSDN博客专家&#xff0c;也是掘金、华为云、阿里云和InfoQ等平台的优质作者。除了丰富的实…

EleutherAI/pythia-70m

EleutherAI/pythia-70m” 是由 EleutherAI 开发的一个小型开源语言模型&#xff0c;它是 Pythia Scaling Suite 系列中参数量最小的模型&#xff0c;拥有大约 7000 万个参数。这个模型主要旨在促进对语言模型可解释性的研究&#xff1b; Pythia Scaling Suite是为促进可解释性…

WinForm 美化秘籍:轻松实现 Panel 圆角虚线边框

文章目录 1、引言2、案例实现1、创建自定义 Panel 类2、定义圆角矩形3. 使用自定义 Panel4. 调整属性5、使用背景图片来实现5、拓展&#xff1a;使用 Panel 的 Paint重绘单独实现虚线边框效果 3、实现效果4、总结 1、引言 在 Winform 应用程序开发中&#xff0c;美化用户界面&…

Goland 安装与使用

GoLand安装 官方网址&#xff1a; JetBrains GoLand&#xff1a;不只是 Go IDE 1. 进入官网&#xff0c;点击下载&#xff1a; ​ 2. 如下图一步步安装 ​ ​ ​ ​ ​ 3. 如下图一步步安装

pdf有密码,如何实现pdf转换word?

PDF想要转换成其他格式&#xff0c;但是当我们将文件拖到PDF转换器进行转换的时候发现PDF文件带有密码怎么办&#xff1f;今天分享PDF有密码如何转换成word方法。 方法一、 PDF文件有两种密码&#xff0c;打开密码和限制编辑&#xff0c;如果是因为打开密码&#xff0c;建议使…

uniapp实现APP、小程序与webview页面间通讯

需求&#xff1a; 1、需要在Uniapp开发的APP或小程序页面嵌入一个H5网页&#xff0c;需要拿到H5给APP传递的数据。 2、并且这个H5是使用vuevant开发的。&#xff08;其实跟使用uniapp开发H5一样&#xff09; 实现步骤&#xff1a; 1、首先需要兼容多端和App端&#xff0c;因…

Vue开源项目Pure Admin二次开发:实现前后端柱状图

目标&#xff1a;在Vue开源项目Pure Admin的基础上&#xff0c;增加菜单和标签页&#xff0c;实现同期温度对比的柱状图&#xff0c;支持按时段查询。 先贴上效果图&#xff1a; 增加菜单 新建src\router\modules\weather.ts&#xff0c; export default {path: "/weat…

Markdown语法字体字号讲解

学习目录 语法详解改变字体样式[电脑要自带该样式字体]改变局部字号全局字体字号的设置使用场景及应用实例 > 快乐试试吧&#x1f603; &#x1f447; &#x1f447; &#x1f448;点击该图片即可跳转至Markdown学习网站进行 Markdown语法字体字号讲解&#x1f448;点击这里…

ESP-NETIF L2 TAP 接口-物联网嵌入式开发应用

ESP-NETIF L2 TAP 概述 ESP-NETIF L2 TAP 接口是 ESP-IDF 访问用户应用程序中的数据链路层&#xff08;OSI/ISO 中的 L2&#xff09;以进行帧接收和传输的机制。在嵌入式开发中&#xff0c;它通常用于实现非 IP 相关协议&#xff0c;如 PTP 和 Wake on LAN 等。 Tips : 目前…

xterm遇到的问题及解决方案

xterm遇到的问题及解决方案 /r插入终端导致的之后插入的数据覆盖了改行头部的数据 问题说明 如图所示&#xff0c;当在一行输入的候&#xff0c;输入的l插入到了改行的头部。 查看ws返回数据 可见ws返回的信息存在\r字符&#xff0c;在xterm.js中\r是回车字符的意思&…

springboot 工程使用proguard混淆

在 Maven 构建的 Spring Boot 项目中使用 ProGuard 进行代码混淆时&#xff0c;需要正确配置 Maven 插件和 ProGuard 的混淆规则。由于 Spring Boot 项目通常会依赖大量的反射机制和动态代理&#xff0c;因此必须特别小心确保这些部分在混淆过程中不会被破坏。 步骤 1&#xf…

我的秋招总结

我的秋招总结 个人背景 双非本&#xff0c;985硕&#xff0c;科班 准备情况 以求职为目的学习Java的时间大概一年。 八股&#xff0c;一开始主要是看B站黑马的八股文课程&#xff0c;背JavaGuide和小林coding还有面试鸭。 算法&#xff0c;250&#xff0c;刷了3遍左右 项目&…

Java Stream流详解——串行版

Stream流——串行版 ​ Stream流是java8引入的特性&#xff0c;极大的方便了我们对于程序内数据的操作&#xff0c;提高了性能。通过函数式编程解决复杂问题。 1.BaseStream<T,S extense BaseStream<T,S>> ​ 他是流处理的基石概念&#xff0c;重点不在于这个接…