效果预览

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

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 根枕木。

  1. <div class="loader">
  2. <div class="train"></div>
  3. <div class="track">
  4. <span></span>
  5. <span></span>
  6. <span></span>
  7. </div>
  8. </div>

居中显示:

  1. body{
  2. margin: 0;
  3. height: 100vh;
  4. display: flex;
  5. align-items: center;
  6. justify-content: center;
  7. background: linear-gradient(#666, #333);
  8. }

定义容器尺寸:

  1. .loader {
  2. width: 8em;
  3. height: 10em;
  4. font-size: 20px;
  5. }

先画火车。
画出火车的轮廓:

  1. .train {
  2. width: 6em;
  3. height: 6em;
  4. color: #444;
  5. background: #bbb4ab;
  6. border-radius: 1em;
  7. position: relative;
  8. left: 1em;
  9. }

用 ::before 伪元素画出车窗:

  1. .train::before {
  2. content: '';
  3. position: absolute;
  4. width: 80%;
  5. height: 2.3em;
  6. background-color: currentColor;
  7. border-radius: 0.4em;
  8. top: 1.2em;
  9. left: 10%;
  10. }

再用 ::after 伪元素画出车窗上的信号灯:

  1. .train::after {
  2. content: '';
  3. position: absolute;
  4. width: 25%;
  5. height: 0.4em;
  6. background-color: currentColor;
  7. border-radius: 0.3em;
  8. top: 0.4em;
  9. left: calc((100% - 25%) / 2);
  10. }

利用径向渐变画出车灯:

  1. .train {
  2. background:
  3. radial-gradient(circle at 20% 80%, currentColor 0.6em, transparent 0.6em),
  4. radial-gradient(circle at 80% 80%, currentColor 0.6em, transparent 0.6em),
  5. #bbb;
  6. }

接下来画铁轨和枕木。
定义铁轨的宽度,比火车稍宽:

  1. .track {
  2. width: 8em;
  3. }

用伪元素画出铁轨:

  1. .track {
  2. position: relative;
  3. }
  4. .track::before,
  5. .track::after {
  6. content: '';
  7. position: absolute;
  8. width: 0.3em;
  9. height: 4em;
  10. background-color: #bbb;
  11. border-radius: 0.4em;
  12. }

把铁轨分别放置在两侧,并形成近大远小的视觉效果:

  1. .track::before,
  2. .track::after {
  3. transform-origin: bottom;
  4. }
  5. .track::before {
  6. left: 0;
  7. transform: skewX(-27deg);
  8. }
  9. .track::after {
  10. right: 0;
  11. transform: skewX(27deg);
  12. }

画出枕木,这是距离观察者最近的效果,目前 3 根枕木是重叠在一起的:

  1. .track span {
  2. width: inherit;
  3. height: 0.3em;
  4. background-color: #bbb;
  5. position: absolute;
  6. top: 4em;
  7. }

设置铁轨的动画效果:

  1. .track span {
  2. animation: track-animate 1s linear infinite;
  3. }
  4. @keyframes track-animate {
  5. 0% {
  6. transform: translateY(-0.5em) scaleX(0.9);
  7. filter: opacity(0);
  8. }
  9. 10%, 90% {
  10. filter: opacity(1);
  11. }
  12. 100% {
  13. transform: translateY(-4em) scaleX(0.5);
  14. filter: opacity(0);
  15. }
  16. }

为另外 2 根枕木设置动画延时,使铁轨看起来就像永远走不完的样子:

  1. .track span:nth-child(2) {
  2. animation-delay: -0.33s;
  3. }
  4. .track span:nth-child(3) {
  5. animation-delay: -0.66s;
  6. }

最后,为火车增加动画效果,看起来就像在行驶中微微晃动:

  1. .train {
  2. animation: train-animate 1.5s infinite ease-in-out;
  3. }
  4. @keyframes train-animate {
  5. 0%, 100% {
  6. transform: rotate(0deg);
  7. }
  8. 25%, 75% {
  9. transform: rotate(0.5deg);
  10. }
  11. 50% {
  12. transform: rotate(-0.5deg);
  13. }
  14. }

大功告成!

前端每日实战:91# 视频演示如何用纯 CSS 创作一个行驶中的火车 loader的更多相关文章

  1. 如何用纯 CSS 创作一个行驶中的火车 loader

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

  2. 前端每日实战:53# 视频演示如何用纯 CSS 创作一个文本淡入淡出的 loader 动画

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

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

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

  4. 前端每日实战:46# 视频演示如何用纯 CSS 创作一个在容器中反弹的小球

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

  5. 前端每日实战:16# 视频演示如何用纯 CSS 创作一个渐变色动画边框

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

  6. 前端每日实战:157# 视频演示如何用纯 CSS 创作一个棋盘错觉动画(实际上每一行都是平行的)

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

  7. 前端每日实战:158# 视频演示如何用纯 CSS 创作一个雨伞 toggle 控件

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

  8. 前端每日实战:122# 视频演示如何用纯 CSS 创作一个苹果系统的相册图标

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

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

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

随机推荐

  1. django搭建一个小型的服务器运维网站

    前言   不管是运维还是开发抑或是测试,工作中不免会和Linux服务器打交道,常见的操作譬如:查看CPU或内存状态.查看和修改服务器时间.查看或者修改服务器配置文件.实时查看或回看系统的日志.重启服务 ...

  2. shell 操作字符串 变量 数组

    #!/bin/bash name="jack" #使用双引号拼接 #greeting="hello,"$name"!" #greeting_ ...

  3. 博客图片上传picgo工具安装配置github图传使用

    摘要 对于每一个写博客的人来说,图片是至关重要.这一路经历了多次图片的烦恼,之前选择了微博个人文章那里粘贴图片的方式上传,感觉也挺方便的.但是由于新浪的图片显示问题,如果header中不设置 标签就不 ...

  4. 小程序-web-view嵌入H5页面遇到的bug

    遇到的问题1:ios页面中,内容过多时有下滑真是功能,但是下滑的时候回看到底部的微信自带的灰色背景及H5的域名(ios的webview中上/下拉露出黑灰色背景问题) 解决办法:给body添加样式--- ...

  5. IDEA怎样在3.0中修改彩色字体。

    首先 找到 第一个File之后再找到Setting点击打开之后有Editor里面有colors和Fonts在下面是language  defaults        Semantic highligh ...

  6. jJava第一周学习总结

    对于本学期要学习的Java程序语言,经过一周多的学习,我们首先在第一堂课了解了Java平台以及Java的历史,接着认识了JDK,初步了解了JDK的安装,JDK运行环境的设置,包括其中路径path的设置 ...

  7. JVM可视化监控工具jconsole以及jvisualvm的配置

    使用jdk自带的jconsole.jvisualvm插件,监控远程linux服务器中tomcat的jvm情况 (jconsole.jvisualvm插件可查看堆内存变化情况,线程状态,CPU使用情况, ...

  8. ### Error building SqlSession. ### The error may exist in SQL Mapper Configuration ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibat

    这是一个由粗心导致的错误,具体报错如下: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSessio ...

  9. SpringCloud Erueka配置异常

    com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known serve ...

  10. host文件无操作权限

    把先用其它启动方式启动电脑,如winpe(网上有制作方法,很简单的),启动后找到FWPKCLNT.SYS所在文件夹, 一般在c/windows/system32/drivers,将drivers文件夹 ...