Vue3 实现一个简单的方位动画

这是最近遇到的一个有点意思的需求,需要根据后端返回的数据,在一块地图的具体的方位上显示对应位置标识(位置图钉)。不用十分精确,只要能表现出大致的方位即可。

类似下面的效果,有点像游戏里的地图标识。

设计思路

由于不用十分精确,就用最简单的 div + css 来实现位置标识的显示和动画。之后再通过配合背景图片来保证最基础的效果。

方位总共 9 个,东南西北中加上四个角,通过 Grid 布局让其形成 3 * 3 的格子。位置标识只需要根据方位数据出现在对应的 div 中即可。

最后将这些方位用一个 div 包裹起来,只要设置外层 div 的背景即可实现。

代码实现和 Demo 演示

梳理清思路后,代码实现就比较简单了。这里用 Vue3 在 CodeSandbox 由于这里无法渲染,放上链接和部分代码。也可以在我的博客上看到 Demo。

Demo 地址:codesandbox.io/p/devbox/si...

部分关键代码:

html 复制代码
<template>
  <!-- 九宫格部分 -->
  <div class="display">
    <div class="direction-container">
      <div v-for="direction in directions" :key="direction.value" class="item">
        <div v-if="selectedDirection === direction.value" class="pin"></div>
      </div>
    </div>
  </div>

  <!-- 下拉框 -->
</template>

<script setup>
import { ref } from "vue";

const directions = [
  { name: "north-west", value: "nw" },
  { name: "north", value: "n" },
  { name: "north-east", value: "ne" },
  { name: "west", value: "w" },
  { name: "center", value: "c" },
  { name: "east", value: "e" },
  { name: "south-west", value: "sw" },
  { name: "south", value: "s" },
  { name: "south-east", value: "se" },
];

const selectedDirection = ref(directions[0].value);
</script>

<style scoped>
/* 抖动动画 */
@keyframes shake {
  0% {
    transform: translateY(0);
  }
  100% {
    transform: translateY(10px);
  }
}

.direction-container {
  ...
  /* 3*3 grid 布局 */
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  ...
}

.item {
  ...
}

.pin {
  /*坐标动画和位置*/
  ...
  animation: shake 0.5s ease infinite alternate;
}
</style>

拓展

在这个实现下,要获得不错的效果主要依赖背景图片是否合适,图片大小、边缘留白等都会影响最终的效果。如果是针对不规则的地形组合,可能用 SVG 或 Canvas 来实现更好,但相对的代码复杂度也会上升。

除了方位标识,类似的实现也可以拓展到其他场景,比如车厢内的座位标识,停车场的车位标识等。

本文由mdnice多平台发布

相关推荐
福兮说8 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理9 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
专业程序开发源9 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
专业程序开发源9 小时前
springboot社区养老系统44071-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
小呆呆66610 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
凤城老人10 小时前
从 PyQt6 到 Electron:给 Edge TTS 做一个“多角色配音机“的踩坑手记
javascript·typescript·electron
Dovis(誓平步青云)10 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan10 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_11 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒11 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端