效果预览

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

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相关推荐

  1. 前端每日实战:45# 视频演示如何用纯 CSS 创作一个菱形 loader 动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/eKzjqK 可交互视频教程 此视频 ...

  2. html鼠标拖尾效果,前端每日实战:25# 视频演示如何用纯 CSS 创作一个慧星拖尾效果的 loader 动画...

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. 可交互视频教程 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码. 请用 chrome, s ...

  3. 前端每日实战:102# 视频演示如何用纯 CSS 创作一个小和尚

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oMmYXp 可交互视频 此视频是可 ...

  4. 前端每日实战:125# 视频演示如何用纯 CSS 创作一个失落的人独自行走的动画...

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MqpOdR/ 可交互视频 此视频是 ...

  5. 前端每日实战:160# 视频演示如何用纯 CSS 创作一个打开内容弹窗的交互动画...

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/GYXvez 可交互视频 此视频是可 ...

  6. 前端每日实战:119# 视频演示如何用纯 CSS 创作一个接扎啤的动画(内含2个视频)...

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/rZeOQp 可交互视频 此视频是可 ...

  7. 前端每日实战:84# 视频演示如何用纯 CSS 创作一个极品飞车 loader

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MBbEMo 可交互视频 此视频是可 ...

  8. python绘制图形沙漏_前端每日实战:118# 视频演示如何用纯 CSS 创作一个沙漏 loader...

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. 可交互视频 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码. 请用 chrome, saf ...

  9. 前端每日实战:156# 视频演示如何用纯 CSS 创作一个飞机舷窗风格的 toggle 控件...

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/jeaOrw 可交互视频 此视频是可 ...

  10. 前端每日实战:28# 视频演示如何用纯 CSS 绘制一个世界上不存在的彭罗斯三角形...

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/RyvgMZ 可交互视频教程 此视频 ...

最新文章

  1. Eclipse如何从SVN更新和上传修改部分项目
  2. Eclipse 快捷键(转载)
  3. 让linux的防活墙也像windows一样简单易用
  4. 速卖通运营之选品方法和技巧
  5. 《疯狂Java讲义精粹》读书笔记2 ------ 多态
  6. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(二)-- Web Api Demo
  7. ios 点击出现另外一套tabbar_IOS 点击tabbaritem跳转到一个新界面,且隐藏tabbar
  8. 信息学奥赛一本通(1183:病人排队)
  9. 解决thymeleaf严格html5校验的方法
  10. Spark配置启动脚本分析
  11. windows :32位到64 位
  12. VS code不用集成终端如何修改并推送分支?
  13. Netty中的Channel之数据冲刷与线程安全(writeAndFlush)
  14. Java代码块、构造方法(包含继承关系)的执行顺序
  15. 应用Composite模式
  16. 【数据库】SQL语句大全
  17. 启动Jmeter录制代理进行录制,报 jmeter.protocol.http.proxy.ProxyControl
  18. java事务 深入Java事务的原理与应用
  19. php 前台模板,前台模板
  20. 计算机word降序排列怎么做,WORD表格怎么按照数字降序排列

热门文章

  1. read和write函数
  2. Solaris 10 X86安装备忘
  3. IntelliJ IDEA使用技巧(一)——常用快捷键
  4. Java多线程和并发(一),进程与线程的区别
  5. 微擎系统 微信支付 get_brand_wcpay_request:fail
  6. JavaSE--异常信息打印
  7. [BZOJ1031] [JSOI2007] 字符加密Cipher (后缀数组)
  8. 替换url中某个参数的值或是添加某个参数的方法(js 分页上下页可以使用)
  9. 我们是这样写升级日志的,处处可以体现人文情怀
  10. 对象str()与reper()转换为字符串