vue实现动态图片(gif)

目录

1. 背景

2. 分析

3. 代码实现


1. 背景

最近在项目中发现一个有意思的小需求,鼠标移入一个盒子里,然后盒子里的图就开始动起来,就像一个gif一样,然后鼠标移出,再按照原来的变化变回去,就像变形金刚一样,首先鼠标移入从车变成机器人,鼠标移出然后从机器人变回车。

2. 分析

实现这样一个需求的前提是,UI需要给你提供这样一张图,这个图是由多个连续的画面一起构成的一张图,如下这张我在网上随便找的图。其实这是一张图,只不过这张图由很多连贯的图一起组成的,当我们将各个独立的画面移动到可视窗口时,那么看起来就像是一个动态图一样。

然后我们来分析如何实现,首先我们要有一个div,然后设置这个div的background为这张图片,假设这个div宽150px,这张图宽1500px,那么浏览器呢就会默认显示这张图的前150px,也就是将这张图的最左端显示在div上。那么我们的可视窗口就是这150px,看到的就是这张图里的第一个小图。然后我们通过js的循环计时器setInterval来动态改变这个图的backgroundPositionX,如果UI提供的图是竖直的,那么就动态改变backGroundPositionY。

3. 代码实现

HTML&&CSS

<template><div class="container"><divclass="imgContainer"@mouseenter="handleMouseEnter"@mouseleave="handleMouseLeave"><div class="img" ref="imgRef"></div></div></div>
</template><style scoped>
.container {width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;
}
.imgContainer {width: 150px;height: 300px;
}
.img {width: 100%;height: 100%;background: red;background: url("@/assets/lotsImg.png");background-position: 0 0;
}
</style>

js部分:

在mouseEnter函数中,我们先设置循环定时器,然后在interValFun里设置具体逻辑,这里的"if(num< 12)"要根据UI提供的图片自己来设定,因为我找的这个图一共有12个小图所以是12,然后具体的"-${num * 136}px"这里具体要乘以多少也要根据图片的渲染大小来计算。如下图, 1636 / 12 约等于 136,所以我设置的136px。

在mouseLeave函数中,首先先清楚之前的定时器,然后获取当前图片的backGroundPositionX值,然后如果这个值小于等于0,就一直重复的更新backGroundPositionX值,如果大于了0,说明这个图的位置已经来到了最左端了,就可以不用再计算了,就清除这个定时器。

import { ref } from "vue";const imgRef = ref(null);
const interval = ref(null);function handleMouseEnter() {interval.value = setInterval(interValFun, 80);let num = 0;function interValFun() {num++;if (num < 12) {imgRef.value.style.backgroundPositionX = `-${num * 136}px`;}}
}function handleMouseLeave() {clearInterval(interval.value);let currentPosition = parseFloat(imgRef.value.style.backgroundPositionX);const interValConst = setInterval(interValFun, 80);function interValFun() {if (currentPosition <= 0) {imgRef.value.style.backgroundPositionX = `${currentPosition}px`;} else {clearInterval(interValConst);return;}currentPosition = currentPosition + 136;}
}

最后实现的效果如图:

动态图例子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/46427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT--控件篇二

一、文本框 1. QLineEdit 文本框通常使用QLineEdit和QTextEdit这两个类来实现。 QLineEdit&#xff1a;用于单行文本输入。QTextEdit&#xff1a;用于多行文本输入&#xff0c;可以包含丰富的文本格式。 用setText(QString txt);设置默认的显示内容&#xff0c;用QString tex…

【NOI】C++数据结构入门之一维数组(一)数组基础

文章目录 前言一、概念1.导入2.数组2.1 数组的创建2.2 数组的使用 二、例题讲解问题&#xff1a;1423 - 考试成绩的简单统计问题&#xff1a;1153 - 查找“支撑数”问题&#xff1a;1156 - 排除异形基因问题&#xff1a;1155 - 找找谁的身高超过全家的平均身高问题&#xff1a;…

计算机网络生成树协议介绍与实践

生成树协议 1.环路 二层环路&#xff1a;数据链路层&#xff0c;交换机&#xff08;二层设备&#xff09;通过线路连接环状。即物理成环并且没有开启防环协议。 危害&#xff1a;广播风暴&#xff1a;交换机将未知帧广播&#xff0c;收到后的交换机继续广播&#xff0c;不断…

全国地级市-产业升级、高级化、合理化数据集(1999-2022年)

数据年份&#xff1a;1999-2022年 数据范围&#xff1a;地级市以上城市 数据来源&#xff1a;中国城市统计NJ 数据整理&#xff1a;内含原始版本、线性插值版本、ARIMA填补版本 数据说明&#xff1a;参考干春晖&#xff08;2011&#xff09;《经济研究》的文章 &#xff0c…

数据结构(单链表(1))

前言 线性表中有着许多的结构&#xff0c;如顺序表和链表。而单链表则是链表的最基础的一种形式&#xff0c;下面就让我们对其做一个了解。 概念 概念&#xff1a;链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次…

