CSS 之 自定义属性(变量)

news2024/12/24 3:06:02

一、简介

​ CSS的自定义属性,又称为CSS变量或级联变量,用于定义一个带有值的、可重复使用的CSS属性(变量)。其包含的值可以在其作用域内的任意属性上重复使用,在使用时需要借助var()函数获取自定义属性的值。当自定义属性的值发生变化时,所有使用该自定义属性的CSS属性都会随之变化。

​ 通常会将项目中大量重复的样式属性值设置为自定义属性,例如:字体颜色、字体大小、主题色等等。这不仅提高了代码的可维护性和可读性,还使得样式的动态调整变得更加容易。当这些样式属性的值,需要变更时,只需要修改自定义属性的值即可,无需依次修改对应CSS样式属性的值。

​ 在使用自定义属性时,要注意浏览器兼容性:

在这里插入图片描述

二、基础语法

1、声明自定义属性

​ 声明一个自定义属性,需要在CSS的某个样式块(规则集)中,且必须以--作为属性名的开头,后面跟随其他合法字符组成自定义属性的属性名。属性值可以是任何有效的CSS样式值。

element {
	--test-color: red;
}

​ 自定义属性所在样式块的选择器决定了自定义属性的作用域,自定义属性只能在该选择器元素及其子孙元素中使用。如果想要设置一个全局的自定义属性,最佳实践是定义在根伪类:root的样式块内,这样就可以在HTML全局任何样式块中使用该自定义属性:

:root {
	--test-color: red;
}

注意: 自定义属性的名称是严格区分大小写的,--test--Test是两个完全不同的自定义属性。

2、使用自定义属性

​ 想要使用自定义属性,需要借助CSS的var()函数。var()函数需要放置在CSS样式的属性值位置上,内部包含一个自定义属性的名称。函数会寻到找对应的自定义属性,并把自定义属性的值插入作为当前样式的属性值。

.test-div {
	color: var(--test-color);
}

/* 样式效果等同于 */

.test-div {
	color: red;
}

​ 无论自定义属性是在样式块中的哪一行进行的声明,其都可以在当前样式块内的任意属性上被使用,无论该属性是位于自定义属性声明之前,还是自定义属性声明之后。

.test-div {
  /* 自定义属性声明之前的样式可以使用 */
	color: var(--test-color);
  /* 声明自定义属性 */
	--test-color: red;
   /* 自定义属性声明之后的样式可以使用 */
	background: var(--test-color);
}
3、继承

​ 后代元素会继承父元素中声明的自定义属性,在后代元素中可以使用到父元素中的自定义属性,换句话说:自定义属性可以在该选择器元素及其子孙元素中使用。

<template>
  <div class="father">
    <div class="son1">
      这是一个子元素
      <p>这是一个孙子元素</p>
    </div>
  </div>
</template>

<style scoped>
/* 父元素中定义自定义属性 */
.father {
  --test-color: red;
}
/* 子元素可以继承并使用该自定义属性 */
.son1 {
  color: var(--test-color);
}
/* 后代元素也可以继承并使用该自定义属性 */
.son1 > p {
  color: var(--test-color);
}
</style>
4、优先级

​ 如果在不同层级的样式块中定义了同名的自定义属性,则var()函数获取自定义属性值时,会按照就近原则获取。

​ 例如父元素定义了名为--test-color的自定义属性,而子元素同样定义了名为--test-color的自定义属性,则在子元素和孙子元素中通过var(--test-color)使用自定义属性时,按照就近原则,获取的将会是子元素中自定义属性的值。

<template>
  <div class="father">
    <div class="son1">
      这是一个子元素
      <p>这是一个孙子元素</p>
    </div>
    <div class="son2">
      这是第二个子元素
    </div>
  </div>
</template>

<style scoped>
.father {
  /* 父元素声明的自定义属性 */
  --test-color: red;
}
.son1 {
  /* 子元素声明的同名自定义属性 覆盖父元素 */
  --test-color: yellow;
  /* 就近原则 取到最近子元素的自定义属性 */
  color: var(--test-color);
}
.son1 > p {
  /* 孙子元素 取到子元素的自定义属性 */
  color: var(--test-color);
}
.son2 {
  /* 就近原则 子元素取到父元素的自定义属性 */
  color: var(--test-color);
}
</style>

