JavaScript操作CSS自定义属性的完整指南

作者:青山有信时间:2026-10-31 17:24:08浏览:554

本文详解CSS自定义属性的定义、作用域及使用var()函数引用方法,重点讲解如何利用JavaScript的setProperty动态修改全局与局部CSS变量,并结合Vue框架实现动态背景切换的完整代码示例。

一、自定义属性

CSS自定义属性本质上是存储在样式表中的变量,命名规范以双短横线(--)开头。这类变量能够承载颜色、尺寸、字体等任意合法的CSS值,并支持在文档范围内复用,从而提升样式的可维护性。

:root {
  --primary-color: #3498db;
  --font-size: 16px;
}
 
body {
  color: var(--primary-color);
  font-size: var(--font-size);
}

二、定义自定义属性

通常建议在 :root 选择器中声明自定义属性,以便实现全局生效。当然,开发者也可以将自定义属性定义在任意特定的选择器中,此时其作用域将被限制在该选择器及其所有后代元素内部。

/* 全局定义 */
:root {
  --main-bg-color: #f0f0f0;
}
 
/* 局部定义 */
.header {
  --header-height: 60px;
  height: var(--header-height);
}

三、使用自定义属性

在CSS规则中,需通过 var() 函数来读取并应用自定义属性的值。

.button {
  background-color: var(--primary-color);
  padding: var(--padding, 10px); /* 提供默认值 */
}

四、JS动态修改自定义属性

const element = document.querySelector('.container');
element.style.setProperty('--local-color', '#0000ff'); // 修改局部变量
document.documentElement.style.setProperty('--global-color', '#00ffff'); // 修改全局变量

五、应用

一、自定义属性

一、自定义属性

<template>
  <div ref="leftBg" class="left-bg"></div>
  <button @click="updateTitleImageClass">切换伪类图片</button>
</template>
 
<script setup>
import { ref, onMounted } from 'vue';
 
const leftBg = ref(null);
const systemTitles = ['cat1', 'cat2', 'cat3'];
let currentTitleIndex = 0;
 
const getBackgroundSize = (title) => {
  // 根据标题返回不同的背景大小
  switch (title) {
    case 'cat1':
      return 'contain';
    case 'cat2':
      return 'cover';
    case 'cat3':
      return 'auto';
    default:
      return 'cover';
  }
};
 
const images = {};
 
const loadImages = async () => {
  for (const title of systemTitles) {
    try {
      const response = await fetch(`/${title}/title.jpg`);
      if (!response.ok) {
        throw new Error(`Failed to fetch image for ${title}`);
      }
      const blob = await response.blob();
      images[`/${title}/title.jpg`] = URL.createObjectURL(blob);
    } catch (error) {
      console.error(`Error loading image for ${title}:`, error);
    }
  }
};
onMounted(
  async () => {
    await loadImages();
    updateTitleImageClass();
  }
);
const updateTitleImageClass = async () => {
  if (!leftBg.value) {
    console.error('没有找到leftBg节点');
    return;
  }
 
  const systemTitle = systemTitles[currentTitleIndex];
  const imagePath = `/${systemTitle}/title.jpg`; // 根据系统标题获取图片路径
  if (!images[imagePath]) {
    console.log(`没有找到对应的图片路径: ${imagePath}`);
    return;
  }
  const imageUrl = images[imagePath]; // 获取图片路径
  // 设置自定义属性
  leftBg.value.style.setProperty('--background-image', `url(${imageUrl})`);
 
  const backgroundSize = getBackgroundSize(systemTitle);
  leftBg.value.style.setProperty('--background-image-size', backgroundSize);
 
  // 切换到下一个标题
  currentTitleIndex = (currentTitleIndex + 1) % systemTitles.length;
};
</script>
 
<style lang="scss" scoped>
.left-bg {
  width: 100%;
  height: 100px;
  position: relative;
 
  &::before {
    content: '';
    display: block;
    background-image: var(--background-image);
    background-size: var(--background-image-size, cover);
    background-position: center;
    background-repeat: no-repeat;
    width: 100px;
    height: 100%;
    position: absolute;
    top: 0rem;
    left: 0rem;
  }
}
</style>

至此,关于JavaScript操作CSS自定义属性的示例代码介绍完毕。如需了解更多相关技术细节,欢迎查阅本站往期文章或继续浏览后续内容,感谢您的支持!

作者最新文章
相关文章
更多