通过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>
相关推荐
BD_Marathon1 小时前
【JavaWeb】CSS_三种引入方式
前端·css
Hy行者勇哥4 小时前
HTML5 + 原生 CSS + 原生 JS 网页实现攻略
javascript·css·html5
小飞侠在吗9 小时前
vue props
前端·javascript·vue.js
大怪v10 小时前
【Virtual World 03】上帝之手
前端·javascript
招来红月12 小时前
记录JS 实用API
javascript
霍夫曼12 小时前
UTC时间与本地时间转换问题
java·linux·服务器·前端·javascript
꒰ঌ小武໒꒱12 小时前
文件上传全维度知识体系:从基础原理到高级优化
javascript·node.js
用户479492835691514 小时前
JavaScript 今天30 岁了,但连自己的名字都不属于自己
javascript
用户479492835691514 小时前
Vite8来啦,告别 esbuild + Rollup,Vite 8 统一用 Rolldown 了
前端·javascript·vite