CSS变量

CSS变量(也称为CSS自定义属性)允许你在CSS中定义可重用的值,使样式更加一致、易于维护和动态。CSS变量是CSS中最强大的特性之一,它可以帮助你创建更灵活、更易于维护的样式表。

基础语法

CSS变量以--开头,后跟变量名。可以在任何CSS规则中定义变量,但通常在:root伪类中定义全局变量。

css
/* 全局变量 */
:root {
  --primary-color: #3498db;
  --secondary-color: #2ecc71;
  --font-size: 16px;
}

/* 局部变量 */
.container {
  --container-padding: 20px;
}

使用var()函数来引用变量:

css
.element {
  color: var(--primary-color);
  font-size: var(--font-size);
}

.container {
  padding: var(--container-padding);
}

变量的作用域

CSS变量的作用域与CSS规则的作用域相同:

  • :root中定义的变量是全局变量,可以在整个文档中使用
  • 在特定选择器中定义的变量是局部变量,只能在该选择器及其子选择器中使用
css
:root {
  --global-color: red;
}

.container {
  --local-color: blue;
  color: var(--local-color); /* 使用局部变量 */
}

.child {
  color: var(--local-color); /* 可以访问父元素的局部变量 */
  background-color: var(--global-color); /* 可以访问全局变量 */
}

.other {
  color: var(--local-color); /* 无法访问.container的局部变量 */
}

变量的继承

CSS变量会被子元素继承,这意味着子元素可以访问父元素中定义的变量。

css
.parent {
  --parent-color: red;
}

.child {
  color: var(--parent-color); /* 继承父元素的变量 */
}

变量的默认值

var()函数可以接受第二个参数作为默认值,当变量未定义时使用。

css
.element {
  color: var(--undefined-color, blue); /* 如果--undefined-color未定义,将使用blue */
}

变量的操作

CSS变量可以与其他CSS值结合使用,也可以进行简单的数学运算。

与其他值结合

css
:root {
  --base-font-size: 16px;
  --heading-font-size: calc(var(--base-font-size) * 2);
}

h1 {
  font-size: var(--heading-font-size); /* 32px */
}

数学运算

使用calc()函数可以对变量进行数学运算:

css
:root {
  --spacing-unit: 10px;
}

.element {
  margin: calc(var(--spacing-unit) * 2); /* 20px */
  padding: calc(var(--spacing-unit) + 5px); /* 15px */
  width: calc(100% - var(--spacing-unit) * 4); /* 100%减去40px */
}

颜色操作

可以使用rgba()函数结合变量创建新的颜色:

css
:root {
  --primary-color: #3498db;
}

.element {
  background-color: var(--primary-color);
  box-shadow: 0 0 10px rgba(var(--primary-color), 0.5); /* 注意:这不会直接工作,因为var(--primary-color)返回的是#3498db */
}

对于颜色操作,需要将颜色分解为RGB或HSL值:

css
:root {
  --primary-color-red: 52;
  --primary-color-green: 152;
  --primary-color-blue: 219;
}

.element {
  background-color: rgb(var(--primary-color-red), var(--primary-color-green), var(--primary-color-blue));
  box-shadow: 0 0 10px rgba(var(--primary-color-red), var(--primary-color-green), var(--primary-color-blue), 0.5);
}

动态修改变量

CSS变量可以通过JavaScript动态修改,这使得创建主题切换、交互式UI等功能变得非常容易。

javascript
// 获取根元素
const root = document.documentElement;

// 设置变量值
root.style.setProperty('--primary-color', '#e74c3c');

// 获取变量值
const primaryColor = getComputedStyle(root).getPropertyValue('--primary-color');
console.log(primaryColor); // 输出: #e74c3c

变量的最佳实践

命名规范

为变量使用有意义的名称,并遵循一致的命名规范:

css
/* 推荐的命名方式 */
:root {
  --color-primary: #3498db;
  --color-secondary: #2ecc71;
  --spacing-xs: 5px;
  --spacing-sm: 10px;
  --spacing-md: 20px;
  --spacing-lg: 30px;
  --font-size-sm: 12px;
  --font-size-md: 16px;
  --font-size-lg: 24px;
  --border-radius-sm: 4px;
  --border-radius-md: 8px;
  --box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}

组织变量

将变量组织成逻辑组,例如颜色、间距、字体大小等:

css
:root {
  /* 颜色 */
  --color-primary: #3498db;
  --color-secondary: #2ecc71;
  --color-text: #333333;
  --color-background: #ffffff;
  --color-border: #eeeeee;
  
  /* 间距 */
  --spacing-xs: 5px;
  --spacing-sm: 10px;
  --spacing-md: 20px;
  --spacing-lg: 30px;
  --spacing-xl: 40px;
  
  /* 字体 */
  --font-family: Arial, sans-serif;
  --font-size-sm: 12px;
  --font-size-md: 16px;
  --font-size-lg: 24px;
  --font-weight-normal: 400;
  --font-weight-bold: 700;
  
  /* 边框 */
  --border-width: 1px;
  --border-style: solid;
  --border-radius-sm: 4px;
  --border-radius-md: 8px;
  --border-radius-lg: 16px;
  
  /* 阴影 */
  --box-shadow-sm: 0 2px 4px rgba(0,0,0,0.1);
  --box-shadow-md: 0 4px 8px rgba(0,0,0,0.1);
  --box-shadow-lg: 0 8px 16px rgba(0,0,0,0.1);
}

主题切换

使用CSS变量实现主题切换是最常见的应用之一:

css
:root {
  --color-primary: #3498db;
  --color-background: #ffffff;
  --color-text: #333333;
}

[data-theme="dark"] {
  --color-primary: #9b59b6;
  --color-background: #2c3e50;
  --color-text: #ffffff;
}

body {
  background-color: var(--color-background);
  color: var(--color-text);
}

.button {
  background-color: var(--color-primary);
  color: white;
}

结合JavaScript切换主题:

javascript
function toggleTheme() {
  const root = document.documentElement;
  const currentTheme = root.getAttribute('data-theme');
  const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
  root.setAttribute('data-theme', newTheme);
}

浏览器兼容性

CSS变量在现代浏览器中有很好的支持:

  • Chrome 49+
  • Firefox 31+
  • Safari 9.1+
  • Edge 16+
  • IE 不支持

对于旧版本浏览器的支持,可以使用CSS预处理器(如Sass、Less)的变量功能,或者使用JavaScript polyfill。

CSS变量 vs 预处理器变量

CSS变量与Sass、Less等预处理器的变量有一些重要的区别:

特性 CSS变量 预处理器变量
作用域 基于CSS选择器 全局或局部(基于预处理器语法)
动态修改 可以通过JavaScript动态修改 编译后固定,无法动态修改
继承 支持继承 不支持继承
默认值 支持默认值 不支持默认值
浏览器支持 现代浏览器支持 编译后生成普通CSS,支持所有浏览器

总结

CSS变量是CSS中最强大的特性之一,它可以帮助你:

  • 创建更一致、更易于维护的样式
  • 实现动态主题切换
  • 减少样式代码的重复
  • 提高样式的灵活性

通过合理使用CSS变量,你可以创建更高效、更易于维护的样式表,提高开发效率和用户体验。