当前位置: 首页 > news >正文

vue纯前端结合css动画实现模拟导航效果

vue纯前端结合css动画实现模拟导航效果

  • 实现效果
  • 实现逻辑

实现效果

顶部为红绿灯数据,可根据实际情况接入
道路两侧为告警提醒,可根据实际情况接入
道路中间为车辆行驶图标样例,底部为车辆行驶速度
最右侧为导航全程概览进度缩略
在这里插入图片描述

实现逻辑

页面布局

<template>
  <div class="all-container">
    <div class="hud-container">
      <div class="light light-left light-red"
        ><div>{{ light.left }}</div></div
      >
      <div class="light light-middle light-red"
        ><div>{{ light.middle }}</div></div
      >
      <div class="light light-right light-green"
        ><div>{{ light.right }}</div></div
      >
      <div class="road left-road">
        <div class="road-shadow">
          <template v-for="item in speed * 2" :key="item">
            <div
              class="shadow-container"
              :style="{ 'margin-top': ((186 - 8 * speed) * 2) / (speed + 2) + 'px' }"
            ></div>
          </template>
        </div>
      </div>
      <div class="road-middle">
        <div class="road-car road-car-animation"></div>
      </div>
      <div class="hud-speed">{{ vehicleSpeed }}</div>
      <div class="road right-road">
        <div class="road-shadow">
          <template v-for="item in speed * 2" :key="item">
            <div
              class="shadow-container"
              :style="{ 'margin-top': ((186 - 8 * speed) * 2) / (speed + 2) + 'px' }"
            ></div>
          </template>
        </div>
      </div>
      <div class="road-progress">
        <div></div>
        <img :src="require('@/assets/images/vehicle/right/north.png')" />
        <div class="road-progress-grey">
          <div class="road-progress-green" :style="{ height: progress + '%' }">
            <img :src="require('@/assets/images/vehicle/right/line-car.png')" />
          </div>
        </div>
      </div>
      <div class="left-top warning">
        <img :src="require('@/assets/images/vehicle/right/icon/crossroad.png')" />
      </div>
      <div class="left-bottom warning">
        <img :src="require('@/assets/images/vehicle/right/icon/crossroad.png')" />
      </div>
      <div class="right-top warning">
        <img :src="require('@/assets/images/vehicle/right/icon/light-red.png')" />
      </div>
      <div class="right-bottom warning">
        <img :src="require('@/assets/images/vehicle/right/icon/light-red.png')" />
      </div>
    </div>
  </div>
</template>

数据绑定
speed:道路两侧阴影的移动速度,分为了3至6四个等级;可以根据车辆的实际速度来选择对应的挡位,这里就写死了3级;
progress:右侧全场进度缩略图的进度条百分比,从0-100可以进行修改;
vehicleSpeed:为车辆速度;
light:红绿灯倒计时

<script lang="ts">
  import { defineComponent, ref } from 'vue';
  export default defineComponent({
    name: 'HudPicture',
    setup() {
      const speed = ref<number>(3); //3-6
      document.documentElement.style.setProperty('--roadSpeed', 5 / speed.value + 's');
      return {
        speed,
        progress: 50,
        vehicleSpeed: 56,
        light: {
          left: 12,
          middle: 10,
          right: 14,
        },
      };
    },
  });
</script>

用到的css样式

