前端每日实战:99# 视频演示如何用纯 CSS 创作一个过山车 loader
2024-09-03 12:32:01
效果预览
按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。
https://codepen.io/comehope/pen/KBxYZg/
可交互视频
此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。
请用 chrome, safari, edge 打开观看。
https://scrimba.com/p/pEgDAM/cagbkSL
源代码下载
每日前端实战系列的全部源代码请从 github 下载:
https://github.com/comehope/front-end-daily-challenges
代码解读
定义 dom,容器中包含 3 个元素,代表 3 个圆点:
<div class="loader">
<span></span>
<span></span>
<span></span>
</div>
居中显示:
body {
margin: 0;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(to right, silver, teal);
}
定义摩天轮的直径,其他长度均以此值为基本尺度:
.loader {
--diameter: 10em;
}
定义容器尺寸,宽是高的2倍:
.loader {
--width: calc(var(--diameter) * 2);
width: var(--width);
height: var(--diameter);
}
定义伪元素的共享属性:
.loader {
position: relative;
}
.loader::before,
.loader::after {
content: '';
position: absolute;
bottom: 0;
}
画出底部的轨道,同时定义了一个表示线粗细的变量:
.loader {
--stroke-width: calc(var(--diameter) / 40);
color: white;
}
.loader::before {
width: inherit;
height: var(--stroke-width);
background-color: currentColor;
}
画出中部的圆形轨道:
.loader::after {
box-sizing: border-box;
width: var(--diameter);
height: var(--diameter);
border: var(--stroke-width) solid;
border-radius: 50%;
left: 25%;
}
画出一个圆点,同时定义了一个表示圆点直径的变量:
.loader {
--dot-diameter: calc(var(--diameter) / 10);
}
.loader span {
position: absolute;
width: var(--dot-diameter);
height: var(--dot-diameter);
background-color: currentColor;
border-radius: 50%;
bottom: var(--stroke-width);
left: calc((var(--width) - var(--dot-diameter)) / 2);
}
为圆点增加沿圆形轨道旋转的动画效果:
.loader span {
animation:
rotating 2s linear infinite;
--vertical-center: calc((var(--diameter) / 2 - var(--stroke-width) - var(--dot-diameter)) * -1);
transform-origin: 50% var(--vertical-center);
}
@keyframes rotating {
0%, 10% {
transform: rotate(0deg);
}
60%, 100% {
transform: rotate(-1turn);
}
}
为圆点增加移动的动画效果:
.loader span {
animation:
run 2s linear infinite,
rotating 2s linear infinite;
}
@keyframes run {
0% {
left: calc(var(--dot-diameter) * -1);
}
10%, 60% {
left: calc((var(--width) - var(--dot-diameter)) / 2);
}
70%, 100% {
left: calc(var(--width));
}
}
为另外 2 个圆点设置动画延时,使 3 个圆点看起来像是紧挨着的 3 个车厢:
.loader span:nth-child(1) {
animation-delay: 0.075s;
}
.loader span:nth-child(2) {
animation-delay: 0.15s;
}
最后,隐藏容器外的内容:
.loader {
overflow: hidden;
}
大功告成!
最新文章
- [No000069]Javascript中this关键字详解
- 解决: Sudamod/CM-13.0 源代码出现 Fatal: duplicate project .....问题
- 百度地图Api进阶教程-点击生成和拖动标注4.html
- docker confluence
- Android monkey介绍
- Class diagrams
- django admin site配置(二)
- Oralce常用维护命令
- HttpClient(4.3.5) - HTTP Header
- cloudera安装hadoop集群和相关服务
- Business Analysis and Essential Competencies
- goldengate介绍
- InfluxDB 开源分布式时序、事件和指标数据库
- pxe网络安装操作系统 原理与详细过程
- MySQL自定义函数与存储过程
- Spiring系列__03IOC补充
- android 第一次作业
- ccse(CountDownLatch,CycliBarrier,Semaplore,Exchanger)
- Java根据年龄段获取对应年份起始时间戳和最终时间戳、根据生日时间戳获取月份(与数据库的时间戳处理成的月份拼接成SQL条件)
- 配置ASM以及创建恢复目录
热门文章
- 常见的网络设备:集线器 hub、网桥、交换机 switch、路由器 router、网关 gateway
- [Udemy] Recommender Systems and Deep Learning in Python
- 20190819 On Java8 第九章 多态
- Oracle建库常用命令
- JavaScript PriorityQueue
- div在上一层容器居中的方法
- RMQ(鸽巢原理或字符串操作)
- BZOJ 4821 (luogu 3707)(全网最简洁的代码实现之一)
- .net core 简单集成JWT报No authenticationScheme was specified, and there was no DefaultChallengeScheme found错误
- C#中XmlTextWriter读写xml文件详细介绍