​ 还有一条原则是:style行内样式中声明的自定义属性,其优先级大于CSS样式块中声明的自定义属性,最终通过var()使用自定义属性时,生效的是style行内样式中声明的自定义属性。

5、备用值(默认值)

​ 在通过var()函数使用自定义属性时,可以定义备用值,当自定义属性未定义或无法获取时,浏览器会将备用值设置为样式属性值。

var()函数有两个参数,第一个参数是引用的自定义属性名称,第二个可选参数就是备用值。备用值可以包含除换行符、分号等特殊字符外的常见字符。

/* 当自定义属性未定义时 取备用值 */
color: var(--test-color2, green);

var()函数允许在备用值中嵌套var(),但并不建议这么做,因为这可能会花费大量的时间在处理变量上,导致性能问题。

/* var()中嵌套var() */
color: var(--test-color2, var(--test-color, green));

​ 备用值中允许使用,连接多个值,但浏览器并不会将这些值进行分割,而是会将其作为一个整体,赋值给样式属性,通常来说,这样设置的属性值都是无效值。如果自定义属性是未定义的,且备用值也是无效的,那该样式属性将不会起作用,元素将会展示默认样式。

/* var()的备用值中使用 , 拼接多个值 */
color: var(--test-color2, green, blue);
/* 等同于 */
color: green, blue;

注意: 如果是浏览器不支持CSS自定义属性,那么设置备用值也不会起作用。

6、无效属性

​ 当自定义属性被解析时,浏览器并不知道其会在什么场景下使用,因此默认自定义属性的值都是有效的。但在具体使用自定义属性时,如果自定义属性的值与样式属性不匹配,就会导致样式属性成为一条无效属性。

​ 当浏览器遇到这种无效属性时,var()的备用值也不会起作用,因为确确实实是取到了值。元素最终的样式效果,会使用元素去掉该样式属性后的效果。

/* 当自定义属性无效时 备用值无效 取元素本身样式 */
font-size: var(--test-color, 40px);
/* 等同于 无效属性 */
font-size: red; 

注意: 当CSS中的属性值存在语法错误时,该属性会直接被忽略,如果还存在其他同名且合法的属性,则其他属性会正常起作用;但是如果是获取的自定义属性的值无效,其并不会被忽略,其他同名且合法的属性也会被该属性覆盖,从而不起作用,只能显示元素去掉该样式属性后的效果。

.son1 {
  /* 一个合法的属性 最终起作用 */
  font-size: 30px;
  /* 不合法的属性 会被忽略 */
  font-size: red;
}

.son2 {
  /* 一个合法的属性 会被无效属性覆盖 */
  font-size: 30px;
  /* 当自定义属性无效时 覆盖其他属性 只能展示元素本身的样式 */
  font-size: var(--test-color);
}
7、JavaScript操作

​ CSS的自定义属性还给我们提供了一种新的JS与CSS交互的方式,可以在JS中直接操控元素的CSS样式,实现样式的动态变化。在JS中,可以通过setProperty()方法设置或修改CSS自定义属性的值。该方法相当于设置了一个style行内样式,并在其中设置了一个自定义属性,这一点在DOM节点上也有所的体现。

声明自定义属性:
// 获取元素DOM
const el = document.querySelector('.father')
// 设置元素的CSS自定义属性的值
el.style.setProperty('--test-color', 'blue')

DOM节点:

<div class="father" style="--test-color: blue;">
  ...
</div>
修改自定义属性:

​ 在JS中只能修改style行内样式中的自定义属性(手动定义或setProperty设置),CSS样式块中的自定义属性无法修改,但是当在style行内样式中声明一个同名的自定义属性,由于其优先级高于CSS样式块中的自定义属性,因此起作用的是新声明的自定义属性。从效果来看,也算是修改了自定义属性的值,但并非真正意义的修改。

// 获取元素DOM
const el = document.querySelector('.father')
// 修改元素的CSS自定义属性的值
el.style.setProperty('--test-color', 'red')
获取自定义属性值:

​ 在JS中还可以通过getPropertyValue()获取style行内样式中的自定义属性(手动定义或setProperty设置)。同样,CSS样式块中的自定义属性无法被获取到。