<style scoped lang="less">
  :root {
    --roadSpeed: 5s;
  }
  .all-container {
    width: 666px;
    height: 340px;
    background: rgba(0, 43, 78, 0.47);
    box-shadow: 0 1px 15px 0 rgba(0, 161, 255, 0.7) inset;
    padding: 14px;
    margin: 14px 0 0 19px;
    .hud-container {
      width: 638px;
      height: 310px;
      background: #000000;
      border-radius: 12px;
      position: relative;
      .light {
        position: absolute;
        top: 12px;
        width: 50px;
        height: 50px;
        background: rgba(0, 2, 20, 0.8);
        border-radius: 50%;
        &.light-green {
          border: 2px solid #6af125;
          box-shadow: 0 0 14px 3px rgba(6, 249, 0, 0.64) inset,
            0 0 16px 1px rgba(0, 255, 0, 0.59) inset;
        }
        &.light-red {
          box-shadow: 0 0 14px 3px rgba(249, 0, 30, 0.64) inset,
            0 0 16px 1px rgba(255, 0, 0, 0.59) inset;
          border: 2px solid #eb1d15;
        }
        &.light-left {
          left: 227px;
          background: url('../../../assets/images/vehicle/right/left.png') center no-repeat;
          background-size: 60% 50%;
        }
        &.light-middle {
          left: 292px;
          background: url('../../../assets/images/vehicle/right/middle.png') center no-repeat;
          background-size: 50% 60%;
        }
        &.light-right {
          left: 357px;
          background: url('../../../assets/images/vehicle/right/right.png') center no-repeat;
          background-size: 60% 50%;
        }
        div {
          text-align: center;
          font-size: 36px;
          font-weight: 500;
          color: white;
          line-height: 130px;
        }
      }
      .road {
        position: absolute;
        top: 85px;
        width: 3px;
        height: 210px;
        background-image: linear-gradient(
          180deg,
          rgba(28, 212, 234, 0) 0%,
          #1cd4ea 43%,
          #1cd4ea 94%
        );
        overflow: hidden;
        &.left-road {
          left: 230px;
          transform: rotateZ(27deg);
        }
        &.right-road {
          right: 230px;
          transform: rotateZ(-27deg);
        }
        .road-shadow {
          animation: movePercent var(--roadSpeed) linear infinite;
          .shadow-container {
            width: 4px;
            height: 8px;
            background-color: #03272a;
            border-radius: 2px;
            box-shadow: 0 1px 5px 2px rgba(52, 52, 52, 0.5);
          }
        }
        @keyframes movePercent {
          0% {
            transform: translateY(-55.5%);
          }
          100% {
            transform: translateY(0);
          }
        }
      }
      .road-middle {
        position: absolute;
        width: 35px;
        height: 120px;
        top: 120px;
        left: 300px;
        background: url('../../../assets/images/vehicle/right/road.png') center no-repeat;
        background-size: 100% 100%;
        .road-car {
          width: 45px;
          height: 60px;
          background: url('../../../assets/images/vehicle/right/road-car.png') center no-repeat;
          background-size: 100% 100%;
          margin: 78px 0 0 -5px;
          &.road-car-animation {
            animation: rollPercent 2s linear infinite;
          }
        }
        @keyframes rollPercent {
          0% {
            transform: translateY(0) scale(1);
          }
          50% {
            transform: translateY(-4px) scale(1.1);
          }
          100% {
            transform: translateY(0) scale(1);
          }
        }
      }
      .hud-speed {
        position: absolute;
        left: 0;
        top: 230px;
        text-align: center;
        width: 100%;
        font-size: 50px;
        font-weight: 700;
        background-image: -webkit-linear-gradient(top, #ffffff, #aaaaaa 100%);
        -webkit-background-clip: text;
        -webkit-text-fill-color: transparent;
      }
      .road-progress {
        position: absolute;
        right: 22px;
        top: 15px;
        color: white;
        font-size: 26px;
        line-height: 26px;
        text-align: center;
        img {
          width: 25px;
          height: 25px;
        }
        .road-progress-grey {
          width: 8px;
          height: 187px;
          background-color: #7d7d7d;
          border-radius: 5px;
          margin: 12px auto;
          .road-progress-green {
            width: 100%;
            height: 100%;
            background-color: #00b537;
            border-radius: 5px;
            position: relative;
            img {
              position: absolute;
              left: -8px;
              bottom: -8px;
            }
          }
        }
      }
      .warning {
        position: absolute;
        img {
          width: 80px;
          height: 80px;
        }
        &.left-top {
          left: 125px;
          top: 80px;
          img {
            width: 90px;
            height: 80px;
          }
        }
        &.left-bottom {
          left: 70px;
          top: 170px;
          img {
            width: 90px;
            height: 80px;
          }
        }
        &.right-top {
          right: 130px;
          top: 80px;
        }
        &.right-bottom {
          right: 75px;
          top: 170px;
        }
      }
    }
  }
</style>

相关图标样例,其余通过css实现
left.png
在这里插入图片描述
middle.png
在这里插入图片描述
right.png
在这里插入图片描述road.png
在这里插入图片描述
road-car.png
在这里插入图片描述
line-car.png
在这里插入图片描述
north.png
在这里插入图片描述
crossroad.png
在这里插入图片描述
light-red.png
在这里插入图片描述

相关文章:

  • 【数据增强】90°、180°和270°翻转图片(*4)
  • 【Hadoop---07】HDFS 读 / 写 数据流程(面试重点)
  • 【笔记】C#得到真正的屏幕大小
  • SSH远程端口转发
  • 微信支付配置信息如何获取
  • nginx反向代理实例
  • webpack与vite对比
  • Linux中的权限机制
  • 字符串函数【C语言-3】
  • 【Docker】Docker-Compose基础使用说明
  • 用python抠图
  • Java Object类下getClass()方法具有什么功能呢?
  • MongoDB安装使用教程
  • 封装js一些常用的方法(默认值、数组、判空、数值等等)
  • OpenCV之图片预处理方法
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • CSS盒模型深入
  • golang 发送GET和POST示例
  • JavaScript类型识别
  • Laravel 中的一个后期静态绑定
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 开发基于以太坊智能合约的DApp
  • 排序算法之--选择排序
  • 前端之Sass/Scss实战笔记
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​力扣解法汇总946-验证栈序列
  • #{}和${}的区别是什么 -- java面试
  • (C++)八皇后问题
  • (安卓)跳转应用市场APP详情页的方式
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (接口自动化)Python3操作MySQL数据库
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET单元测试
  • .NET分布式缓存Memcached从入门到实战
  • @media screen 针对不同移动设备
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [CF407E]k-d-sequence
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [EFI]ASUS EX-B365M-V5 Gold G5400 CPU电脑 Hackintosh 黑苹果引导文件
  • [HTML]Web前端开发技术30(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页
  • [iOS]-UIKit
  • [Java并发编程实战] 共享对象之可见性
  • [LeetCode]—Simplify Path 简化路径表达式
  • [linux] git lfs install 安装lfs
  • [MT8766][Android12] 增加应用安装白名单或者黑名单
  • [MySQL FAQ]系列 -- 如何利用触发器实现账户权限审计
  • [mysql] mysqldump 导出数据库表
  • [Python] 字典操作及方法总结
  • [svc]对称加密/非对称加密细枝末节-如何做到数据传输的authentication/data integrity/confidentiality(私密)...