Vue3里如何使用本地lottie动画以及如何更优雅的批量引入图片

介绍了 Lottie 动画及其在 Vue 3 项目中的使用方法,重点解决了批量引入图片和相对路径问题,确保动画正常显示。

如果着急直接跳到「解决」章节。

前言

什么是 Lottie 动画?

Lottie 动画是一种轻量级的动画文件格式,它使用 JSON 描述动画数据,可以通过Lottie库在网页和移动应用中快速加载和渲染高质量的动画。它支持 AE 动画导出,并能够实现复杂的动效,同时保持小文件体积和高性能

----chatGPT

简单来说,Lottie 动画是一种用 JSON 格式描述的动画。由于其小体积和高性能,常用于实现复杂动画,UI 设计师可以将其导出给前端,前端导入后即可使用。

如何使用 lottie 动画

只需三步。

1、安装 vue3-lottie

npm install vue3-lottie@latest --save

2、注册组件

// main.js
import { createApp } from 'vue'
import Vue3Lottie from 'vue3-lottie'

createApp(App).use(Vue3Lottie).mount('#app')

3、在 template 中使用

<template>
  <h1>Vue3 lottie test</h1>
  <Vue3Lottie :animationData="TestLottieJSONData" :height="200" :width="200" />
<div>
  
<script setup>
import TestLottieJSONData from './assets/lottie/data.json' // 引入 JSON 文件
</script>

但是在我的使用场景中出现了问题。

问题

UI 导出的动画带有图片,但无论是 JSON 文件命名,还是图片命名都是一样的,而且 JSON 文件里使用的图片都是相对路径。例如,有两个动画,它们的文件结构如下所示:

.
├── data.json
└── images
    ├── img_0.png
    └── img_1.png

这就带来了2个问题。

  1. 如何批量引入 images 文件夹下的图片?
  2. 如何解决相对路径的问题?

排查

把引入的 JSON 文件打印出来,可以看到静态文件(即图片)都存在于 TestLottieJSONData.assets 这个对象数组下,打印其中一项如下:

{
    "id": "image_0",
    "w": 107,
    "h": 140,
    "u": "images/",
    "p": "img_0.png",
    "e": 0
}

可以看到,u 项是文件夹,p 项是文件名,也就是说只要遍历这个数组,修改这两个项就好。

解决

问题一:如何批量引入 images 文件夹下的图片?

使用 import.meta.glob 批量引入:

const testLottieImages = import.meta.glob('./assets/lottie/images/*.png', {eager: true})

问题二:如何解决相对路径的问题?

遍历静态资源数组,修改路径:

TestLottieJSONData.assets.forEach((item, index) => {
  const imagePath = `./assets/lottie/images/${item.p}`
  item.u = ''
  if (testLottieImages[imagePath]) {
    item.p = testLottieImages[imagePath].default
  }
})

参考

  1. npmjs - vue3-lottie
  2. Github - 怎么处理需要图片资源的动画
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中,本地图片引入方式有一些变化。在Vite中,使用import语法来引入本地图片是不可行的,因为Vite不支持require。官方文档提供了两种解决方案。 第一种解决方案是将资源引入为URL。你可以使用import语法来引入图片,并将其赋值给一个变量,然后在模板中使用这个变量作为图片的src属性。例如: ```javascript import chatHealth from '@/assets/chat-health.png' <img :src="chatHealth" alt="" /> ``` 这种方法在本地运行时可以加载出图片,但是在真实环境(测试/线上)中,可能会出现找不到文件的问题。这是因为打包后的文件路径与实际路径不匹配。你可以检查打包后的文件,看看是否包含了这个图片。如果没有,可能是因为Vite没有正确加载这个图片。需要进一步检查你的操作是否正确。 第二种解决方案是使用相对路径来引入图片。你可以直接在模板中使用相对路径来引入图片,而不是使用import语法。例如: ```html <img src="../assets/images/chat-health.png" alt=""> ``` 这种方法在本地运行和真实环境中都可以正常加载图片。 总结起来,Vue3中本地图片引入方式在Vite中有一些变化。你可以尝试使用import语法将图片引入为URL,或者直接在模板中使用相对路径来引入图片。具体选择哪种方式取决于你的需求和项目配置。 #### 引用[.reference_title] - *1* [vue3 vite版本 引入本地静态图片的方式](https://blog.csdn.net/weixin_42211816/article/details/122731618)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [vue3:加载本地图片等静态资源](https://blog.csdn.net/weixin_43972437/article/details/129028118)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值