ENSP中VLAN的设置

VLAN的详细介绍 VLAN&#xff08;Virtual Local Area Network&#xff09;即虚拟局域网&#xff0c;是一种将一个物理的局域网在逻辑上划分成多个广播域的技术。 以下是关于 VLAN 的一些详细介绍&#xff1a; 一、基本概念 1. 作用&#xff1a; - 隔离广播域&#xff1a…

Notebook 在复现数据科学研究成果中的丝滑使用

对于数据科学和 AI 科研人员而言&#xff0c;研究成果的复现至关重要。成果复现既是一种研究算法的方式&#xff0c;也有助于科研人员找到研究的新途径。 IDP 中提供自研 notebook 交互式编程环境&#xff0c;它非常适合做数据分析与代码展示&#xff0c;主要功能包括&#xf…

java基础概念01-注释、关键字、字面量、变量

一、注释 注释内容不会参与编译和运行&#xff0c;仅仅是对代码的解释说明。 1-1、注释的三种类型 1、单行注释&#xff1a;//…… // 这是单行注释 2、多行注释&#xff1a;/*…….*/ /* 这是一个 多行注释 */ 3、文档注释 特殊的多行注释&#xff0c;以/**开头&#xf…

【初阶数据结构】理解堆的特性与应用:深入探索完全二叉树的独特魅力

初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01;时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑深入解析队列:探索底层逻辑深入解析循环队列:探索…

Qt类 | QObject类详解

文章目录 一、QObject类介绍二、Properties&#xff08;属性&#xff09;三、Public Functions&#xff08;公共函数&#xff09;四、Public Slots&#xff08;公共槽函数&#xff09;五、Signals&#xff08;信号&#xff09;六、Static Public Members&#xff08;静态公共成…

react Ant Design 动态表头添加操作列

模拟后端返回的表头、列表数据 注意&#xff1a;我们要在表头数据中添加一个 render 函数&#xff0c;里面就是你操作列的内容&#xff0c;value是你数据列表每行的对象 &#xff0c;item 是你表头的对象 页面中去处理这个两个数组 dataList.forEach((item, index) > {item.…

昇思25天学习打卡营第24天 | RNN实现情感分类

概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This film is great 正确标…

dmasmtool工具详细用法

DMASMTOOL 是 DMASM 文件系统管理工具&#xff0c;提供了一套类 Linux 文件操作命令&#xff0c;用于管理 ASM 文件&#xff0c;是管理、维护 DMASM 的好帮手。DMASMTOOL 工具使用 DMASMAPI 连接到 DMASMSVR&#xff0c;并调用相应的 DMASMAPI 函数&#xff0c;实现创建、拷贝、…

C1W2.LAB.Visualizing Naive Bayes

理论课&#xff1a;C1W2.Sentiment Analysis with Nave Bayes 文章目录 导入包Calculate the likelihoods for each tweetUsing Confidence Ellipses to interpret Nave Bayes 理论课&#xff1a; C1W2.Sentiment Analysis with Nave Bayes 导入包 在下面的练习中&#xff0…

everything搜索不到任何文件-设置

版本&#xff1a; V1.4.1.1024 (x64) 问题&#xff1a;搜索不到任何文件 click:[工具]->[选项]->下图所示 将本地磁盘都选中包含

Python爬虫速成之路(3):下载图片

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

SpringMVC源码解析(一):web容器启动流程

SpringMVC源码系列文章 SpringMVC源码解析(一)&#xff1a;web容器启动流程 目录 一、SpringMVC全注解配置1、pom文件2、web容器初始化类(代替web.xml)3、SpringMVC配置类(代替springmvc.xml)4、测试Controller 二、SpringServletContainerInitializer1、web容器初始化入口2、…

从本地到全局:基于图的RAG方法进行查询聚焦原理摘要

摘要 使用检索增强生成&#xff08;RAG&#xff09;从外部知识源检索相关信息&#xff0c;使大型语言模型&#xff08;LLMs&#xff09;能够回答有关私有和/或以前未见过的文档集合的问题。然而&#xff0c;当针对整个文本文档库提出全局问题时&#xff0c;例如“数据集中的主…

音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现

一、引言 通过FFmpeg命令可以获取到H.264裸流文件的色彩格式&#xff08;又译作色度采样结构、像素格式&#xff09;&#xff1a; 在vlc中也可以获取到色彩格式&#xff08;vlc底层也使用了FFmpeg进行解码&#xff09;&#xff1a; 这个色彩格式就是之前的文章《音视频入门基础…

【精品资料】模块化数据中心解决方案(33页PPT)

引言&#xff1a;模块化数据中心解决方案是一种创新的数据中心设计和部署策略&#xff0c;旨在提高数据中心的灵活性、可扩展性和效率。这种方案通过将数据中心的基础设施、计算、存储和网络资源封装到标准化的模块中&#xff0c;实现了快速部署、易于管理和高效运维的目标 方案…