Vue3 v-bind绑定css中的var变量实现动态样式

在日常的开发中,我们常常遇到这样的需求:点击一个button改变页面中某个元素的样式,在这样的场景中,我们可以使用v-bind绑定css中的var变量,来动态的切换元素的样式

一个小栗子,在setup语法糖环境下,点击一个button动态切换另一个元素的背景色

javascript 复制代码
<template>
  <div class="box">
    <div class="intro">
      <div class="btxt" :style="{'--text-color':textColor}">使用v-bind绑定语法糖中的颜色常量的值给style中的变量</div>
    </div>
    <div class="intro">
      <div class="btn" @click="changeColor">点击button改变textColor的值,动态更新颜色的值</div>
    </div>
  </div>
</template>
<script setup>
import { ref } from 'vue'
const textColor = ref("blue");
const changeColor = () => {
  if (textColor.value === "blue") {
    textColor.value = "pink";
  } else {
    textColor.value = "blue"
  } 
  
};
</script>
<style scoped lang="less">
.box{
  display: flex;
  flex-direction: column;

  .intro{
    background-color: antiquewhite;
    margin: 10px;
    padding: 15px;

    .btn{
      display: inline-block;
      padding: 18px 35px 18px 35px;
    }
  }
}
.btxt{
  padding: 18px 35px 18px 35px;
  color: var(--text-color);
}
</style>

一个小栗子,在非setup语法糖的环境下使用v-bind绑定css中的var变量,实现当鼠标悬停在一个button上时配置button的伪类hover中的背景色,点击button后通过切换var变量对应的颜色值,动态切换button的背景色,代码如下:

javascript 复制代码
<template>
  <div class="box">
    <div class="btn" :style="{'--color-back':backColor}" @click="changeEvent">
      使用v-bind绑定非setup语法糖环境下的style值
    </div>
  </div>
</template>
<script>
export default{
  name:"ChangeButton",
  data(){
    return {
      backColor: "cadetblue"
    }
  },
  methods:{
    changeEvent(){
      let color = this.$data.backColor
      if (color === "cadetblue") {
        this.$data.backColor = "orange"
      } else {
        this.$data.backColor = "cadetblue"
      }
    }
  }
}
</script>
<style scoped lang="less">
.box{
  .btn{
    background-color: var(--color-back);
    display: inline-block;
    padding: 18px 35px 18px 35px;
    border-radius: 5px;
  }
}
.btn:hover{
  background-color: lightgrey;
}
.btn:active{
  animation: changeck 0.3s ease;
}
@keyframes changeck {
  0% {
    transform: scale(1);
  }
  50% {
    transform: scale(0.95);
  }
  100% {
    transform: scale(1);
  }
}
</style>
javascript 复制代码
<template>
  <div class="box">
    <div class="intro">
      <change-button></change-button>
    </div>
  </div>
</template>
<script setup>
import ChangeButton from './components/index.vue'
</script>
<style scoped lang="less">
.box{
  display: flex;
  flex-direction: column;
}
</style>
相关推荐
昔人'15 分钟前
`list-style-type: decimal-leading-zero;`在有序列表`<ol></ol>` 中将零添加到一位数前面
前端·javascript·html
岁月宁静6 小时前
深度定制:在 Vue 3.5 应用中集成流式 AI 写作助手的实践
前端·vue.js·人工智能
心易行者6 小时前
10天!前端用coze,后端用Trae IDE+Claude Code从0开始构建到平台上线
前端
saadiya~7 小时前
ECharts 实时数据平滑更新实践(含 WebSocket 模拟)
前端·javascript·echarts
fruge7 小时前
前端三驾马车(HTML/CSS/JS)核心概念深度解析
前端·css·html
百锦再7 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
烛阴7 小时前
Lua 模块的完整入门指南
前端·lua
浪里行舟8 小时前
国产OCR双雄对决?PaddleOCR-VL与DeepSeek-OCR全面解析
前端·后端
znhy@1238 小时前
CSS易忘属性
前端·css
瓜瓜怪兽亚8 小时前
前端基础知识---Ajax
前端·javascript·ajax