CSS变量

news2024/11/29 8:51:56

前端的开发工作中,CSS 是不可或缺的部分;实际工作中,我们通过JavaScript 来进行数据和交互工作,CSS 为用户呈现可视化的界面。有时,CSS 来进行部分交互效果是不是会比 JavaScript 更高效、更省事呢?
一、变量使用
(一)命名规范
我们已经很熟悉 JavaScript 中的变量了,在 JavaScript 中:

var a = 'hellow world'

在 CSS 中,以两个横线开头的“属性”都是 CSS 变量,其他没有任何限制;如:

:root {
  --1: red
}
/**
 *  var()函数就是用于读取变量
 * color: var(--深蓝, #fff); //第二个参数就是默认值,
 * 假设--深蓝为空情况下,会使用#fff
 **/
body {
  color: var(--1)
  --深蓝: #fff
  background-color: var(--深蓝, #fff)
}

// 注意:变量值只能用作属性值,不能用作属性名
.foo {
  --style: color
  /* 很显然,下面是无效的 */
  var(--style): black
}

(二)变量值类型
如果变量值是一个字符串,可以与其他字符串拼接;如:

--bar: 'hello'
--foo: var(--bar)' world'

// 示例
body:after {
  content: '--screen-category : 'var(--screen-category)
}

如果变量值是数值,不能与数值单位直接连用;如:

foo {
  --gap: 20;
  /* 下面无效 */
  margin-top: var(--gap)px
 /* 通过calc去计算,下面有效 */
  margin-top: calc(var(--gap) * 1px)
}

如果变量值带有单位,就不能写成字符串;如:

/* 无效 */
.foo {
  --foo: '20px'
  font-size: var(--foo)
}

/* 有效 */
.foo {
  --foo: 20px
  font-size: var(--foo)
}

(三)变量作用域
:root 选择器允许你定位到 DOM 中的最顶级元素或文档树,相当于全局变量;同一个 CSS 变量,可以在多个选择器内声明。读取的时候,优先级最高的声明生效。这与 CSS 的"层叠"(cascade)规则是一致的;如:

<style>
  :root { --color: black }
  div { --color: blue }
  #test{ --color: red }
  * { color: var(--color) }
</style>

<p>黑色</p>
<div>蓝色</div>
<div id="test">红色</div>

二、兼容性处理和 JavaScript 操作
浏览器兼容性自查网站:caniuse
请添加图片描述
(一)兼容性处理
对于不支持 CSS 变量的浏览器有两种方法;如:
方法一:

:root { --color: black; }
div {
  color: #fff;
  color: var(--color) // 如果这里读不出值,那么并不会覆盖上面的color
}

方法二:

div {
  @supports ( (--a: 0)) {
    /* supported */
  }

  @supports ( not (--a: 0)) {
    /* not supported */
  }
}

(二)JavaScript 操作
JavaScript 也可以检测浏览器是否支持 CSS 变量;如:

const isSupported =
  window.CSS &&
  window.CSS.supports &&
  window.CSS.supports('--a', 0)

if (isSupported) {
  /* supported */
} else {
  /* not supported */
}

JavaScript操作CSS变量的写法如下:

// 设置变量
document.body.style.setProperty('--color', '#7F583F') //局部
document.documentElement.style.setProperty('--color', '#7F583F') //全局

// 读取变量
document.body.style.getPropertyValue('--color').trim() //局部
document.documentElement.style.getPropertyValue('--color').trim() //全局
getComputedStyle(document.documentElement).getPropertyValue('--color') // 全局,如果是在css表中设置的需要这种方式获取

// 删除变量
document.body.style.removeProperty('--color') //局部
document.documentElement.style.removeProperty('--color') //全局

这意味着,JavaScript 可以将任意值存入样式表。同步一个监听事件,将信息被存入 CSS 变量;如:

const docStyle = document.documentElement.style

document.addEventListener('mousemove', (e) => {
  docStyle.setProperty('--mouse-x', e.clientX)
  docStyle.setProperty('--mouse-y', e.clientY)
})

可以看出,CSS 变量提供了 JavaScript 与 CSS 通信的一种途径。
三、趣味案例
(一)打字机(年度报告项目)
实现方式:

<p class="greet-info line-5">
  <span v-for="(item, index) in greetInfoArr" :key="'greet-' + index">
    {{ item }}
  </span>
</p>

export default {
computed: {
    greetInfoArr() {
      return this.greetInfo.split('')
    }
  },
  data() {
    return {
      greetInfo:
        '“开始完成一件事情,比做好它更重要。因为只要开始了,你就有机会把它做的更好”'
    }
  }
}

<style lang="scss">
.greet-info {
  position: absolute;
  z-index: 9;
  left: 18.75%;
  bottom: 7.41%;
  font-size: 24px;
  font-weight: 400;
  color: #ffffff;
  line-height: 33px;
  @keyframes revolveScale {
    60% {
      opacity: 0;
    }

    100% {
      opacity: 1;
    }
  }
  span {
    display: inline-block;
    opacity: 0;
    --time: calc(var(--greet-index) * 0.1s + 2s);
    // forwards当动画完成后,保持最后一帧的状态
    animation: revolveScale 0.4s forwards; 
    animation-delay: var(--time);
  }
}
</style>

效果:
请添加图片描述
(二)自动变色进度条
实现方式:

<!-- 
  当进度小于 30% 时,背景呈红色
  当进度大于 30% 并且 小于 60% 时,背景呈橙色
  当进度大于 60% 并且 小于 90% 时,背景呈蓝色
  当进度大于 90% 时,背景呈绿色 -->
  <div class="bar" style="--percent: 50"></div>

<style lang="scss">
.bar {
  display: flex;
  width: 600px;
  height: 20px;
  background-color: #f5f5f5;
}
.bar::before {
  // 创建或重置一个或多个计数器
  counter-reset: progress var(--percent);
  // counter() 函数以字符串形式返回当前计数器的值, 表示空格
  content: counter(progress) '%\2002';
  display: flex;
  justify-content: end;
  width: calc(var(--percent) * 1%);
  font-size: 12px;
  color: #fff;
  white-space: nowrap;
  // 渐变色
  background-image: linear-gradient(green, green),
    linear-gradient(#2486ff, #2486ff), linear-gradient(orange, orange),
    linear-gradient(red, red);
  background-size: calc((var(--percent) - 90) * 100%) 100%,
    calc((var(--percent) - 60) * 100%) 100%,
    calc((var(--percent) - 30) * 100%) 100%, 100% 100%;
}
</style>

效果:
请添加图片描述
(三)悬浮跟踪按钮
实现方式:

<div class="bruce flex-ct-x">
  <a class="track-btn">
	<span>妙用CSS变量,让你的CSS变得更心动</span>
  </a>
</div>

// js 监听鼠标修改变量值
const btn = document.getElementsByClassName("track-btn")[0];
const btnStyle = btn.style;
btn.addEventListener("mousemove", e => {
  btnStyle.setProperty("--x", `${e.offsetX}px`);
  btnStyle.setProperty("--y", `${e.offsetY}px`);
});
.bruce {
   overflow: hidden;
   height: 100vh;
}
.flex-ct-x {
   display: flex;
   justify-content: center;
   align-items: center;
}
.track-btn {
  overflow: hidden;
  position: relative;
  border-radius: 25px;
  width: 400px;
  height: 50px;
  background-color: #66f;
  cursor: pointer;
  line-height: 50px;
  text-align: center;
  font-weight: bold;
  font-size: 18px;
  color: #fff;
  span {
	position: relative;
	pointer-events: none; // 不加会卡顿
  }
  &::before {
	--size: 0;
	position: absolute;
	left: var(--x);
	top: var(--y);
	width: var(--size);
	height: var(--size);
	background-image: radial-gradient(circle closest-side, #09f, transparent);
	content: "";
	transform: translate3d(-50%, -50%, 0);
	transition: width 200ms ease, height 200ms ease;
  }
  &:hover::before {
	--size: 400px;
  }
}

效果:
请添加图片描述

四、思考与总结
CSS 变量的美在于其本质是响应式的。一旦 CSS 变量更新了,任意带有 CSS 变量的属性的值也都会随之更新。它的好处有哪些呢?可以减少样式代码的重复性;增加样式代码的扩展性;提高样式代码的灵活性;增加一种CSS与JS的通讯方式;无需深层遍历DOM改变某个样式。在做系统主题切换,风格基调(字体、色系),封装些通用性的动态组件,通过 CSS 变量并结合动画是不是就很方便做到了。

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

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

相关文章

python并发编程(并发与并行,同步和异步,阻塞与非阻塞)

最近在学python的网络编程&#xff0c;学了socket通信&#xff0c;并利用socket实现了一个具有用户验证功能&#xff0c;可以上传下载文件、可以实现命令行功能&#xff0c;创建和删除文件夹&#xff0c;可以实现的断点续传等功能的FTP服务器。但在这当中&#xff0c;发现一些概…

《JeecgBoot系列》 如何设计表单实现“下拉组件二级联动“ ? 以省市二级联动为例

《JeecgBoot系列》 如何设计表单实现"下拉组件二级联动" ? 以省市二级联动为例 一、准备字典表 1.1 创建字典表 CREATE TABLE sys_link_table ( id int NULL, pid int NULL, name varchar(64) null );1.2 准备数据 idpidname1全国21浙江省32杭州市42宁波市51江苏…

postgres 源码解析50 LWLock轻量锁--1

简介 postgres LWLock&#xff08;轻量级锁&#xff09;是由SpinLock实现&#xff0c;主要提供对共享存储器的数据结构的互斥访问。LWLock有两种锁模式&#xff0c;一种为排他模式&#xff0c;另一种是共享模式&#xff0c;如果想要读取共享内存中的内容&#xff0c;需要在读取…

kafka如何动态消费新增topic主题

一、背景使用spring-kafka客户端&#xff0c;每次新增topic主题&#xff0c;都需要硬编码客户端并重新发布服务&#xff0c;操作麻烦耗时长&#xff0c;对于业务逻辑相似场景&#xff0c;创建新主题动态监听可以用kafka-batch-starter组件二、核心设计点1、动态接入消息&#x…

Scala模式匹配详解(第八章:基本语法、模式守卫、模式匹配类型)(尚硅谷笔记)

模式匹配第 8 章 模式匹配8.1 基本语法8.2 模式守卫8.3 模式匹配类型8.3.1 匹配常量8.3.2 匹配类型8.3.3 匹配数组8.3.4 匹配列表8.3.5 匹配元组8.3.6 匹配对象及样例类8.4 变量声明中的模式匹配8.5 for 表达式中的模式匹配8.6 偏函数中的模式匹配(了解)第 8 章 模式匹配 Scal…

Redis:缓存穿透、缓存雪崩和缓存击穿(未完待续)

Redis的缓存穿透、缓存雪崩和缓存击穿一. 缓存穿透1.1 概念1.2 造成的问题1.3 解决方案1.4 案例&#xff1a;查询商铺信息&#xff08;缓存穿透的实现&#xff09;二. 缓存雪崩2.1 概念2.2 解决方案三. 缓存击穿&#xff08;热点key&#xff09;3.1 概念3.2 解决方案3.3 案例&a…

网络基础概述

1.计算机网络背景 ​ 计算机刚刚发展的时候&#xff0c;是没有网络的&#xff0c;每一台计算机都是相互独立的。后来&#xff0c;人们有了多人协作的需求&#xff0c;人们就想办法把多台计算机用“线”连接起来&#xff0c;实现数据共享。后来&#xff0c;连接到一起的电脑越来…

地球板块运动vr交互模拟体验教学提高学生的学习兴趣

海陆变迁是地球演化史上非常重要的一个过程&#xff0c;它不仅影响着地球的气候、地貌、生物多样性等方面&#xff0c;还对人类文明的演化产生了深远的影响。为了帮助学生更加深入地了解海陆变迁的过程和机制&#xff0c;很多高校教育机构开始采用虚拟现实技术进行教学探究。 V…

Go语言进阶与依赖管理-学习笔记

1 语言进阶 1.1 Goroutine 线程&#xff1a;内核态&#xff0c;栈MB级别 协程&#xff1a;用户态&#xff0c;轻量级线程&#xff0c;栈KB级 1.2 CSP 提倡通信实现共享内存 1.3 Channel 创建方法 make(chan 元素类型&#xff0c;缓冲区大小&#xff09; 无缓冲通道&#x…

【Storm】【二】安装

1 准备 1.1 准备linux服务器 本文搭建的是3节点的集群&#xff0c;需要3台linux服务器&#xff0c;我这里使用的是centos7版本的linux虚拟机&#xff0c;虚拟机网络配置如下&#xff1a; 主节点&#xff1a; master 192.168.92.90 从节点&#xff1a; slave1 192.168.92.…

Git 教程

目录1.简介&#xff1a;2.安装Git3.Git 如何工作状态区域4.使用Git5.Git配置5.1 创建仓库 - repository5.2 配置5.2.1 --global5.2.2 检查配置6. 查看工作区的文件状态6.1什么是工作区6.2 如果显示乱码的解决方式7.在工作区添加单个文件8. 添加工作区文件到暂存区9. 创建版本10…

Docker启动RabbitMQ,实现生产者与消费者

目录 一、Docker拉取镜像并启动RabbitMQ 二、Hello World &#xff08;一&#xff09;依赖导入 &#xff08;二&#xff09;消息生产者 &#xff08;三&#xff09;消息消费者 三、实现轮训分发消息 &#xff08;一&#xff09;抽取工具类 &#xff08;二&#xff09;启…

网络安全——数链路层据安全协议

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.数据链路层安全协议简介 1.数据链路安全性 二.局域网数据链路层协议 1.…

git应用笔记(三)

在新增虚拟机linux的基础上&#xff0c;做git的下载与提交 1、初始化自己的用户名和邮箱。 git config --global user.name “输入你的用户名” git config --global user.email “输入你的邮箱” 2、将本地公钥及配置如图1复制粘贴到虚拟机当前用户.ssh\目录下 4929a0205f43…

面渣逆袭:分布式十二问,万字图文详解

大家好&#xff0c;我是老三&#xff0c;不管今年金三银四如何&#xff0c;面渣逆袭系列继续&#xff0c;这期我们来看看分布式。 分布式理论 1. 说说CAP原则&#xff1f; CAP原则又称CAP定理&#xff0c;指的是在一个分布式系统中&#xff0c;Consistency&#xff08;一致性…

硬件学习 软件Cadence day07 PCB 底板电路图布线

1.根据原理图的元器件&#xff0c; 选择在 PCB 芯片制作的元器件 &#xff08;allegro中原理图和pcb中元件的交互&#xff09; 1.首先完成下列操作 可以尝试先关闭再打开&#xff0c; 等下操作的时候就好 发现新增的发光物体&#xff01;&#xff01; 2.完成操作 &#xff0c;…

Web3中文|香港拟允许比特币交易,瞄准“全球web3中心”

香港再次成为全球加密行业关注的焦点。在美国SEC对于加密货币交易所Kraken、BUSD发行商Paxos以及BA的重磅打击对比下&#xff0c;香港从去年开始持续拥抱Web3的姿态&#xff0c;让投资者开始押注香港。2023年2月20日&#xff0c;香港证监会宣布&#xff0c;就适用于虚拟资产交易…

Linux:基于libevent读写管道代码

基于libevent读写管道代码&#xff1a; 读端&#xff1a; #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <event2/event.h> #include…

gdb的简单练习

题目来自《ctf安全竞赛入门》1.用vim写代码vim gdb.c#include "stdio.h" #include "stdlib.h" void main() {int i 100;int j 101;if (i j){printf("bingooooooooo.");system("/bin/sh");}elseprintf("error............&quo…

Python 算法交易实验48 表字段设计

说明 虽然说的是表&#xff0c;实际上用的是Mongo集合 基于ADBS(APIFunc DataBase Service)可以构造一个供后续研究、生产长时间使用的数据基础&#xff0c;这个基础包括了&#xff1a; 1 队列服务。通过队列&#xff0c;数据可以通过API实现零担和批量两种模式的快速存储。2 …