<!-- 手动指定一个行内的自定义属性 -->
<div class="father" style="--test-color: #ccc">
  <!-- 。。。 -->
</div>

<script>
  // 获取元素DOM
  const el = document.querySelector('.father')
  // 获取元素style中的自定义属性的值
  console.log(el.style.getPropertyValue('--test-color')) // #ccc
  // 修改元素的自定义属性的值
  el.style.setProperty('--test-color', 'blue')
  // 再次获取元素style中的自定义属性的值
  console.log(el.style.getPropertyValue('--test-color')) // blue
  // 获取CSS样式块中的自定义属性 无法获取
  console.log(el.style.getPropertyValue('--test-size')) // 空
</script>

<style>
  .father {
    /* 样式块中的自定义属性 */
    --test-size: 20px;
  }
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1709841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

text-embedding 嵌入模型

为什么使用embedding 计算机只能处理数字&#xff0c;但我们希望它能够理解文字、图片或其他形式的数据。这就是embedding的作用。它将这些复杂的数据转换成数字表示&#xff0c;就像给它们贴上了标签一样。这些数字表示不仅保留了原始数据的重要信息&#xff0c;还能在计算机…

短视频商城全套源码:开启电商新纪元

随着数字媒体的快速发展&#xff0c;短视频平台已经成为人们获取信息、娱乐和社交的重要渠道。在这样一个大背景下&#xff0c;短视频商城的兴起&#xff0c;无疑为电商行业带来了新的机遇和挑战。本文将探讨短视频商城全套源码的重要性&#xff0c;以及它如何助力商家和开发者…

Vulnhub - AI-WEB-1.0靶机教程

目录 站点信息收集 c段扫描 端口扫描 目录扫描 漏洞利用 使用 burp 抓包 查询数据库名 查询数据库下的表 查询表中的字段名 查询字段中的数据 --os-shell 上传一句话木马 下载地址&#xff1a;https://download.vulnhub.com/aiweb/AI-Web-1.0.7z 我们从站点信息收…

2024年区块链,物联网与信息技术国际会议(ICBITIT 2024)

2024年区块链&#xff0c;物联网与信息技术国际会议&#xff08;ICBITIT 2024&#xff09; 2024 International Conference on Blockchain, Internet of Things, and Information Technology 会议简介&#xff1a; 2024年区块链&#xff0c;物联网与信息技术国际会议&#xff…

【调试笔记-20240528-Linux-用 OpenWrt-23.05 SDK 编译 frp 软件包】

调试笔记-系列文章目录 调试笔记-20240528-Linux-用 OpenWrt-23.05 SDK 编译 frp 软件包 文章目录 调试笔记-系列文章目录调试笔记-20240528-Linux-用 OpenWrt-23.05 SDK 编译 frp 软件包 前言一、调试环境操作系统&#xff1a;Ubuntu 22.04.4 LTS编译环境调试目标 二、调试步…

java函数编程-黑马学习笔记

第一章 01合格的函数 函数就是一个规则 合格的函数就是只要你输入相同&#xff0c;无论多少次调用&#xff0c;不论什么时间调用&#xff0c;输出是相同的。 函数可以引用外部的数据&#xff0c;但是需要去保证外部的数据不可变 static关键字修饰的静态方法本质上和函数没…

TCP 与 UDP

0. tcp 与 udp 的 异同特性 TCPUDPname传输控制协议用户数据报协议面向连接&#xff1f; 需要 传输数据前建立连接传输完毕后断开连接不需要可靠的传输数据&#xff1f; 可靠 有确认机制&#xff08;三次握手&#xff09; 有确认、窗口、重传、拥塞控制的机制保证数据可靠传输…

10Django项目--用户管理系统--改

对应视频链接点击直达 10Django项目--用户管理系统--改 对应视频链接点击直达改a&#xff0c;本质b&#xff0c;修改(更新) 页面相关a&#xff0c;index页面新增操作按钮b&#xff0c;修改(更新)页面c&#xff0c;路由和函数 OVER&#xff0c;不会有人不会吧不会的加Q139400651…

项目9-网页聊天室3(主界面之用户信息)

