最新要闻
- 今年就业形势稳中有升 前3个月城镇新增就业297万人|世界看点
- 高铁车票买到了吗?五一预计发送旅客1.2亿人次:远超2019|世界讯息
- 玩家吐槽腾讯《全境封锁2》太肝:不充钱能肝到死!|全球快看点
- 世界聚焦:当贝X5激光投影仪视频评测:2450CVIA高亮度够震撼 可媲美OLED电视
- 全球热讯:好价速囤:特仑苏纯牛奶2.9元/盒发车(商超6元)
- 丰田bZ4X即将“解除封印”!OTA后一天可快充4次:直接翻倍
- 真空休眠科技+嵌入式 海信真空璀璨503新品冰箱首发-视焦点讯
- 童心筑梦工匠精神
- 五一假期未到游客已至 杭州小学生要霸占北京景点了:错峰出行_观热点
- 颠覆减肥界!摄入型食欲控制胶囊问世:可治疗胃肠道疾病|今日热议
- 便宜1万块!小米电视大师86英寸Mini LED对比索尼旗舰 画质无限接近
- 天天滚动:阔别20年终于回家了!旅美大熊猫“丫丫”专机已降落上海
- 圆形模组设计瞩目!真我11系列上架预约:超越影像旗舰
- 年报看复苏| 2022年上市房企减员超10万人,仍有房企薪资上涨 专家:今年情况会有所改善 世界速讯
- 存款利率下调,提前还贷和投资黄金是好的选择吗?
- 2023KPL春季赛总决赛将于5月13日在杭州电竞中心举办 通讯
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
记录-有意思的气泡 Loading 效果-世界微头条
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
今日,群友提问,如何实现这么一个 Loading 效果:
这个确实有点意思,但是这是 CSS 能够完成的?
(资料图片仅供参考)
没错,这个效果中的核心气泡效果,其实借助 CSS 中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们之前的:
- 使用纯 CSS 实现超酷炫的粘性气泡效果
- 巧用 CSS 实现酷炫的充电动画
圆弧的实现
首先,我们可能需要实现这样一段圆弧:
这里需要用到的技术是:
角向渐变conic-gradient()
+mask
以及两个伪元素。图片示意如下:
核心代码如下图:
HTML:
CSS:
:root { --headColor: hsl(130, 75%, 75%); --endColor: hsl(60, 75%, 40%);}.g-container { position: relative; background: #000;}.g-circle { position: relative; width: 300px; height: 300px; border-radius: 50%; background: conic-gradient( var(--headColor) 0, var(--headColor) 10%, hsl(120, 75%, 70%), hsl(110, 75%, 65%), hsl(100, 75%, 60%), hsl(90, 75%, 55%), hsl(80, 75%, 50%), hsl(70, 75%, 45%), var(--endColor) 30%, var(--endColor) 35%, transparent 35% ); mask: radial-gradient(transparent, transparent 119px, #000 120px, #000 120px, #000 100%); &::before, &::after { content: ""; position: absolute; inset: 0; width: 30px; height: 30px; background: var(--headColor); top: 0; left: 135px; border-radius: 50%; } &::after { background: var(--endColor); left: unset; top: 214px; right: 26px; }}
这样,我们就得到了这样一个图形:
气泡的实现
接下来,我们来实现尾部气泡向外扩散的效果。
由于这里涉及了多个气泡的不同运动动画,多个标签元素肯定是少不了了。
因此,接下来我们要做的事情:
- 我们需要多一组元素,将其绝对定位到上述圆环的头部或者尾部
- 给每个子元素随机设置多个大小不一的圆,颜色保持一致
- 给每个子元素随机设置不同方向的,向外扩散的位移动画
- 给每个子元素随机设置负的
animation-delay
,造成动画上的先后顺序,并以此形成整个无限循环的气泡扩散动画
这里,由于有许多小气泡的动画,这个数量,我设置成了 100。那肯定是不能一个一个手写它们的动画代码,需要借助 SASS/LESS 等预处理器的循环、随机等函数。
核心代码如下:
HTML:
// ... 共 100 个 bubble 元素
CSS:
// 上面圆环的代码,保持一致,下面只补充气泡动画的代码.g-bubbles { position: absolute; width: 30px; height: 30px; border-radius: 50px; top: 100px; left: 235px; background: var(--headColor);}.g-bubble { position: absolute; border-radius: 50%; background-color: inherit;}@for $i from 1 through 100 { .g-bubble:nth-child(#{$i}) { --rotate: calc(#{random(360)} * 1deg); --dis: calc(#{random(100)} * 1px); --width: calc(3px + #{random(25)} * 1px); top: 50%; left: 50%; transform: translate(-50%, -50%); width: var(--width); height: var(--width); animation: move #{(random(1500) + 1500) / 1000}s ease-in-out -#{random(3000) / 1000}s infinite; }}@keyframes move { 0% { transform: translate(-50%, -50%) rotate(0deg); } 75% { opacity: .9; } 100% { transform: rotateZ(var(--rotate)) translate(-50%, var(--dis)); opacity: .4; }}
核心在于 @for $i from 1 through 100 { }
这段 SASS 代码内部,我们实现了上面说的 (2)(3)(4) 的功能点!
这样,我们就得到了这样一个效果,在尾部有大量气泡动画,不断向外扩散的效果:
借助滤镜实现粘性气泡效果
OK,到这里整个效果基本就做完了。当然,也是剩下最后最重要的一步,需要让多个气泡之间产生一种粘性融合的效果。
这个技巧在此前非常多篇文章中,也频繁提及过,就是利用 filter: contrast()
滤镜与 filter: blur()
滤镜。
如果你还不了解这个技巧,可以戳我的这篇文章看看:你所不知道的 CSS 滤镜技巧与细节
简述下该技巧:
单独将两个滤镜拿出来,它们的作用分别是:
filter: blur()
: 给图像设置高斯模糊效果。filter: contrast()
: 调整图像的对比度。
但是,当他们“合体”的时候,产生了奇妙的融合现象。
仔细看两圆相交的过程,在边与边接触的时候,会产生一种边界融合的效果,通过对比度滤镜把高斯模糊的模糊边缘给干掉,利用高斯模糊实现融合效果。
基于此,我们再简单改造下我们的 CSS 代码,所需要加的代码量非常少:
- 加上滤镜 blur() 和 contrast() ,形成融合粘性效果
- 加上整个圆环的旋转即可效果
- 加上滤镜 hue-rotate(),实现色彩的变换动画
.g-container { // ... 保持一致 background: #000; filter: blur(3px) contrast(5); animation: rotate 4s infinite linear;}@keyframes rotate { 100% { transform: rotate(360deg); filter: blur(3px) contrast(5) hue-rotate(360deg); }}
就这样,我们就大致还原了题图的效果:
完整的代码,你可以戳这里:CodePen Demo -- Pure CSS Loading Animation
修复违和感
当然,上面的效果,乍一看还行,仔细看,违和感很重。
原因在于,扩散出来的小球也跟着半圆环一起进行了旋转动画,看上去就有点奇怪。
正确的做法应该是,圆环尾部的气泡应该是原地发散消失的。
那么,怎么能够做到气泡效果,一直发生在圆环的尾部,同时消失的时候又不跟着整个圆环一起进行旋转呢?我们想要的最终效果,应该是这样:
这里,我们可以拆解一下。想象,如果去掉圆环的旋转,其实我们只需要实现这样一个效果即可:
整个动画的核心就转变成了如何实现这么一个效果。看似复杂,其实也很好做。
首先,我们重新改造一下上述的 .g-bubbles
。
- 生成 N 个一样大小的小球元素,定位在整个容器的中间
// ... 共 200 个 bubble 元素
CSS:
.g-bubbles { position: absolute; width: 30px; height: 30px; transform: translate(-50%, -50%); left: 50%; top: 50%; border-radius: 50px;}.g-bubble { position: absolute; inset: 0; border-radius: 50%; background: hsl(60, 75%, 40%);}
得到这么一个效果,所有圆形小点,都暂时汇聚在容器的中心:
这里需要简单解释一下:
其次,我们借助 SASS,按照元素的顺序,把它们顺序排列到圆环轨迹之上:
$count: 200;@for $i from 1 through $count { .g-bubble:nth-child(#{$i}) { --rotate: calc(#{360 / $count} * #{$i} * 1deg); transform: rotateZ(var(--rotate)) translate(135px, 0); opacity: 1; }}
由于我们设置了 div 小球的个数为 200 个,这样,我们就得到了一圈由 200 个圆形小球形成的圆环:
接下来这一步非常重要,我们设定一个动画:
- 让每个小球在动画的
75% ~ 100%
阶段做透明度从 1 到 0 的变换,而0% ~ 75%
的阶段保持透明度为 0 - 让 200 个 div 依次进行这个动画效果(利用负的 animation-delay,从 -0 到 -4000ms),整体上就能形成逐渐消失的效果
@for $i from 1 through $count { .g-bubble:nth-child(#{$i}) { --rotate: calc(#{360 / $count} * #{$i} * 1deg); --delayTime: calc(4000 * #{$i / $count} * -1ms); transform: rotateZ(var(--rotate)) translate(135px, 0); opacity: 1; animation: showAndHide 4000ms linear var(--delayTime) infinite; }}@keyframes showAndHide { 0% { opacity: 0; } 75% { opacity: 0; } 75.1% { opacity: 1; } 100% { opacity: 0; }}
这样,我们就得到了一个圆形小球气泡围绕圆环渐次消失的效果:
配合上整个圆环,效果就会是这样:
很接近了,但是没有随机的感觉,气泡也没有散开的动画。解决的方案:
- 所以我们需要让气泡在执行透明度变化的同时,进行一个随机的发散位移
- 小圆形气泡的大小也可以带上一点随机,同时,在动画过程逐渐缩小
当然,整个动画的基础,还是在容器设置了 滤镜 blur() 和 contrast() 的加持之下的,这样,我们给气泡再补上随机动画散开及缩放的动画:
@for $i from 1 through $count { .g-bubble:nth-child(#{$i}) { --rotate: calc(#{360 / $count} * #{$i} * 1deg); --delayTime: calc(4000 * #{$i / $count} * -1ms); --scale: #{0.4 + random(10) / 10}; --x: #{-100 + random(200)}px; --y: #{-100 + random(200)}px; transform: rotateZ(var(--rotate)) translate(135px, 0); opacity: 1; animation: showAndHide 4000ms linear var(--delayTime) infinite; }}@keyframes showAndHide { 0% { transform: rotateZ(var(--rotate)) translate(135px, 0); opacity: 0; } 75% { opacity: 0; } 75.1% { transform: rotateZ(var(--rotate)) translate(135px, 0) scale(var(--scale)); opacity: 1; } 100% { transform: rotateZ(var(--rotate)) translate(calc(135px + var(--x)), var(--y)) scale(.2); opacity: 0; }}
只看一圈的气泡圆形,我们能得到了这样的效果:
配合上圆环的效果:
配合上父容器的 filter: hue-rotate()
动画,就能实现颜色的动态变换,得到我们最终想要的效果:
这样,没有了第一版本的违和感,整个效果也显得比较自然。
整体代码:
HTML:
CSS:
body, html { width: 100%; height: 100%; display: grid; place-content: center; background: #000; overflow: hidden;}$count: 200;:root { --headColor: hsl(130, 75%, 75%); --endColor: hsl(60, 75%, 40%);}.g-container { position: relative; width: 300px; height: 300px; padding: 100px; filter: blur(3px) contrast(3); background: #000; animation: hueRotate 8s infinite linear;}.g-circle { position: relative; width: 300px; height: 300px; border-radius: 50%; background: conic-gradient( var(--headColor) 0, var(--headColor) 2%, hsl(120, 75%, 70%), hsl(110, 75%, 65%), hsl(100, 75%, 60%), hsl(90, 75%, 55%), hsl(80, 75%, 50%), hsl(70, 75%, 45%), var(--endColor) 16%, var(--endColor) 18%, transparent 18% ); mask: radial-gradient(transparent, transparent 119px, #000 120px, #000); -webkit-mask: radial-gradient(transparent, transparent 119px, #000 120px, #000); animation: rotate 4s infinite -700ms linear; &::before, &::after { content: ""; position: absolute; inset: 0; width: 32px; height: 32px; background: var(--headColor); top: 0; left: 135px; border-radius: 50%; } &::after { background: var(--endColor); left: unset; top: 80px; right: 10px; }}.g-bubbles { position: absolute; width: 30px; height: 30px; transform: translate(-50%, -50%); left: 50%; top: 50%; border-radius: 50px;}.g-bubble { position: absolute; border-radius: 50%; background: var(--endColor);}@for $i from 1 through $count { .g-bubble:nth-child(#{$i}) { --rotate: calc(#{360 / $count} * #{$i} * 1deg); --delayTime: calc(4000 * #{$i / $count} * -1ms); --width: 30px; --scale: #{0.4 + random(10) / 10}; --x: #{-100 + random(200)}px; --y: #{-100 + random(200)}px; width: var(--width); height: var(--width); transform: rotateZ(var(--rotate)) translate(135px, 0); opacity: 1; animation: showAndHide 4000ms linear var(--delayTime) infinite; }}@keyframes showAndHide { 0% { transform: rotateZ(var(--rotate)) translate(135px, 0); opacity: 0; } 75% { opacity: 0; } 75.1% { transform: rotateZ(var(--rotate)) translate(135px, 0) scale(var(--scale)); opacity: 1; } 100% { transform: rotateZ(var(--rotate)) translate(calc(135px + var(--x)), var(--y)) scale(.2); opacity: 0; }}@keyframes rotate { 100% { transform: rotate(-360deg); }}@keyframes hueRotate { 100% { filter: blur(3px) contrast(3) hue-rotate(360deg); }}
本文转载于:
https://juejin.cn/post/7221320687430942781
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
关键词:
记录-有意思的气泡 Loading 效果-世界微头条
Gitblit在Windows服务器下搭建及使用_微头条
当前观察:接单日记(二)SMTP发送邮件
今年就业形势稳中有升 前3个月城镇新增就业297万人|世界看点
高铁车票买到了吗?五一预计发送旅客1.2亿人次:远超2019|世界讯息
玩家吐槽腾讯《全境封锁2》太肝:不充钱能肝到死!|全球快看点
世界聚焦:当贝X5激光投影仪视频评测:2450CVIA高亮度够震撼 可媲美OLED电视
全球热讯:好价速囤:特仑苏纯牛奶2.9元/盒发车(商超6元)
丰田bZ4X即将“解除封印”!OTA后一天可快充4次:直接翻倍
真空休眠科技+嵌入式 海信真空璀璨503新品冰箱首发-视焦点讯
进程
Python数据类型|全球报资讯
环球热点!记一次峰回路转的注入
linux基本命令
这8个摸鱼神器,千万别让你老板知道!
童心筑梦工匠精神
五一假期未到游客已至 杭州小学生要霸占北京景点了:错峰出行_观热点
颠覆减肥界!摄入型食欲控制胶囊问世:可治疗胃肠道疾病|今日热议
便宜1万块!小米电视大师86英寸Mini LED对比索尼旗舰 画质无限接近
天天滚动:阔别20年终于回家了!旅美大熊猫“丫丫”专机已降落上海
圆形模组设计瞩目!真我11系列上架预约:超越影像旗舰
年报看复苏| 2022年上市房企减员超10万人,仍有房企薪资上涨 专家:今年情况会有所改善 世界速讯
火山引擎 DataLeap 下 Notebook 系列文章三:架构升级详解 世界热文
RPM常用命令以及组合使用场景 全球热闻
存款利率下调,提前还贷和投资黄金是好的选择吗?
【新华500】新华500指数(989001)27日收涨0.68%-通讯
2023KPL春季赛总决赛将于5月13日在杭州电竞中心举办 通讯
即时:男子考科目一作弊 竟在假发内藏“黑科技”设备
世界消息!3天内3死2伤!印度一矿工下班路上遭雷击身亡
手游也有FSR、DLSS了 高通推出骁龙GSR:游戏秒变4K、性能翻倍 世界速读
突发爆炸一死一伤!空调竟成“定时炸弹”:还能放心用吗?
世界通讯!五一假期高速公路流量将破历史峰值:预计日均超5000万辆
进击科技美次元,欧莱雅2023 BRANDSTORM中国大陆总决赛完美收官|每日播报
信息:开心档之C++ STL 教程
CutMix&Mixup详解与代码实战
ASP.NET Core MVC 从入门到精通之数据库|热点聚焦
焦点日报:web: pdf_converter | DASCTF Apr.2023 X SU战队2023开局之战
只需六步!快速开启专属的风控系统
艾迪药业艾邦德 复邦德 上市发布会盛大召开 快播报
仅重998g!LG推出Gram SuperSlim笔电:10.9mm纤薄机身
锐龙R9-7945HX游戏本实测:性能恐怖 渲染能力媲美桌面版-环球快看
国产芯片新突破!龙芯3A5000成功应用于3D打印|焦点热门
最资讯丨画二次元画首先学什么,南京二次元画哪里可以学
全球速讯:饼状图的优缺点,你真的了解吗?
高保真智能录音机解决方案技术特色解析 当前要闻
使用ethtool排查网卡速率问题 世界动态
海大集团接待AllianzGlobal等多家机构调研|全球时快讯
谷歌创始人大量抛售特斯拉股票:曾被曝马斯克绿了他 今日讯
光刻机订单占了30% ASML喊话:绝对不能失去中国市场_天天头条
.NET使用一行命令轻松生成EF Core项目框架
环球精选!【解决方法】正常游览Flash页面,解决主流游览器的不支持问题(如Edge,Firefox)
今日快讯:小米盒子怎么看电视直播_小米盒子看电视直播的方法
男子聊天界面投屏广场成大型社死现场:全网都知道他不回老婆微信了 重点聚焦
每日精选:首例涉“虚拟数字人”侵权案宣判:被告判消除影响并赔12万
每日动态!89英寸三星MICRO LED电视全球首秀:RGB无机自发光、支持音画追踪
研究所预测:2070年日本总人口将降至8700万-每日时讯
华为88W充电器A/C口二选一引争议 华为李小龙:对用户最友好的设计_快资讯
世界快报:小小善举 温暖一座城!搀扶残障人士过马路的暖心司机找到了
每日快播:CloudCanal x OceanBase 数据迁移同步优化
JS中的promise返回的resolve()和reject()的理解附代码展示
韩媒:拜登向尹锡悦推荐“零度可乐”,韩网友嘲讽“给你的也只有零”_全球热闻
苹果手机黑屏但是有声音是怎么回事?苹果手机黑屏但是有声音怎么解决?
联想k860什么时候上市的?联想k860手机参数
焦点日报:马斯克疯狂降价!特斯拉Model Y已比美国新车平均价还便宜
环球看热讯:人工智能“走出”电脑!Spot机械狗成功集成ChatGPT
国产最强骁龙8 Gen2折叠屏!vivo X Fold2明天首销:8999元起
友商被苹果干趴 华为撑起国货尊严:一季度销量暴涨41%!没5G依然强-新资讯
求职者嫌8000工资高要求降到2000:HR信以为真改标准 世界今热点
电脑k歌需要什么设备?电脑k歌软件哪个好用?
2022中国男排大名单是什么?中国男排联赛2022年赛程
麦当劳被中国买下了吗?金拱门为什么还叫麦当劳?
三星堆是哪个朝代的?三星堆文明是什么民族?
佳禾智能:2022年净利润续创新高,一季度业绩强势增长|视点
为什么很多人喜欢罗永浩?罗永浩创立的手机品牌是什么?
明日方舟六星强度榜是什么?明日方舟真正的三幻神
街头霸王哪个人物最厉害?12人街霸人物原型
中国十大导演有哪些?中国内地四大导演排名
数栈V6.0全新产品矩阵发布,数据底座 EasyMR 焕新升级|世界快消息
天天热门:高清录音机市场需求调研分析
python-docx对替换后的文字设置英文字体、中文字体、字号大小、对齐方式-焦点短讯
天天短讯!东西问丨马特博博耶夫:明铁佩古城遗址为何被称为“丝绸之路活化石”?
每日热议!爱美客(300896):1Q净利润高增 厚积薄发增长势头足
上海大力建设“墨水屏”公交站牌 今年五个新城覆盖率超50%
真能横着开!现代摩比斯“e-Corner”实车演示:再不怕侧方停车了_环球即时看
王健林抛弃万达汽车
天天亮点!首发9999元 惠普暗影精灵9 SLIM上架:i9+ RTX 4060
脚感软弹 静音防滑:三福EVA洞洞拖鞋14.1元大促(原价29元) 天天速读
央行今日实现净投放590亿元
VueRouter 天天微头条
全球新消息丨WPF教程_编程入门自学教程_菜鸟教程-免费教程分享
基于Java开发支持全文检索、工作流审批、知识图谱的应用系统
前端跨域解决方案——CORS
【环球播资讯】湖北宜昌三年改造367座危桥
天天即时看!丰田:智能不是堆砌功能 制造让中国人感到喜悦的汽车
今亮点!真我11系列外观首秀:荔枝纹素皮、金色圆环抢眼
强过骁龙8 Gen3!iQOO Neo8 Pro首发天玑9200+稳了_全球热点评
全球百事通!工信部:尽快明确2023年后车购税减免政策
曾红极一时的天涯社区已无法打开 消息称欠了千万元服务器费_全球今日讯
【单例设计模式原理详解】Java/JS/Go/Python/TS不同语言实现
【世界新要闻】国防部新闻发言人谭克非就中国军队派军舰紧急撤离我在苏丹人员发表谈话