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;
    }
相关推荐
前端付豪2 小时前
Vue 中的 JSX:让组件渲染更灵活的正确方式
前端·javascript·vue.js
在泡泡里2 小时前
前端规范【四】eslint(antfu)、lefthook、commitlint
前端
烛阴2 小时前
Python 几行代码,让你的照片秒变艺术素描画
前端·python
Jolyne_3 小时前
如何实现无感刷新Token
前端
用户4099322502123 小时前
Vue3响应式系统的底层原理与实践要点你真的懂吗?
前端·ai编程·trae
qq_479875433 小时前
RVO和移动语义
前端·算法
加菲喵3 小时前
深度解析:在vue3中使用自定义Hooks
前端
hxmmm3 小时前
js中生成器和迭代器
前端
黄交大彭于晏4 小时前
UniApp 全局通知功能实现
前端·vue.js·uni-app