css变量

CSS变量与一些"骚操作"

css样式同一个颜色值在几十处重复出现,改一次要全局替换;响应式布局中各种尺寸换算头大;想动态改样式只能靠JS硬操作?今天分享一些CSS变量+一些"骚操作",让样式代码从"乱糟糟"变"活起来"。

一、CSS变量

1. 基础用法:定义与使用

css 复制代码
/* 定义变量(通常放根元素,全局可用) */
:root {
  --primary-color: #42b983; /* 主色调 */
  --font-size-base: 16px;   /* 基础字体大小 */
  --spacing: 8px;           /* 基础间距 */
}

/* 使用变量 */
.btn {
  background: var(--primary-color);
  padding: var(--spacing) calc(var(--spacing) * 2); 
  font-size: var(--font-size-base);
}
  • 变量名必须以--开头,区分大小写(--color--Color是两个变量)
  • var(变量名, 默认值)调用,默认值可选(如var(--unknown, #fff)

2. 变量的"_scope魔法"

变量可以在任意选择器内定义,只在该作用域生效,实现样式隔离:

css 复制代码
/* 全局变量 */
:root { --text-color: #333; }

.card {
  --text-color: #666; /* 卡片内的局部变量 */
}

.card p {
  color: var(--text-color); /* 用的是.card内的#666 */
}

footer p {
  color: var(--text-color); /* 用的是全局的#333 */
}

3. 动态修改:从"死样式"到"活交互"

(1)媒体查询中改变量
css 复制代码
:root {
  --column-count: 2; /* 默认2列布局 */
}

/* 屏幕变大时自动改列数 */
@media (min-width: 1024px) {
  :root { --column-count: 4; }
}

.gallery {
  display: grid;
  grid-template-columns: repeat(var(--column-count), 1fr);
}
(2)JS直接操作变量
js 复制代码
//明亮与黑暗的切换
// 获取根元素
const root = document.documentElement;

// 改变量(切换暗黑模式示例)
document.getElementById('darkMode').addEventListener('click', () => {
  root.style.setProperty('--bg-color', '#1a1a1a');
  root.style.setProperty('--text-color', '#fff');
});

二、CSS骚操作:少写代码多做事

1. 用clamp()实现"智能响应式尺寸"

不用媒体查询,让字体/间距自动适应屏幕:

css 复制代码
:root {
  --min-font: 16px;
  --max-font: 20px;
  --screen-min: 320px;
  --screen-max: 1200px;
}

.title {
  /* 公式:clamp(最小值, 动态值, 最大值) */
  font-size: clamp(
    var(--min-font),
     calc(
      var(--min-font) + 
      (100vw - var(--screen-min)) * 
      (var(--max-font) - var(--min-font)) / 
      (var(--screen-max) - var(--screen-min))
    ),
    var(--max-font)
  );
}

屏幕越小字体越接近16px,越大越接近20px,自动过渡

2. :where()简化选择器权重

解决多层嵌套选择器权重太高,不好覆盖的问题:

css 复制代码
/* 普通写法:权重高,难覆盖 */
.header .nav .link { color: #333; }

/* 骚操作:权重为0,方便后续修改 */
:where(.header, .footer) :where(.nav .link) {
  color: #333;
}

/* 后续只需用低权重就能覆盖 */
.footer .link { color: #666; }

3. 变量+mask-image实现渐变遮罩

给图片加渐变遮罩,实现"渐隐"效果:

css 复制代码
:root {
  --mask-start: transparent;
  --mask-end: black;
}

.img-mask {
  /* 遮罩从左到右:透明→黑色(显示) */
  mask-image: linear-gradient(to right, var(--mask-start), var(--mask-end));
  -webkit-mask-image: linear-gradient(to right, var(--mask-start), var(--mask-end));
}

/* hover时反向遮罩 */
.img-mask:hover {
  --mask-start: black;
  --mask-end: transparent;
}

4. @property让变量支持动画

默认CSS变量不能直接动画,用@property声明类型即可:

css 复制代码
/* 声明变量类型为颜色 */
@property --color {
  syntax: '<color>';
  initial-value: #fff;
  inherits: false;
}

.box {
  background: var(--color);
  transition: --color 0.3s;
}

.box:hover {
  --color: #42b983; 
}

三、实战技巧:让变量更"能打"

  1. 主题管理:把主题色、圆角、阴影等抽成变量,换主题只需改变量值

    css 复制代码
    /* 浅色主题 */
    [data-theme="light"] {
      --bg: #fff;
      --text: #333;
    }
    
    /* 深色主题 */
    [data-theme="dark"] {
      --bg: #1a1a1a;
      --text: #fff;
    }
  2. 组件封装:给组件定义"可配置变量",使用者无需改源码就能定制

    css 复制代码
    .alert {
      /* 默认值 */
      --alert-bg: #f0f9eb;
      --alert-color: #1b745e;
      background: var(--alert-bg);
      color: var(--alert-color);
    }
    
    /* 使用者自定义警告样式 */
    .alert.warning {
      --alert-bg: #fffbeb;
      --alert-color: #92400e;
    }
相关推荐
Dragon Wu5 分钟前
Electron Forge集成React Typescript完整步骤
前端·javascript·react.js·typescript·electron·reactjs
芳草萋萋鹦鹉洲哦5 分钟前
【Tailwind】动画解读:Tailwind CSS Animation Examples
前端·css
华仔啊8 分钟前
jQuery 4.0 发布,IE 终于被放弃了
前端·javascript
一心赚狗粮的宇叔12 分钟前
03.Node.js依赖包补充说明及React&Node.Js项目
前端·react.js·node.js
子春一14 分钟前
Flutter for OpenHarmony:音律尺 - 基于Flutter的Web友好型节拍器开发与节奏可视化实现
前端·flutter
JarvanMo14 分钟前
150万开发者“被偷家”!这两款浓眉大眼的 VS Code 插件竟然是间谍
前端
亿元程序员16 分钟前
大佬,现在AI游戏开发教程那么多,你不搞点卖给大学生吗?
前端
未来龙皇小蓝27 分钟前
RBAC前端架构-02:集成Vue Router、Vuex和Axios实现基本认证实现
前端·vue.js·架构
晓得迷路了40 分钟前
栗子前端技术周刊第 116 期 - 2025 JS 状态调查结果、Babel 7.29.0、Vue Router 5...
前端·javascript·vue.js
顾北121 小时前
AI对话应用接口开发全解析:同步接口+SSE流式+智能体+前端对接
前端·人工智能