如何用纯 CSS 创作一个小球上台阶的动画

效果预览
按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。
https://codepen.io/comehope/pen/PBGJwL
可交互视频
此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。
请用 chrome, safari, edge 打开观看。
https://scrimba.com/p/pEgDAM/cDMyyHv
源代码下载
每日前端实战系列的全部源代码请从 github 下载:
https://github.com/comehope/front-end-daily-challenges
代码解读
定义 dom,容器中包含 5 个元素,代表 5 个台阶:
<div class="loader">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
居中显示:
body {
margin: 0;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background-color: black;
}
定义容器尺寸:
.loader {
width: 7em;
height: 5em;
font-size: 40px;
}
画出 5 个台阶:
.loader {
display: flex;
justify-content: space-between;
align-items: flex-end;
}
.loader span {
width: 1em;
height: 1em;
background-color: white;
}
用变量让 5 个台阶从低到高排序:
.loader span {
height: calc(var(--n) * 1em);
}
.loader span:nth-child(1) {
--n: 1;
}
.loader span:nth-child(2) {
--n: 2;
}
.loader span:nth-child(3) {
--n: 3;
}
.loader span:nth-child(4) {
--n: 4;
}
.loader span:nth-child(5) {
--n: 5;
}
为台阶增加转换排序方向的动画效果:
.loader span {
animation: sort 5s infinite;
}
@keyframes sort {
0%, 40%, 100% {
height: calc(var(--n) * 1em);
}
50%, 90% {
height: calc(5em - (var(--n) - 1) * 1em);
}
}
下面做小球的动画,用了障眼法,使 2 个同色小球的交替运动看起来就像 1 个小球在做往复运动。
用伪元素画出 2 个小球:
.loader::before,
.loader::after {
content: '';
position: absolute;
width: 1em;
height: 1em;
background-color: white;
border-radius: 50%;
bottom: 1em;
}
.loader::before {
left: 0;
}
.loader::after {
left: 6em;
}
增加让小球向上运动的动画效果:
.loader::before,
.loader::after {
animation: climbing 5s infinite;
visibility: hidden;
}
.loader::after {
animation-delay: 2.5s;
}
@keyframes climbing {
0% {
bottom: 1em;
visibility: visible;
}
10% {
bottom: 2em;
}
20% {
bottom: 3em;
}
30% {
bottom: 4em;
}
40% {
bottom: 5em;
}
50% {
bottom: 1em;
}
50%, 100% {
visibility: hidden;
}
}
在向上运动的同时向两侧运动,形成上台阶的动画效果:
.loader::before {
--direction: 1;
}
.loader::after {
--direction: -1;
}
@keyframes climbing {
0% {
bottom: 1em;
left: calc(3em - 2 * 1.5em * var(--direction));
visibility: visible;
}
10% {
bottom: 2em;
left: calc(3em - 1 * 1.5em * var(--direction));
}
20% {
bottom: 3em;
left: calc(3em - 0 * 1.5em * var(--direction));
}
30% {
bottom: 4em;
left: calc(3em + 1 * 1.5em * var(--direction));
}
40% {
bottom: 5em;
left: calc(3em + 2 * 1.5em * var(--direction));
}
50% {
bottom: 1em;
left: calc(3em + 2 * 1.5em * var(--direction));
}
50%, 100% {
visibility: hidden;
}
}
最后,为上台阶的动作增加拟人效果:
@keyframes climbing {
0% {
bottom: 1em;
left: calc(3em - 2 * 1.5em * var(--direction));
visibility: visible;
}
7% {
bottom: calc(2em + 0.3em);
}
10% {
bottom: 2em;
left: calc(3em - 1 * 1.5em * var(--direction));
}
17% {
bottom: calc(3em + 0.3em);
}
20% {
bottom: 3em;
left: calc(3em - 0 * 1.5em * var(--direction));
}
27% {
bottom: calc(4em + 0.3em);
}
30% {
bottom: 4em;
left: calc(3em + 1 * 1.5em * var(--direction));
}
37% {
bottom: calc(5em + 0.3em);
}
40% {
bottom: 5em;
left: calc(3em + 2 * 1.5em * var(--direction));
}
50% {
bottom: 1em;
left: calc(3em + 2 * 1.5em * var(--direction));
}
50%, 100% {
visibility: hidden;
}
}
大功告成!
原文地址:https://segmentfault.com/a/1190000015686159
如何用纯 CSS 创作一个小球上台阶的动画的更多相关文章
- 如何用纯 CSS 创作一个小球反弹的动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OwWROO 可交互视频 ...
- 前端每日实战:85# 视频演示如何用纯 CSS 创作一个小球反弹的动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OwWROO 可交互视频 此视频是可 ...
- 前端每日实战:52# 视频演示如何用纯 CSS 创作一个小球绕着圆环盘旋的动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/gKxyWo 可交互视频 此视频是可 ...
- 如何用纯 CSS 创作一个记事本翻页动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qKOPGw 可交互视频教 ...
- 前端每日实战:46# 视频演示如何用纯 CSS 创作一个在容器中反弹的小球
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/jKVbyE 可交互视频教程 此视频 ...
- 52.纯 CSS 创作一个小球绕着圆环盘旋的动画
原文地址:https://segmentfault.com/a/1190000015295466 感想:重点在小球绕环转动. HTML code: <div class="contai ...
- 如何用纯 CSS 创作一个菜单反色填充特效
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览.https://codepen.io/comehope/pen/qYMoPo 可交互视频教程 ...
- 前端每日实战:23# 视频演示如何用纯 CSS 创作一个菜单反色填充特效
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览.https://codepen.io/comehope/pen/qYMoPo 可交互视频教程 此视频是 ...
- 纯 CSS 创作一个小球绕着圆环盘旋的动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/gKxyWo 可交互视频 ...
随机推荐
- 【转】使用UMDH查找内存泄漏
转载出处:http://blog.csdn.net/phiger/article/details/1932141 Umdh 是 Debugging Tools for Windows 里面的一个工具, ...
- boost数据结构any(很有用!)
any是一种特殊的容器,它只能容纳一个元素,但这个元素可以是任意类型; 可以用any保存任何类型,在任何需要的时候取出它; 这种功能和shared_ptr<void>类似,但是 ...
- 把登录和退出功能单独写到一个公共.py脚本,其它用例test1,test2调用公共登录,退出函数
公共登录/退出函数模块(login_exit.py): #coding:utf-8import timedef login(driver, username, password):#此处的driver ...
- TypeScript 基本类型(一)
1.boolean 布尔值 true/false let isDone: boolean = false; 2.number 数字:和JavaScript 一样,TypeScript 里的所有数字都是 ...
- Django实现组合搜索的方法示例
目录 一.实现方法 二.基本原理 三.代码样例 方法1:纯模板语言实现 方法二:使用simpletag实现 四.其他变化 1.model定义 2.处理函数变化 3.simpletag相应改变 一. ...
- 第一次使用Xamarin就上手 - 安裝Xamarin
http://xamarintech.blogspot.tw/2013/06/xamarin-xamarin-step-by-step-part1.html http://xamarintech.bl ...
- 【BZOJ4152】[AMPPZ2014]The Captain 最短路
[BZOJ4152][AMPPZ2014]The Captain Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1 ...
- vue父子组件传值
1.父组件向子组件传值 例如app.vue是父组件,v-header.vue是子组件,实现app向v-header传值父组件需要自定义自己的title值, 子组件v-header内容 <temp ...
- Exchange 2016 系统要求
Exchange 2016 和早期版本的 Exchange Server 共存方案 Exchange 2016支持混合部署方案 Exchange 2016 的网络和目录服务器要求 目录服务体系结构: ...
- 在Windows 7 64位下注册ActiveX失败的解决办法
copy Chart10W.dll %SystemRoot%\SysWOW64\ copy cellweb5.inf %SystemRoot%\SysWOW64\ copy hado.dll %S ...