CSS 状态管理,玩出花样了!

ac0a20d14fecc32e7dec494f0f65f89d.gif

作者 | 零一

来源 | 前端印象

CSS用于交互的方式无非就那么几种:

  • 伪类::hover:link:active ...

  • 动画:animation

  • 过渡动画:transition

这些交互方式组合起来,真的可以玩出一些花样,例如我们本文的主题,CSS的状态管理,一起来看个例子🌰

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSS状态管理</title><style>@keyframes statement {0% {--state: initial;}1%, 100% {--state: ;}}.zero2one {width: 100px;height: 100px;border: 1px solid black;--hover: var(--state) green;background: var(--hover, red);animation: statement 1ms linear 1 forwards paused;}.zero2one:hover {animation-play-state: running;}</style>
</head>
<body><div class="zero2one">零一</div>
</body>
</html>

看一下具体的效果:

c9450ab708e3fa5ccb4d198ae78a22f1.gif

小试牛刀

正方形本来是红色背景的,当我们鼠标移入后,背景颜色变为绿色,且不会再变回去。如果是普通的交互,我们应该只用到了 :hover,鼠标移出后,元素会恢复原来的颜色,而我们现在是如何做到的呢?

这是因为我们把 "鼠标移入方框" 这个动作存储下来了!这就是 "CSS状态管理" 我们一起来解读这段代码吧!

CSS变量

来看一个CSS变量的例子

html {--state1: initial;--state2: ;
}.zero2one {--color1: var(--state1) red; --color2: var(--state2) blue;  color: var(--color1, yellow);   /* 最终字体颜色为yellow */background: var(--color2, pink); /* 最终背景色为blue */
}

其实这就是借助了 var() 函数第一个值无效时会用第二、第三个值、第n个值作为备选值的特性(如上述代码所示)

然后还有一个骚操作就是 color: var(--color1, yellow) 最终会展示黄色,因为变量 --color1 引用了另一个变量 --state1: initial ,正是因为值为 initial ,导致最终 color 展示了黄色,--color1 被认定为一个无效值

这时有人要说了,那我直接设置 --color1: initial red; 不就好了,为啥还要多引一个变量呢?我试过了,这样直接写是没用的,别问,问就是我也不知道!(有知道的小伙伴可以评论区告诉我~)

然后变量 --color2 引用了变量 --state2: ;,因为其值为空,所以其实变量 --color2 对应的也就是 blue ,那么 var(--color2, pink) 自然也是展示蓝色了

变量切换

借助刚刚了解的CSS变量的特性,我们可以让某个变量切换其值即可实现CSS的状态切换,如何不借助 JS 实现对CSS变量的切换呢?这时候就要借助我们文章开头提到的 animation

先定义一个 keyframes

@keyframes statement {0% {--state: initial;}1%, 100% {--state: ;}
}

在初始状态时将变量 --state 的值定义为 initial,非初始状态将变量 --state 的值定义为空

好像还是没有讲到如何切换。此时可以借助一个CSS属性 animation-play-state ,其控制了元素动画的运动状态,假设我们一开始给某个元素设置的运动状态为 paused

.zero2one {animation: statement 1ms linear 1 forwards paused;
}

一开始该元素就是暂停状态,所以根据我们定义的 keyframes 的初始状态来看,此时全局有一个变量 --state,值为 initial

然后可以在用户进行某些操作(:hover:active等等)后,将该元素运动状态改为 running

.zero2one:hover {animation-play-state: running;
}

当将元素的动画状态设为 running 后,其动画已经不是初始状态了,并且因为我们设置了 forwards ,所以此时全局有一个变量 --state,其值为空

这样就做到了变量的动态切换

将上述两个技巧组合在一起,就实现了简易版的"CSS状态管理"

实战应用

