前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CSS自定义属性:引入 | 使用var() | cal()计算 | css 与 js 的连接

CSS自定义属性:引入 | 使用var() | cal()计算 | css 与 js 的连接

作者头像
科技新语
发布2022-08-10 09:41:34
1.2K0
发布2022-08-10 09:41:34
举报

引入

自定义属性,是一种开发者可以自主命名和使用的CSS属性。浏览器在处理像 color 、position 这样的属性时,需要接收特定的属性值,而自定义属性,在开发者赋予它属性值之前,它是没有意义的。所以要怎么给 CSS 自定义属性赋值呢?这倒和习惯无异:

代码语言:javascript
复制
.foo {
	color: red;
	--theme-color:gray;
}
复制代码

自定义元素的定义由 -- 开头,这样浏览器能够区分自定义属性和原生属性,

假如只是定义了一个自定义元素和它的属性值,浏览器是不会做出反应的。如上面的代码, .foo 的字体颜色由 color 决定,但 --theme-color 对 .foo 没有作用

可以用 CSS 自定义元素存储任意有效的 CSS 属性值:

代码语言:javascript
复制
.foo {
	--theme-color:blue;
	--spacer-width: 8px;
	--favorite-number: 3;
	--greeting: "How are you";
	--reusable-shadow: 0 3px 1px -2px rgba(0,0,0,0.85);
}
复制代码

使用

使用 var() 方法实现:

代码语言:javascript
复制
.button {
	background-color: var(--theme-color);
}
复制代码

这段代码中,我们把.button的background-color属性赋值为 --theme-color的值。

同时,这个--theme-color能用在任意选择器和属性上:

代码语言:javascript
复制
.button {
	background-color: var(--theme-color);
}
p {
	color: var(--theme-color);
}
.title > .p {
	border-color: var(--theme-color);
}
复制代码
  • 缺省值

如果开发者并没有定义过 --theme-color 这个变量呢?var()可以接收第二个参数作为缺省值:

代码语言:javascript
复制
.button {
	background-color: var(--theme-color,gray);
}
复制代码

或者把另一个自定义属性作为缺省值:

代码语言:javascript
复制
.button {
	background-color: var(--theme-color,var(--default-bg-color));
}
复制代码

传参数时总是传入一个缺省值是一个好习惯,特别是在构建 web components 的时候。为了让你的页面在不支持自定义属性的浏览器上正常显示,别忘了加上兼容代码:

代码语言:javascript
复制
.button {
	background-color:gray;//兼容性处理
	background-color: var(--theme-color,gray);
}
复制代码

作用域和级联

自定义属性遵从标准的作用域和级联规则,开发者按照平时使用的习惯来就可以了!

你可能希望将 --theme-color 设置为全局变量,处处可用。最简单的方法是使用 :root 伪元素:

代码语言:javascript
复制
:root {
	--theme-color: gray;
}
复制代码

这样,整个document,都可以使用--theme-color

但当你希望不同的模块使用不同的 --theme-color 值怎么办呢?

只需要在模块的作用域中给属性重新赋值,新的颜色就会分模块生效,而不需要开发者一个个重置使用到 --theme-color 的属性。

代码语言:javascript
复制
section.about {
	--theme-color: darkblue;
}
section.contacts {
	--theme-color: darkred;//重新赋值
}
section.news {
	--theme-color: yellow;
}
复制代码

CSS计算

calc() 函数常常被用于跨单位的计算:

代码语言:javascript
复制
.child {
	width: calc(100% - 16px)
}
复制代码

事实上这个计算是在浏览器运行时进行的,浏览器会将 calc()的计算结果以像素单位呈现在屏幕上。

  • calc() 与 CSS 自定义属性结合
代码语言:javascript
复制
:root {
	--base-size: 4px;
	--title-multiplier: 5;
	--body-multiplier: 3;
}
.title {
	text-size: calc(var(--title-multiplier) * var(--base-size))
}
.body {
	text-size: calc(var(--body-multiplier)* var(--base-size));
}
复制代码

CSS 与 javascript之间的桥梁

自定义属性和 Sass、Less 或者 PostCSS 这些处理器语言一个非常重要的不同点在于:浏览器是可以解析自定义属性的。这就意味着开发者可以动态改变自定义属性的值。这是 CSS 迈出的一大步。

就和平时用 JS 操作元素任意的属性一般,自定义属性也可以通过 getPropertyValue setProperty 方法操作 :

代码语言:javascript
复制
const styles = getComputedStle(document.querySelector('.foo'));

const oldColor = styles.getPropertyValue('--color').trim();
foo.style.setProperty('--color','green');
复制代码

属性值一旦被改变,所有与这个自定义属性相关的 CSS 属性也都会发生改变,。这样就能轻松实现批量修改元素的属性值。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引入
  • 使用
  • 作用域和级联
  • CSS计算
  • CSS 与 javascript之间的桥梁
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档