CSS 变量,正式名称为 CSS 自定义属性(Custom Properties),是 CSS 中一种强大的功能,它允许开发者在样式表中定义可重用的值。与传统 CSS 预处理器变量不同,CSS 变量是浏览器原生支持的,具有动态性和作用域特性,这使得它们在主题切换场景中表现出色。
CSS 变量的基本语法
CSS 变量以两个连字符开头(--
),并通过 var()
函数来引用:
css
:root {
--primary-color: #4285f4;
--secondary-color: #34a853;
}
.button {
background-color: var(--primary-color);
color: white;
}
作用域特性
CSS 变量遵循标准的作用域规则,类似于编程语言中的变量作用域:
- 全局作用域:在
:root
选择器中定义的变量可在整个文档中使用 - 局部作用域:在特定选择器中定义的变量只在该选择器及其子元素中可用
css
:root {
--global-var: 20px;
}
.container {
--local-var: red;
font-size: var(--global-var);
color: var(--local-var);
}
/* 这里无法访问 --local-var */
.other-element {
color: var(--local-var); /* 无效,将回退 */
}
主题切换的实现原理
利用 CSS 变量的作用域特性,我们可以轻松实现主题切换:
- 定义不同主题的变量集
- 通过切换类名或属性来改变变量值
- 所有使用这些变量的元素会自动更新
css
/* 默认主题(浅色) */
:root {
--bg-color: #ffffff;
--text-color: #333333;
--primary: #4285f4;
}
/* 深色主题 */
[data-theme="dark"] {
--bg-color: #1a1a1a;
--text-color: #f0f0f0;
--primary: #8ab4f8;
}
body {
background-color: var(--bg-color);
color: var(--text-color);
}
.button {
background-color: var(--primary);
}
JavaScript 交互实现主题切换
通过简单的 JavaScript 代码,我们可以动态切换主题:
javascript
// 切换主题函数
function toggleTheme() {
const html = document.documentElement;
const currentTheme = html.getAttribute('data-theme');
if (currentTheme === 'dark') {
html.removeAttribute('data-theme');
} else {
html.setAttribute('data-theme', 'dark');
}
}
// 监听主题切换按钮
document.getElementById('theme-toggle').addEventListener('click', toggleTheme);
优势与最佳实践
- 性能优势:CSS 变量由浏览器原生支持,比通过 JavaScript 直接修改样式性能更好
- 维护性:所有主题相关的颜色和尺寸集中管理,易于维护
- 渐进增强:可以为不支持 CSS 变量的浏览器提供回退方案
- 动态计算:可以结合 calc() 函数实现动态计算
css
:root {
--base-size: 16px;
--large-size: calc(var(--base-size) * 1.5);
}
实际应用示例
以下是一个完整的多主题切换实现:
html
<!DOCTYPE html>
<html lang="en" data-theme="light">
<head>
<style>
:root {
--bg: #ffffff;
--text: #333333;
--primary: #4285f4;
--border: #e0e0e0;
}
[data-theme="dark"] {
--bg: #1a1a1a;
--text: #f0f0f0;
--primary: #8ab4f8;
--border: #444444;
}
body {
background: var(--bg);
color: var(--text);
font-family: sans-serif;
transition: background 0.3s, color 0.3s;
}
.card {
background: var(--bg);
border: 1px solid var(--border);
padding: 20px;
margin: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
button {
background: var(--primary);
color: white;
border: none;
padding: 10px 15px;
border-radius: 4px;
cursor: pointer;
}
.theme-switcher {
position: fixed;
top: 20px;
right: 20px;
}
</style>
</head>
<body>
<div class="theme-switcher">
<button id="toggle-theme">切换主题</button>
</div>
<div class="card">
<h2>主题切换演示</h2>
<p>使用CSS变量实现的主题切换功能,点击右上角按钮体验。</p>
</div>
<script>
document.getElementById('toggle-theme').addEventListener('click', function() {
const html = document.documentElement;
const currentTheme = html.getAttribute('data-theme');
html.setAttribute('data-theme', currentTheme === 'dark' ? 'light' : 'dark');
});
</script>
</body>
</html>
CSS 变量为现代Web开发提供了强大的主题管理能力,通过合理利用其作用域特性,开发者可以创建灵活、可维护的主题系统,为用户提供个性化的视觉体验。