通过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>
相关推荐
wuhen_n1 小时前
JavaScript链表与双向链表实现:理解数组与链表的差异
前端·javascript
wuhen_n1 小时前
JavaScript数据结构深度解析:栈、队列与树的实现与应用
前端·javascript
我是一只puppy1 小时前
使用AI进行代码审查
javascript·人工智能·git·安全·源代码管理
颜酱1 小时前
从二叉树到衍生结构:5种高频树结构原理+解析
javascript·后端·算法
Mr Xu_3 小时前
Vue 3 中计算属性的最佳实践:提升可读性、可维护性与性能
前端·javascript
子兮曰4 小时前
深入理解滑块验证码:那些你不知道的防破解机制
前端·javascript·canvas
Highcharts.js4 小时前
【Highcharts】如何用命令行渲染导出图片?
javascript·导出·开发文档·highcharts·命令行渲染·命令行功能
会一丢丢蝶泳的咻狗4 小时前
Sass实现,蛇形流动布局
前端·css
陈振wx:zchen20085 小时前
JavaScript
javascript·js
我是伪码农5 小时前
Vue 智慧商城项目
前端·javascript·vue.js