Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CSS3 实现宝可梦剑盾精灵球 Loading 效果(带源码)

CSS3 实现宝可梦剑盾精灵球 Loading 效果(带源码)

原创
作者头像
Kkkiro
修改于 2022-11-20 06:05:55
修改于 2022-11-20 06:05:55
1.7K0
举报
文章被收录于专栏:爬坑之路爬坑之路

缘起

11.18「宝可梦朱·紫」正式发售,我才记起还没在 Switch 上玩过「宝可梦剑·盾」,赶紧趁着双十一,在某宝上下单了一张卡带,为双十一做出了一点微博的贡献。

到手才发现,买的是二手卡带。但没关系,价格减半,快乐加倍,一个周末都忙着在旷野地带奔跑,几乎要练成十里坡剑神。

恰巧最近在看 CSS3 相关的内容,对游戏里的 Loading 过场动画产生了兴趣,想着能不能用 CSS3 来实现下面这个效果。

动画长这样
动画长这样

实现效果:

最终效果
最终效果

做静态的一个精灵球

要实现这个效果,第一步先要做一个静态的精灵球。精灵球图案不复杂,拆分下来就是几个图层背景的叠加:

  1. 第一层是线性渐变背景,上半部分 46% 的面积是红色(色值:#cb0905),中间 8% 的部分是黑色(色值:#000000),下半部分 50% 的面积是白色(色值:#ffffff)
  2. 第二层是径向渐变背景,中间是占 15% 半径的白色圆,接着是一个占 7% 半径的黑色圆环,剩下的部分设为透明

转化成代码:

代码语言:html
AI代码解释
复制
<!-- 精灵球元素 -->
<div class="pkm_ball_bg"></div>
代码语言:css
AI代码解释
复制
.pkm_ball_bg {
  /* 设置大小 */ 
  width: 400px;
  height: 400px;
  /* 设置背景 */
  background: 
    radial-gradient(white 15%, black 15%, black 22%, transparent 22%),
    linear-gradient(#cb0905 46%, #000000 46%, #000000 54%, #ffffff 54%);
  /* 设置为圆形 */
  border-radius: 9999px;
}

这样就得到一个方形的精灵球。

宝可梦球
宝可梦球

可以看到虽然使用了渐变背景,但图案上并没有渐变效果,这里用了一个小技巧:在同一个位置同时设置两个颜色,达到颜色跳变的效果。

如:#cb0905 46%, #000000 46%,表示在 46%的位置从红色变化到黑色,由于渐变距离为 0 ,表现出来就是颜色跳变的效果。

另外这里需要注意一点:

  • 在 HTML 里,元素重叠时,后书写的元素会覆盖在前面书写的元素上。
  • 但使用 background 属性叠加多层背景时,图层的放置顺序则是相反的,从顶到底覆盖,类似栈结构,先书写的背景层在上层,后书写的背景层在下层。

形状的调整是通过设置圆角来实现:border-radius: 9999px;,简单起见,参考 tailwind css 设置成了一个巨大值。

如何让它动起来

有了一个静态的精灵球,让它动起来还不容易?回过头再看下动画效果:

  1. 精灵球整体绕着圆心在做 360°旋转
  2. 精灵球的上下两部分,分别顺时针作绘制扇形的处理,先从头到尾将扇形从 0 绘制到 180°,再从尾到头将扇形绘制从 180° 绘制到 0°。

整体绕圆心做旋转,这一步好实现:

代码语言:css
AI代码解释
复制
.pkm_ball_bg {
  /* 设置整体绕着中心旋转 */
  transform-origin: center;
  animation: rotate-clockwise-360 2s linear infinite;
}

/* 顺时针 360° 旋转的动画 */
@keyframes rotate-clockwise-360 {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(360deg);
  }
}

第二步动画就比较棘手了:

  1. 静态的精灵球使用的是线性渐变实现,而不是使用扇形实现
  2. 而且 CSS 没提供绘制扇形的 API
  3. CSS 的帧动画在 linear-gradient 属性上不支持插帧,表现就是跳变

既然不行,那只能换个思路,毕竟计算机视觉是一门欺骗的艺术,重新拆解一下:

扇形可通过叠加两层元素实现:

代码语言:txt
AI代码解释
复制
- 下面一层是真实层,显示我们想要的颜色(比如红色)
- 上面一层是遮盖层,用背景色相同的颜色

当遮盖层相对于右下角旋转时,看起来的效果就像是在绘制圆的左上部分的扇形。

同理,相对于左下角/右上角/左上角旋转时,看起来的效果就像是在绘制圆的右上/左下/右下部分的扇形。

将左上、左下、右上、右下组合起来,再通过动画配置,就能变相实现扇形绘制的效果。

遮盖实现
遮盖实现

重新绘制一个精灵球

代码语言:html
AI代码解释
复制
<div class="pkm_ball_loading">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>
代码语言:css
AI代码解释
复制
/* 精灵球 loading 根元素样式 */
.pkm_ball_loading {
  width: 400px;
  height: 400px;
  /* 直接设置背景,而不设置 overflow: hidden 避免裁切边缘有残留颜色 */
  background: linear-gradient(#cb0905 50%, #ffffff 50%);
  /* 裁剪为圆形 */
  border-radius: 9999px;
  position: relative;
  /* 网格布局,一行 2 个元素,元素宽度为布局的一半宽度 */
  display: grid;
  grid-template-columns: auto auto;
  /* 行间距,模拟中间的黑色横条 */
  grid-row-gap: 6%;
  grid-column-gap: 0%;
}

/* 精灵球的开关和中间黑色条单独成一层,作为最上层盖住 */
.pkm_ball_loading::after {
  content: "";
  width: 100%;
  height: 100%;
  position: absolute;
  background: 
    radial-gradient(white 15%, black 15%, black 22%, transparent 22%),
    linear-gradient(transparent 46%, #000000 46%, #000000 54%, transparent 54%);
}

/* 布局中的每个元素的公共属性 */
.pkm_ball_loading > div {
  width: 100%;
  height: 100%;
  /* 避免子元素旋转后超出父布局 */
  overflow: hidden;
  /* 设置布局,不然伪类不生效 */
  display: flex;
  /* 设置定位,作为内部子元素的定位基点 */
  position: relative;
}

.pkm_ball_loading > div::before {
  content: "";
  /* 宽高设为 2 倍,确保旋转的时候完全遮盖 */
  width: 200%;
  height: 200%;
  /* 遮盖层的颜色 */
  background: #000000;
}

/* 网格布局第一个元素,即左上 */
.pkm_ball_loading > div:nth-child(1)::before {
  /* 定位设为放在右下,和旋转点一致 */
  position: absolute;
  bottom: 0;
  right: 0;
  /* 设置选择点为右下 */
  transform-origin: bottom right;
  /* 逆时针旋转 45° */
  transform: rotate(-45deg);
}

/* 网格布局第一个元素,即右上 */
.pkm_ball_loading > div:nth-child(2)::before {
  /* 定位设为放在左下,和旋转点一致 */
  position: absolute;
  bottom: 0;
  left: 0;
  /* 设置选择点为右下 */
  transform-origin: bottom left;
  /* 顺时针旋转 45° */
  transform: rotate(45deg);
}

/* 网格布局第一个元素,即左下 */
.pkm_ball_loading > div:nth-child(3)::before {
  /* 定位设为放在右上,和旋转点一致 */
  position: absolute;
  top: 0;
  right: 0;
  /* 设置选择点为右下 */
  transform-origin: top right;
  /* 顺时针旋转 45° */
  transform: rotate(45deg);
}

/* 网格布局第一个元素,即右下 */
.pkm_ball_loading > div:nth-child(4)::before {
  /* 定位设为放在左上,和旋转点一致 */
  position: absolute;
  top: 0;
  left: 0;
  /* 设置选择点为右下 */
  transform-origin: top left;
  /* 逆时针旋转 45° */
  transform: rotate(-45deg);
}

/* loading 整体 360°旋转 */
.pkm_ball_loading {
  animation: rotate-clockwise-360 2s linear infinite;
}

/* 第一第四个遮盖物,先逆时针旋转90°,再顺时针旋转90° */
.pkm_ball_loading > div:nth-child(1)::before,
.pkm_ball_loading > div:nth-child(4)::before {
  animation: rotate-anticlockwise-90 2s linear infinite;
}

/* 第一第四个遮盖物,先顺时针旋转90°,再逆时针旋转90° */
.pkm_ball_loading > div:nth-child(2)::before,
.pkm_ball_loading > div:nth-child(3)::before {
  animation: rotate-clockwise-90 2s linear infinite;
}

/* 顺时针 360° 动画 */
@keyframes rotate-clockwise-360 {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(360deg);
  }
}

/* 顺时针 90° 再逆时针 90° 动画 */
@keyframes rotate-clockwise-90 {
  0% {
    transform: rotate(0deg);
  }
  50% {
    transform: rotate(90deg);
  }
  100% {
    transform: rotate(0deg);
  }
}

/* 逆时针 90° 再顺时针 90° 动画 */
@keyframes rotate-anticlockwise-90 {
  0% {
    transform: rotate(0deg);
  }
  50% {
    transform: rotate(-90deg);
  }
  100% {
    transform: rotate(0deg);
  }
}

最终效果:

最终效果
最终效果

特别鸣谢

  1. 免费在线视频转 GIF 软件:https://www.tutieshi.com/video/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CSS3
box-shadow: h-shadow v-shadow blur spread color inset;
ymktchic
2022/01/18
4150
CSS3
2D变形(CSS3)
transform是CSS3中具有颠覆性的特征之一,可以实现元素的位移、旋转、倾斜、缩放,甚至支持矩阵方式,配合过渡和即将学习的动画知识,可以取代大量之前只能靠Flash才可以实现的效果。
清出于兰
2020/10/26
6610
前端学习(18)~css3属性学习(十一):动画详解
transition的中文含义是过渡。过渡是CSS3中具有颠覆性的一个特征,可以实现元素不同状态间的平滑过渡(补间动画),经常用来制作动画效果。
Vincent-yuan
2020/03/19
2.3K0
【CSS——效果实现】展开你的扇子(蓝桥杯真题-2449)【合集】
完成后的效果见文件夹下面的 gif 图,图片名称为 effect.gif(提示:可以通过 VS Code 或者浏览器预览 gif 图片)。 具体说明如下:
Rossy Yan
2025/02/07
2220
【CSS——效果实现】展开你的扇子(蓝桥杯真题-2449)【合集】
纯css实现117个Loading效果(中)
这是我这几十年间从世界各地寻觅到的 Loading特效,合计117个(本文贴出第40-78个),而且是 纯CSS 制作的。
德育处主任
2022/04/17
1.4K0
纯css实现117个Loading效果(中)
用CSS做一个好看的Loading加载效果
最近因为年度人气创作者榜单真是把写文章鸽了好久,觉得天天发朋友圈肯定有人屏蔽我了hhh,所以这不,这个活动结束了,我也来继续码字了,害,生活嘛。
是乃德也是Ned
2022/08/04
9840
用CSS做一个好看的Loading加载效果
纯css实现117个Loading效果(上)
这是我这几十年间从世界各地寻觅到的 Loading特效,合计117个(本文贴出第1-39个),而且是 纯CSS 制作的。
德育处主任
2022/04/15
2.9K0
纯css实现117个Loading效果(上)
CSS3实现饼图扇形loading效果
2. 当我们煎饼动画转起的一瞬间,我们让假的饼子隐藏回家打酱油去。于是,从上面看,我们看到的就是满满一层的鸡蛋。
javascript.shop
2019/09/04
1.8K0
CSS3实现饼图扇形loading效果
CSS3的loading制作,让页面加载时不再单调
页面的loading效果一直都是个比较重要的制作,往往一个好的加载效果可以有效的提升用户体验。而实际开发中,loading效果具体该如何制作?前端工程师又会有哪些特殊的技能呢? 本文主要内容 1、效果
HTML5学堂
2018/03/13
2.1K0
CSS3的loading制作,让页面加载时不再单调
02-移动端开发教程-CSS3新特性(中)
根据文章内容,撰写摘要总结。
老马
2017/12/20
2.3K0
【前端攻略--HTML/CSS】这是你需要的transform学习教程
transition语法格式:transition: property duration timing-function delay;
野原测试开发
2019/07/10
1K0
神奇的CSS3属性—transition、transform和animation
可以让动画在CSS层面实现,此时不是利用setInterval(),不是定时器,而是底层C++在渲染,渲染动画的质量、丝滑程度都要远远优于JS、jQuery。
江米小枣
2020/06/15
3.2K0
CSS3 2D和3D的使用
过渡(transition)是CSS3中具有颠覆性的特征之一,我们可以在不使用 Flash 动画或 JavaScript 的情况下,当元素从一种样式变换为另一种样式时为元素添加效果。
用户9615083
2022/12/25
1.2K0
CSS3 2D和3D的使用
CSS3实现3D水晶立方体效果
前段时间写过一篇《CSS3实现美美哒的图片倒影效果》,里面最后一步,“我们使倒影倾斜一个角度,让整个倒影效果更具有立体效果”,不知道大家有没有联想到用倾斜,我们可以制作一个立方体呢???
Javanx
2019/09/04
1.4K0
CSS3实现3D水晶立方体效果
前端面试CSS相关(二)
如何实现一个loading动画; 要求: 用css或svg实现一个loading动画; 本文完整源代码地址:https://gitee.com/duanweidong/interview-question-code.git html结构(css) <div class="loading-block"> <div class="loading-part"></div> <div class="loading-part"></div> <div class="loading-p
用户7572539
2022/11/21
2170
02-移动端开发教程-CSS3新特性(中)
1. 新的背景 背景在CSS3中也得到很大程度的增强,比如背景图片尺寸、背景裁切区域、背景定位参照点、多重背景等。 1.1 background-size设置背景图片的尺寸 cover会自动调整缩放比例,保证图片始终填充满背景区域,如有溢出部分则会被隐藏。 contain会自动调整缩放比例,保证图片始终完整显示在背景区域。 也可以使用长度单位或百分比,可以是两个值第一个是水平方向第二个是垂直方向。 .box { width: 300px; height: 200px; border: 1px s
老马
2018/04/02
1.5K0
02-移动端开发教程-CSS3新特性(中)
05_2D3D转换
使用:让绝对定位中的盒子在父元素里居中,我们知道,如果想让一个标准流中的盒子在父盒子里居中(水平方向看),可以将其设置 margin: 0 auto; 属性。
张哥编程
2024/12/13
760
05_2D3D转换
CSS机械齿轮Loading,爱的魔力转圈圈
“爱的魔力转圈圈,想你想到心花怒放黑夜白天,可是我害怕爱情只是一瞬间,转眼会不见...”,嗨起来,小伙伴们,跟我一起来!
Javanx
2020/02/11
9360
CSS机械齿轮Loading,爱的魔力转圈圈
CSS笔记
@import url(xx.css): 在一个css中,添加对其他css文件的引用
tandaxia
2018/09/27
1.6K0
CSS笔记
JavaScript+HTML+CSS实现12种常见加载画面
在现代Web开发中,加载动画不仅可以提升用户体验,还能在后台处理数据时有效地吸引用户注意力。本篇博客将通过原生的JavaScript、HTML和CSS技术,详细介绍12种常见的加载中画面的实现方法。这些动画不仅实用,还可以为我们的Web应用增添一份专业的感觉。
Damon小智
2024/08/19
6870
JavaScript+HTML+CSS实现12种常见加载画面
相关推荐
CSS3
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档