效果预览

按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。

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;
}

大功告成!

最新文章

  1. [No000069]Javascript中this关键字详解
  2. 解决: Sudamod/CM-13.0 源代码出现 Fatal: duplicate project .....问题
  3. 百度地图Api进阶教程-点击生成和拖动标注4.html
  4. docker confluence
  5. Android monkey介绍
  6. Class diagrams
  7. django admin site配置(二)
  8. Oralce常用维护命令
  9. HttpClient(4.3.5) - HTTP Header
  10. cloudera安装hadoop集群和相关服务
  11. Business Analysis and Essential Competencies
  12. goldengate介绍
  13. InfluxDB 开源分布式时序、事件和指标数据库
  14. pxe网络安装操作系统 原理与详细过程
  15. MySQL自定义函数与存储过程
  16. Spiring系列__03IOC补充
  17. android 第一次作业
  18. ccse(CountDownLatch,CycliBarrier,Semaplore,Exchanger)
  19. Java根据年龄段获取对应年份起始时间戳和最终时间戳、根据生日时间戳获取月份(与数据库的时间戳处理成的月份拼接成SQL条件)
  20. 配置ASM以及创建恢复目录

热门文章

  1. 常见的网络设备:集线器 hub、网桥、交换机 switch、路由器 router、网关 gateway
  2. [Udemy] Recommender Systems and Deep Learning in Python
  3. 20190819 On Java8 第九章 多态
  4. Oracle建库常用命令
  5. JavaScript PriorityQueue
  6. div在上一层容器居中的方法
  7. RMQ(鸽巢原理或字符串操作)
  8. BZOJ 4821 (luogu 3707)(全网最简洁的代码实现之一)
  9. .net core 简单集成JWT报No authenticationScheme was specified, and there was no DefaultChallengeScheme found错误
  10. C#中XmlTextWriter读写xml文件详细介绍