第3章: CSS变量和自定义属性深度解析
🎯 本章重点
- CSS变量的定义和使用
- 动态主题切换实现
- 变量与JavaScript交互
📖 内容概述
3.1 基础语法
变量定义
:root {
--primary-color: #3498db;
--secondary-color: #2ecc71;
--spacing: 1rem;
--border-radius: 8px;
}
变量使用
.button {
background-color: var(--primary-color);
padding: var(--spacing);
border-radius: var(--border-radius);
}
3.2 变量作用域
全局作用域
:root {
--global-color: #ff6b6b;
}
.element {
color: var(--global-color);
}
局部作用域
.container {
--local-size: 200px;
width: var(--local-size);
}
/* 其他元素无法访问 --local-size */
3.3 默认值和回退
.element {
/* 如果 --custom-color 未定义,使用 #ccc */
color: var(--custom-color, #ccc);
/* 多重回退 */
margin: var(--spacing, var(--default-spacing, 1rem));
}
3.4 动态主题切换
CSS变量定义主题
:root {
--bg-primary: #ffffff;
--text-primary: #333333;
--accent-color: #007bff;
}
[data-theme="dark"] {
--bg-primary: #1a1a1a;
--text-primary: #ffffff;
--accent-color: #4ecdc4;
}
应用主题
body {
background-color: var(--bg-primary);
color: var(--text-primary);
}
.button {
background-color: var(--accent-color);
}
3.5 与JavaScript交互
获取和设置变量
// 获取变量值
const primaryColor = getComputedStyle(document.documentElement)
.getPropertyValue('--primary-color');
// 设置变量值
document.documentElement.style.setProperty(
'--primary-color',
'#ff6b6b'
);
主题切换函数
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
document.documentElement.setAttribute('data-theme', newTheme);
localStorage.setItem('theme', newTheme);
}
3.6 高级用法
计算动态值
:root {
--base-size: 16px;
--scale: 1.2;
--size-1: calc(var(--base-size) * var(--scale));
--size-2: calc(var(--size-1) * var(--scale));
--size-3: calc(var(--size-2) * var(--scale));
}
响应式变量
:root {
--spacing: 1rem;
}
@media (min-width: 768px) {
:root {
--spacing: 2rem;
}
}
3.7 实战案例
组件变量系统
.card {
--card-padding: 1.5rem;
--card-border-radius: 12px;
--card-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
padding: var(--card-padding);
border-radius: var(--card-border-radius);
box-shadow: var(--card-shadow);
}
.card--large {
--card-padding: 2rem;
--card-border-radius: 16px;
}
💡 最佳实践
- 命名规范: 使用有意义的变量名
- 组织变量: 按功能或组件分组
- 提供默认值: 确保优雅降级
- 响应式设计: 结合媒体查询使用
🎯 下一章预览
下一章将深入探讨Flexbox布局的实战应用。
最后更新: 2024年12月