通过js动态更新css变量

一、vue2:

全局:

复制代码
<template>
  <div>
    <p>当前背景色由 CSS 变量控制</p>
    <button @click="toggleTheme">切换主题</button>
  </div>
</template>

<script>
export default {
  name: 'App',
  data() {
    return {
      themeColor: '#42b883' // 响应式数据
    }
  },
  watch: {
    themeColor(newVal) {
      // 更新 :root 上的 CSS 变量
      document.documentElement.style.setProperty('--theme-color', newVal)
    }
  },
  mounted() {
    // 初始化 CSS 变量(确保首次渲染生效)
    this.updateCssVar()
  },
  methods: {
    toggleTheme() {
      this.themeColor = this.themeColor === '#42b883' ? '#e66767' : '#42b883'
    },
    updateCssVar() {
      document.documentElement.style.setProperty('--theme-color', this.themeColor)
    }
  }
}
</script>

<style>
:root {
  --theme-color: #f0f0f0; /* 默认值 */
}

body {
  background-color: var(--theme-color);
  color: white;
  padding: 20px;
  transition: background-color 0.3s;
}
</style>

局部:

复制代码
<template>
  <div ref="box" class="dynamic-box">
    <p>局部 CSS 变量示例</p>
    <button @click="increaseSize">增大尺寸</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      size: 100
    }
  },
  methods: {
    increaseSize() {
      this.size += 20
      this.$nextTick(() => {
        // 确保 DOM 已更新(虽然这里没改模板结构,但保险起见)
        const el = this.$refs.box
        if (el) {
          el.style.setProperty('--box-size', this.size + 'px')
        }
      })
    }
  },
  mounted() {
    // 初始化
    this.$refs.box.style.setProperty('--box-size', this.size + 'px')
  }
}
</script>

<style scoped>
.dynamic-box {
  --box-size: 100px;
  width: var(--box-size);
  height: var(--box-size);
  background: #409eff;
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: width 0.2s, height 0.2s;
}
</style>

vue3:

全局:

复制代码
<template>
  <div class="box">Hello, CSS Variables!</div>
  <button @click="changeColor">切换颜色</button>
</template>

<script setup>
import { ref, watch } from 'vue'

const bgColor = ref('#42b883')

// 监听 bgColor 变化,并同步到 :root 的 CSS 变量
watch(bgColor, (newColor) => {
  document.documentElement.style.setProperty('--bg-color', newColor)
})

function changeColor() {
  bgColor.value = bgColor.value === '#42b883' ? '#e66767' : '#42b883'
}
</script>

<style>
:root {
  --bg-color: #f0f0f0; /* 默认值 */
}

.box {
  background-color: var(--bg-color);
  padding: 20px;
  color: white;
  transition: background-color 0.3s;
}
</style>

局部:

复制代码
<template>
  <div ref="container" class="container">
    <p>局部 CSS 变量控制</p>
    <button @click="updateRadius">增大圆角</button>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const container = ref(null)
let radius = 10

function updateRadius() {
  radius += 5
  if (container.value) {
    container.value.style.setProperty('--border-radius', `${radius}px`)
  }
}
</script>

<style scoped>
.container {
  --border-radius: 10px;
  border: 2px solid #ccc;
  border-radius: var(--border-radius);
  padding: 16px;
  transition: border-radius 0.2s;
}
</style>
相关推荐
像我这样帅的人丶你还17 小时前
别再让JS耽误你进步了。
css·vue.js
@yanyu66617 小时前
07-引入element布局及spring boot完善后端
javascript·vue.js·spring boot
@大迁世界18 小时前
2026年React大洗牌:React Hooks 将迎来重大升级
前端·javascript·react.js·前端框架·ecmascript
风止何安啊18 小时前
为什么要有 TypeScript?让 JS 告别 “薛定谔的 Bug”
前端·javascript·面试
海天鹰19 小时前
SOC架构
javascript
前进的李工20 小时前
MySQL角色管理:权限控制全攻略
前端·javascript·数据库·mysql
NPE~20 小时前
[App逆向]环境搭建下篇 — — 逆向源码+hook实战
android·javascript·python·教程·逆向·hook·逆向分析
洒满阳光的庄园20 小时前
Electron 桌面端打包流程说明
前端·javascript·electron
子琦啊20 小时前
【算法复习】数组与双指针篇
javascript·算法
SuperEugene20 小时前
前端通用基础组件设计:按钮/输入框/弹窗,统一设计标准|组件化设计基础篇
前端·javascript·vue.js·架构