1.前端页面 CSS: 如何让img里的图片自适应div&#xff0c;且不变形_img自适应div大小 铺满且不变形-CSDN博客 JavaScript/jQuery 如何改变一个img元素的src属性|极客教程 (geek-docs.com) 2.要求 左上角显示用户的昵称和头像. 3.后端代码 3.1 添加拦截器 3.2 注册拦截器 …

深入解析MySQL 8中的角色与用户管理

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 深入解析MySQL 8中的角色与用户管理 前言角色和用户的基础概念用户&#xff08;User&#xff09;…

收银系统源码--零售连锁店铺如何选择适合自己的收银系统?

如果你现在还认为小便利店只要简单的收款&#xff0c;只有大型的连锁便利店才需要收银软件和管理软件&#xff0c;那你就错了&#xff0c;连锁品牌的便利店是必须要用到专业的收银软件&#xff0c;但是小微型的便利店更应该要用专门的软件&#xff0c; 在各行各业逐步革新互联网…

【ai】LiveKit Agent 的example及python本地开发模式工程实例

title: ‘LiveKit Agent Playground’ playgroundLiveKit Community playground的环境变量&#xff1a;LiveKit API # LiveKit API Configuration LIVEKIT_API_KEYYOUR_API_KEY LIVEKIT_API_SECRETYOUR_API_SECRET# Public configuration NEXT_PUBLIC_LIVEKIT_URLwss://YOUR_…

计算机网络基础 - 计算机网络和因特网(1)

计算机网络基础 计算机网络和因特网什么是 Internet?具体构造的的角度服务角度网络结构 网络边缘网络核心电路交换分组交换概述排队时延和分组丢失转发表和路由选择协议按照有无网络层的连接 分组交换 VS 电路交换 接入网DSL 因特网接入电缆因特网接入光纤到户 FTTH无线接入网…

十五、Python模块 1、(入门一定看!!!)「长期更新Python简单入门到适用」

首先什么是模块&#xff1f; 小伙伴们经常看我写的教程不难发现&#xff0c;前面我们用过几次模块就是sys的那个&#xff0c;其实python不仅标准库中包含了大量的模块&#xff08;也被称之为准模块&#xff09;&#xff0c;还有大量的第三方模块&#xff0c;开发者也可以自己发…

图卷积神经网络的简史 及其与卷积神经网络的异同

图卷积神经网络&#xff08;GCN&#xff09;已经在处理图结构数据方面取得了巨大的成功。在本小节中&#xff0c;我们将深入探讨图卷积神经网络的起源、发展历程&#xff0c;并提供一个简单的Python代码实现示例&#xff0c;以帮助读者更好地理解这一概念。 图卷积神经网络的简…

Echarts图表库推荐以及使用Echarts实现饼图端头弧形效果

推荐Echarts图表库官方链接http://www.ppchart.com/#/ 下面是一段实现饼图端头弧形效果的Echarts代码 下面代码可以直接新建html文件运行看效果也可以看我下面贴的效果图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…

【深度学习实战—8】:基于MediaPipe的人脸检测

✨博客主页&#xff1a;王乐予&#x1f388; ✨年轻人要&#xff1a;Living for the moment&#xff08;活在当下&#xff09;&#xff01;&#x1f4aa; &#x1f3c6;推荐专栏&#xff1a;【图像处理】【千锤百炼Python】【深度学习】【排序算法】 目录 &#x1f63a;一、Med…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(八)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 继续接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 现在&#xff0c;我们…

如何实现虚拟列表?定高和不定高两种场景

之前我写了一篇文章&#xff1a;如何使用 IntersectionObserver API 来实现数据的懒加载 在文章的最后&#xff0c;我们提到如果加载的列表数据越来越多&#xff0c;我们不可能把所有的数据都渲染出来&#xff0c;因为这样会导致页面卡住甚至崩溃。 为了优化这种长列表场景&am…

英伟达SSD视觉算法,jetson.inference在jetson nano中部署

一、用官方镜像刷机 安装SD卡擦除工具SD Card Formatter https://www.sdcardformatter.com/download/ 格式化SD卡 下载官方镜像 https://developer.nvidia.com/jetson-nano-sd-card-image 安装刷机工具balenaEtcher https://www.balena.io/etcher 将上面下载的镜像压缩包解…