由此还引申出了一个比较有意思的东西,那就是CSS实现画板!相信你们原理都懂了,那就直接放代码吧~

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSS状态管理</title><style>@keyframes statement {0% {--state: initial;}1%, 100% {--state: ;}}.zero2one {background: rgba(222 222 255 / 0.125);border: 1px solid #eee;display: inline-block;}li {list-style: none;display: inline-block;margin: 0;padding: 0;width: 3px;height: 3px;float: left;--bg-color: var(--state) green;background: var(--bg-color, transparent);animation: statement 1ms linear 1 forwards paused;}li:hover {animation-play-state: running;}</style>
</head>
<body><ul class="zero2one"><li></li><li></li><!-- 此处省略 10000个li标签 --></ul>
</body>
</html>

最终实现效果就是这样的,如下图所示:

2e94a6ba2ad67151577fe11403599c95.gif

CSS画板

End

CSS真好玩!下次继续~ 希望本文讲解的思路对大家有所帮助~

6755c654495d545fa5f57474abee770c.gif

5c34a4c62222a51d31cf045c99aa2525.png

往期推荐

一款强大的 Kubernetes API 流量查看神器

k8s集群居然可以图形化安装了?

使用这个库,让你的服务操作 Redis 速度飞起

将 k8s 制作成 3D 射击游戏,好玩到停不下来

52fe46e6e701bef1d1e12de8a9466e32.gif

点分享

45a53db728a703d35be23cbe2fd0a9a6.gif

点收藏

3bc6a11ed5b9e01a3620a6c714cfa2f0.gif

点点赞

995d1a15940566dc13a1b22b57e27856.gif

点在看

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

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

相关文章

告别Kafka Stream,让轻量级流处理更加简单

简介&#xff1a; 还在花精力去选型Kafka组件去做清洗转化&#xff1f;来试试Kafka ETL任务功能&#xff01; 一说到数据孤岛&#xff0c;所有技术人都不陌生。在 IT 发展过程中&#xff0c;企业不可避免地搭建了各种业务系统&#xff0c;这些系统独立运行且所产生的数据彼此独…

元宇宙“性骚扰”现象频出,Meta推出“个人结界”能保护好女玩家吗?

作者 | 小码君来源 | 抓码青年元宇宙&#xff0c;可以说是最近最炙手可热的概念了。各大厂纷纷入局元宇宙&#xff0c;Faceebook甚至将总公司名字都改名为Meta。不过盯上元宇宙的可不止资本大鳄&#xff0c;还有一些不怀好意的色狼。据外媒报道称&#xff0c;在Meta的Oculus设备…

【CDS技术揭秘系列 01】阿里云CDS-OSS容灾大揭秘

简介&#xff1a; 本文主要阐述 CDS 产品中 OSS 服务在容灾方面的部署形态以及实现的其本原理。 容灾功能可以保证用户一份数据在多个地方存在冗余备份&#xff0c;当某个机房出现极端异常&#xff08;比如物理损毁&#xff09;情况下&#xff0c;数据也不会出现丢失&#xff1…

如何促合作共赢?技术人的一点经验分享

简介&#xff1a; 本文作者将通过与詹韦团队一起合作的《树懒平台》&#xff0c;分享在工作过程中&#xff0c;我们什么情况下会有合作诉求&#xff1f;有了合作诉求之后&#xff0c;如何寻找对的人&#xff1f;锁定候选人之后&#xff0c;如何打动对方促成合作&#xff1f;合作…

不记得 Git 命令? 懒人版 Git 值得拥有!

作者 | Eason来源 | 程序员巴士Git的强大是所有开发者都心知肚明的事情&#xff0c;但是其多样的命令令人很是难受。不过在Github上有着这么一个开源项目lazygit[1]。Lazygit是由Jesseduffield开发并维护的项目&#xff0c;其代码托管在Github。通过使用Lazygit&#xff0c;我们…

Dubbo3.0|阿里巴巴服务框架三位一体的选择与实践

简介&#xff1a; 服务框架就像铁路的铁轨一样&#xff0c;是互通的基础&#xff0c;只有解决了服务框架的互通&#xff0c;才有可能完成更高层的业务互通&#xff0c;所以用相同的标准统一&#xff0c;合二为一并共建新一代的服务框架是必然趋势。Dubbo3.0 是 Dubbo2.0 与 HSF…

全球首款乘云而来的存储产品CDS诞生!

9月22日&#xff0c;阿里云发布全球首款“云定义存储”&#xff08;Cloud Defined Storage&#xff0c;CDS&#xff09;产品。作为一款本地部署的分布式存储产品&#xff0c;阿里云CDS拥有与公共云存储相同的技术架构&#xff0c;让企业客户在本地也能部署和使用与公共云一致的…

性能提升3倍、时延降低70%,阿里云企业级存储ESSD云盘再升级!

9月22日&#xff0c;阿里云存储年度新品发布会上&#xff0c;阿里云基础产品资深产品总监陈起鲲发布了其全球领先的旗舰级块存储产品ESSD的两款新规格&#xff08;ESSD Auto PL、ESSD PL-X&#xff09;&#xff0c;并宣布了新增的多项企业级能力。 据了解&#xff0c;ESSD是阿…

一图看懂,什么是“云定义存储”

世界的诞生是从盘古开天辟地开始 而数据的存储 则由在龟甲上刻下的第一个字开始 经过数千年发展 数据存储也从最初的 龟壳、竹简等材料逐步进化到磁带、硬盘甚至云上 在之前几千年里 人们对于数据存储的需求并没那么高 仅仅通过纸张就能将所有数据记录下来 随着第一台计算机面…

Android 13 第一个开发者版本来了,网友直呼:Android 12 还没玩透!

整理 | 苏宓出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;2 月 10 日&#xff0c;Google 宣布 Android 13 首个预览版面向开发者开放&#xff0c;此版本重点聚焦隐私和安全、提供开发者生产力、应用兼容性&#xff0c;并保持与 OpenJDK 11 更新一致、提供主题图标…

「技术人生」第6篇:技术同学应该如何理解业务?

简介&#xff1a; 本文以大量理论论述解析业务&#xff0c;并提供多种基于不同场景的实操方法&#xff0c;帮助技术同学以科学、合理的方式开展日常工作、指导团队开展业务建设&#xff0c;保障顶层设计的落地执行。 一. 背景 目前已经发布《技术一号位的方法论》系列文章其实…

参数设置_变频器基本参数设置

工业设备的使用如何达到最大效能以及最佳效果&#xff0c;需要使用人员充分了解设备性能以及工艺要求&#xff0c;所以变频器参数设置或者优化是非常重要的环节&#xff0c;古人云失之毫厘差之千里就是这个道理。一、变频器基本参数设置参数设置可以是手持编程器操作&#xff0…

Morphling:云原生部署 AI , 如何把降本做到极致?

简介&#xff1a; Morphling 本意是游戏 Dota 中的英雄“水人”&#xff0c;他可以根据环境要求&#xff0c;通过灵活改变自身形态&#xff0c;优化战斗表现。我们希望通过 Morphling 项目&#xff0c;实现针对机器学习推理作业的灵活、智能的部署配置改变&#xff0c;优化服务…

datax参数设置_DataX Web数据增量同步配置说明

一、根据日期进行增量数据抽取1.页面任务配置打开菜单任务管理页面&#xff0c;选择添加任务按下图中5个步骤进行配置1.任务类型选DataX任务2.辅助参数选择时间自增3.增量开始时间选择&#xff0c;即sql中查询时间的开始时间&#xff0c;用户使用此选项方便第一次的全量同步。第…

Node18 即将支持 import HTTP资源!

作者 | 零一来源 | 前端印象最近看到Node官方提交了一条commit &#xff0c;并且已经合入 master分支 &#xff0c;如下图所示&#xff1a;node master commit由此可见&#xff0c;Node18可能会支持一个非常 nice 的功能&#xff0c;那就是 支持 import 远程HTTPS资源和本地的H…

MYSQL深潜 - 剖析Performance Schema内存管理

简介&#xff1a; 本文主要是通过对PFS引擎的内存管理的源码的阅读&#xff0c;解读PFS内存分配及释放原理&#xff0c;深入剖析其中存在的一些问题&#xff0c;以及一些改进思路。本文源代码分析基于Mysql-8.0.24版本。 作者 | 之枢 来源 | 阿里技术公众号 一 引言 MYSQL Pe…

基于MaxCompute SQL 的半结构化数据处理实践

简介&#xff1a; MaxCompute作为企业级数据仓库服务&#xff0c;集中存储和管理企业数据资产、面向数据应用处理和分析数据&#xff0c;将数据转换为业务洞察。通过与阿里云内、外部服务灵活组合&#xff0c;可构建丰富的数据应用。全托管的数据与分析解决方案&#xff0c;可简…

file_get_contents请求失败处理_SpringCloud Gateway网关处理请求过程中遇到400Bad Request问题解决方案...

大家在使用springcloud自己的gateway作为网关服务时&#xff0c;可能会不小心遇到自定义的Filter处理请求Request报文时出现400的错误&#xff0c;而且这个错误还不是每次请求都必现&#xff0c;额什么意思&#xff1f;难不成你是说请求还时好时坏&#xff1f;bingo&#xff01…

CSDN企业数字化之路 ——「低代码」发展研讨会北京站现场实录大放送

作者 | 千鸟 出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09; 2021年底&#xff0c;CSDN面向行业开发者和高校学生开发者&#xff0c;展开了关于“低代码”的开发者调研活动。基于调研数据&#xff0c;CSDN提出了对低代码发展趋势的五大方向。在随后举行的 …

MaxCompute 存储设计

简介&#xff1a; 存储策略该怎么设计 写这篇存储规划的文章主要是想告诉大家该如何给存储做一个规划&#xff0c;在关系数据库的时代存储昂贵且珍惜&#xff0c;掰手指头花钱是存储规划的常态。但是到了大数据时代大家又立即就都变成印美元的美国政府了&#xff0c;感觉存储很…