强大的CSS变量

在 CSS 中,变量(Custom Properties) 允许你定义可重用的值,方便在整个样式表中使用和修改。CSS 变量的基本语法如下:

1. 定义 CSS 变量

CSS 变量通常在 :root 伪类中定义,以便它们可用于整个文档:

css 复制代码
:root {
  --main-color: #3498db;
  --secondary-color: #2ecc71;
  --font-size: 16px;
}
  • 变量名称以 -- 开头,比如 --main-color
  • :root 选择器相当于 html,使变量全局可用

2. 使用 CSS 变量

在 CSS 规则中使用 var() 函数引用变量:

语法:var(自定义属性, 回退值)

css 复制代码
body {
  color: var(--main-color);
  font-size: var(--font-size);
}

button {
  background-color: var(--secondary-color);
  border: 2px solid var(--main-color);
}

回退值用法:

css 复制代码
/* 回退值 */

/* 在 component 的样式中:*/
.component .header {
  /* header-color 没有被设置,将使用回退值 blue */
  color: var(--header-color, blue);
}

.component .text {
  color: var(--text-color, black);
}

/* In the larger application's style: */
.component {
  --text-color: #080;
}

使用自定义属性作为回退值

css 复制代码
:root {
  --backup-bg-color: teal;
}

body {
  /* main-bg-color 没有被设置,将使用回退值 backup-bg-color。如果 backup-bg-color 没有被设置,将使用回退值 white。 */
  color: var(--main-bg-color, var(--backup-bg-color, white));
}

3. 变量的作用域

  • 变量可以定义在 :root 作用域,全局可用
  • 也可以在特定的元素中定义,仅该元素及其子元素可以使用
css 复制代码
.card {
  --card-bg: #f5f5f5;
  background-color: var(--card-bg);
}

4. 提供默认值

如果变量未定义,可以使用 var() 提供默认值:

css 复制代码
p {
  color: var(--text-color, black); /* 如果 --text-color 未定义,则使用 black */
}

5. 在 JavaScript 中操作 CSS 变量

CSS 变量可以通过 JavaScript 动态修改:

js 复制代码
document.documentElement.style.setProperty('--main-color', 'red');

6. CSS 变量 vs 预处理器变量

特性 CSS 变量 (var()) 预处理器变量 (SASS/LESS)
作用域 运行时可变 编译时确定
JavaScript 操作 可以修改 不能修改
计算 可与 calc() 结合使用 预计算

7. 使用场景:

- 动态主题切换

动态主题切换

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        :root {
            --bg-color: white;
            --text-color: black;
        }

        .dark-theme {
            --bg-color: black;
            --text-color: white;
        }

        body {
            background-color: var(--bg-color);
            color: var(--text-color);
        }
    </style>
</head>
<body>
<button onclick="handleClick(event)">深色主题</button>
<script>
    let isDeep = false;
   function handleClick(e) {
       document.body.classList.toggle('dark-theme');
       isDeep = !isDeep;
       e.target.innerHTML = isDeep ? '浅色主题' : '深色主题';
   }
</script>
</body>
</html>
- 动态hover

动态hover

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <style>
    div {
      width: 100px;
      height: 100px;
      background-color: #ccc;
    }
    div:hover {
      background-color: var(--hover-bg);
    }
  </style>
</head>
<body>
  <div id="box" style="--hover-bg: none">hello</div>
  <select id="select">
    <option value="red">红</option>
    <option value="green">绿</option>
    <option value="blue">蓝</option>
  </select>
  <script>
    const select = document.getElementById('select');
    const box = document.getElementById('box');
    box.style.setProperty('--hover-bg', select.value);
    const handleChange = (e) => {
      const value = e.target.value;
      box.style.setProperty('--hover-bg', value);
    }
    select.addEventListener('change', handleChange);
  </script>
</body>
</html>

CSS 变量非常适合 主题切换、响应式设计、动态样式调整 等场景。 🚀

相关推荐
哆啦A梦15889 分钟前
uniapp分包实现
前端·vue.js·uni-app·vue3
wordbaby14 分钟前
Hooks的革命:让React的非UI逻辑也能像UI组件一样自由复用和组合
前端·react.js
flower_tomb31 分钟前
对浏览器事件机制的理解
前端·javascript·vue.js
用户4582031531731 分钟前
使用Trae做一个简单的天狗食日动画效果试试
前端·trae
普通码农33 分钟前
Vue Element Plus X 部署后资源加载失败问题
前端
超人不会飛34 分钟前
仿豆包 H5应用核心模板:用Vue快速复刻大模型对话体验
前端·javascript·vue.js
程序张38 分钟前
Vue3+Vite 现代化前端框架👊打破 Chrome 83 内核限制
前端·javascript·vue.js
拜无忧39 分钟前
【教程】Vue中级转React终极指南-理解Vue和React的差异
前端·vue.js·react.js
web前端12341 分钟前
Android开发四大组件详解
前端
木辰風41 分钟前
idea npm install 很慢(nodejs)
前端·npm·node.js