前端每日实战:91# 视频演示如何用纯 CSS 创作一个行驶中的火车 loader
效果预览
按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。
https://codepen.io/comehope/pen/RBLWzJ
可交互视频
此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。
请用 chrome, safari, edge 打开观看。
https://scrimba.com/p/pEgDAM/cawN3f9
源代码下载
每日前端实战系列的全部源代码请从 github 下载:
https://github.com/comehope/front-end-daily-challenges
代码解读
定义 dom,容器中包含 2 个元素,train
代表火车,track
代表铁轨,其中包含的 3 个 <span>
代表 3 根枕木。
<div class="loader"><div class="train"></div><div class="track"><span></span><span></span><span></span></div>
</div>
居中显示:
body{margin: 0;height: 100vh;display: flex;align-items: center;justify-content: center;background: linear-gradient(#666, #333);
}
定义容器尺寸:
.loader {width: 8em;height: 10em;font-size: 20px;
}
先画火车。
画出火车的轮廓:
.train {width: 6em;height: 6em;color: #444;background: #bbb4ab;border-radius: 1em;position: relative;left: 1em;
}
用 ::before 伪元素画出车窗:
.train::before {content: '';position: absolute;width: 80%;height: 2.3em;background-color: currentColor;border-radius: 0.4em;top: 1.2em;left: 10%;
}
再用 ::after 伪元素画出车窗上的信号灯:
.train::after {content: '';position: absolute;width: 25%;height: 0.4em;background-color: currentColor;border-radius: 0.3em;top: 0.4em;left: calc((100% - 25%) / 2);
}
利用径向渐变画出车灯:
.train {background: radial-gradient(circle at 20% 80%, currentColor 0.6em, transparent 0.6em),radial-gradient(circle at 80% 80%, currentColor 0.6em, transparent 0.6em),#bbb;
}
接下来画铁轨和枕木。
定义铁轨的宽度,比火车稍宽:
.track {width: 8em;
}
用伪元素画出铁轨:
.track {position: relative;
}.track::before,
.track::after {content: '';position: absolute;width: 0.3em;height: 4em;background-color: #bbb;border-radius: 0.4em;
}
把铁轨分别放置在两侧,并形成近大远小的视觉效果:
.track::before,
.track::after {transform-origin: bottom;
}.track::before {left: 0;transform: skewX(-27deg);
}.track::after {right: 0;transform: skewX(27deg);
}
画出枕木,这是距离观察者最近的效果,目前 3 根枕木是重叠在一起的:
.track span {width: inherit;height: 0.3em;background-color: #bbb;position: absolute;top: 4em;
}
设置铁轨的动画效果:
.track span {animation: track-animate 1s linear infinite;
}@keyframes track-animate {0% {transform: translateY(-0.5em) scaleX(0.9);filter: opacity(0);}10%, 90% {filter: opacity(1);}100% {transform: translateY(-4em) scaleX(0.5);filter: opacity(0);}
}
为另外 2 根枕木设置动画延时,使铁轨看起来就像永远走不完的样子:
.track span:nth-child(2) {animation-delay: -0.33s;
}.track span:nth-child(3) {animation-delay: -0.66s;
}
最后,为火车增加动画效果,看起来就像在行驶中微微晃动:
.train {animation: train-animate 1.5s infinite ease-in-out;
}@keyframes train-animate {0%, 100% {transform: rotate(0deg);}25%, 75% {transform: rotate(0.5deg);}50% {transform: rotate(-0.5deg);}
}
大功告成!
前端每日实战:91# 视频演示如何用纯 CSS 创作一个行驶中的火车 loader相关推荐
- 前端每日实战:45# 视频演示如何用纯 CSS 创作一个菱形 loader 动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/eKzjqK 可交互视频教程 此视频 ...
- html鼠标拖尾效果,前端每日实战:25# 视频演示如何用纯 CSS 创作一个慧星拖尾效果的 loader 动画...
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. 可交互视频教程 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码. 请用 chrome, s ...
- 前端每日实战:102# 视频演示如何用纯 CSS 创作一个小和尚
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oMmYXp 可交互视频 此视频是可 ...
- 前端每日实战:125# 视频演示如何用纯 CSS 创作一个失落的人独自行走的动画...
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MqpOdR/ 可交互视频 此视频是 ...
- 前端每日实战:160# 视频演示如何用纯 CSS 创作一个打开内容弹窗的交互动画...
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/GYXvez 可交互视频 此视频是可 ...
- 前端每日实战:119# 视频演示如何用纯 CSS 创作一个接扎啤的动画(内含2个视频)...
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/rZeOQp 可交互视频 此视频是可 ...
- 前端每日实战:84# 视频演示如何用纯 CSS 创作一个极品飞车 loader
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MBbEMo 可交互视频 此视频是可 ...
- python绘制图形沙漏_前端每日实战:118# 视频演示如何用纯 CSS 创作一个沙漏 loader...
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. 可交互视频 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码. 请用 chrome, saf ...
- 前端每日实战:156# 视频演示如何用纯 CSS 创作一个飞机舷窗风格的 toggle 控件...
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/jeaOrw 可交互视频 此视频是可 ...
- 前端每日实战:28# 视频演示如何用纯 CSS 绘制一个世界上不存在的彭罗斯三角形...
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/RyvgMZ 可交互视频教程 此视频 ...
最新文章
- Eclipse如何从SVN更新和上传修改部分项目
- Eclipse 快捷键(转载)
- 让linux的防活墙也像windows一样简单易用
- 速卖通运营之选品方法和技巧
- 《疯狂Java讲义精粹》读书笔记2 ------ 多态
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(二)-- Web Api Demo
- ios 点击出现另外一套tabbar_IOS 点击tabbaritem跳转到一个新界面,且隐藏tabbar
- 信息学奥赛一本通(1183:病人排队)
- 解决thymeleaf严格html5校验的方法
- Spark配置启动脚本分析
- windows :32位到64 位
- VS code不用集成终端如何修改并推送分支?
- Netty中的Channel之数据冲刷与线程安全(writeAndFlush)
- Java代码块、构造方法(包含继承关系)的执行顺序
- 应用Composite模式
- 【数据库】SQL语句大全
- 启动Jmeter录制代理进行录制,报 jmeter.protocol.http.proxy.ProxyControl
- java事务 深入Java事务的原理与应用
- php 前台模板,前台模板
- 计算机word降序排列怎么做,WORD表格怎么按照数字降序排列
热门文章
- read和write函数
- Solaris 10 X86安装备忘
- IntelliJ IDEA使用技巧(一)——常用快捷键
- Java多线程和并发(一),进程与线程的区别
- 微擎系统 微信支付 get_brand_wcpay_request:fail
- JavaSE--异常信息打印
- [BZOJ1031] [JSOI2007] 字符加密Cipher (后缀数组)
- 替换url中某个参数的值或是添加某个参数的方法(js 分页上下页可以使用)
- 我们是这样写升级日志的,处处可以体现人文情怀
- 对象str()与reper()转换为字符串