CSS自定义属性变量

如何定义自定义属性

1. 自定义属性名

  • CSS 自定义属性的语法格式为 --*,双横线加上具体的自定义属性名,属性名是一个合法的 CSS 标识符即可。
  • 自定义属性没有具体的 CSS 含义,其用途完全由我们自己决定。自定义属性可以应用于任何元素,其可以被继承,并且支持级联,不支持动画

注意:与 CSS 属性不同,自定义属性是大小写敏感的。

CSS 不会被 all 属性重置,将来可能会定义一个重置所有变量的属性。

2. 自定义属性值

自定义属性值的要求可以说是非常地宽松,可以是任何有效的 CSS 值,如颜色、字符、布局的值、甚至是表达式。

既然自定义属性值的要求如此宽松,那我们只需要知道有哪些情况不允许即可。

只要自定义属性值不存在以下几种情况即为合法:无效字符值、无效 url 值、未配对的 ) / ] / },不能在最外层出现 ;,不能出现 !

有个例外,自定义属性后面可以跟 !important,但是添加的 !important 无效,因为在进行属性值检测前就会被移除。

3. 例子🌰

css 复制代码
/* 根伪类 :root, 可以在HTML文档的任何地方访问到 */
:root { 
    --main-color: red; 
    --bg-color: pink; 
    --main-font-size: 15px; 
}
span { 
    --color: green;
}
.test{ 
    color: var(--main-color);
}

自定义属性备用值

var() 函数可以定义多个备用值(fallback value),当给定值未定义时将会用备用值替换

css 复制代码
.two {
  color: var(--my-var, red); /* Red if --my-var is not defined */
}

.three {
  background-color: var(
    --my-var,
    --my-background,
    pink
  ); /* Invalid: "--my-background, pink" */
}

在JavaScript中修改自定义变量

在 JavaScript 中获取或者修改 CSS 变量和操作普通 CSS 属性是一样的:

js 复制代码
// 获取一个 Dom 节点上的 CSS 变量
element.style.getPropertyValue("--my-var");

// 获取任意 Dom 节点上的 CSS 变量
getComputedStyle(element).getPropertyValue("--my-var");

// 修改一个 Dom 节点上的 CSS 变量
element.style.setProperty("--my-var", jsVar + 4);

兼容性处理

  1. 可以使用 @support 命令进行检测。
css 复制代码
@supports ( (--a: 0)) {
  /* support */
}

@supports ( not (--a: 0)) {
  /* not support */
}
  1. 对于不支持 CSS 变量的浏览器,可以采用下面的写法。
css 复制代码
a {
  color: #7F583F;
  color: var(--primary);
}
相关推荐
文心快码BaiduComate19 分钟前
从个人效能到组织资产:文心快码企业版Agent Hub上线,提升团队AI编程效能
前端·后端·程序员
咖啡星人k34 分钟前
从需求到交付:我用MonkeyCode的AI Agent完成了一个React数据看板
前端·人工智能·react.js·monkeycode
sxlishaobin36 分钟前
linux 自动清除日志 脚本
linux·服务器·前端
ZC跨境爬虫1 小时前
跟着 MDN 学CSS day_37:(从文档流到粘性定位的底层原理)
前端·javascript·css·ui·html
IccBoY1 小时前
NVM超详细全解教程:解决Node版本冲突(Win/Mac/Linux安装+使用+踩坑合集)
前端·node.js
wuhen_n1 小时前
前端工程师进阶提示词工程实战
前端·langchain·ai编程
GISer_Jing1 小时前
Claude Code MCP Server 集成全解析
前端·人工智能·ai·架构
蚰蜒螟1 小时前
走进 Linux 内核:从 touch 命令到磁盘 inode 的完整旅程
java·linux·前端
因_崔斯汀1 小时前
用 AI 编程助手从零生成 3D 智慧校园数据大屏 —— Claude Code 实战全记录
前端
前端Hardy1 小时前
CSS 动画真的比 JS 快?Josh Comeau 做了组实验,结果跟直觉不一样
前端·javascript·后端