图片轮播动画的实现与优化

图片轮播动画的实现与优化

本文将介绍如何使用 JavaScript 实现图片轮播,并解决在轮播过程中添加淡入动画后,如何移除动画类以避免重复触发的问题。我们将探讨使用 animationend 事件来监听动画结束,并结合 Promise 预加载图片,确保流畅的轮播体验。

使用 animationend 事件监听动画结束

在实现图片轮播的淡入动画效果时,一个常见的问题是如何在动画结束后移除添加的动画类。如果动画类没有被及时移除,每次图片切换时都会重复触发动画,导致不必要的性能消耗,甚至可能出现动画效果叠加的bug。

animationend 事件提供了一种优雅的解决方案。该事件在 CSS 动画完成后触发,允许我们执行一些清理工作,例如移除动画类。

以下是一个示例:

const changingImage = document.querySelector('#changing-image');changingImage.onanimationend = () => {  changingImage.classList.replace('fade-in', 'opa1');};

在这个例子中,当 #changing-image 元素的 fade-in 动画结束后,animationend 事件会被触发,然后将 fade-in 类替换为 opa1 类。opa1 类仅仅用于设置 opacity: 1;,确保图片显示,避免动画的重复触发。

结合 Promise 预加载图片

在图片轮播中,图片的加载速度直接影响用户体验。如果图片加载过慢,可能会出现短暂的空白或加载中的状态。为了解决这个问题,我们可以使用 Promise 来预加载图片,确保图片在轮播前已经加载完成。

以下是一个预加载图片的函数:

const loadImage = ref => new Promise(resolve => {  ref.img = new Image();  ref.img.onload = () => { ref.status = 'OK'; resolve() };  ref.img.onerror = () => { ref.status = 'bad'; resolve() };  ref.img.src = ref.path;});

这个函数接收一个包含图片路径的对象 ref,创建一个新的 Image 对象,并设置 onload 和 onerror 事件处理函数。当图片加载成功时,status 被设置为 ‘OK’,当加载失败时,status 被设置为 ‘bad’。无论加载成功与否,Promise 都会被 resolve。

完整的轮播实现

将 animationend 事件和 Promise 预加载结合起来,我们可以创建一个流畅的图片轮播:

const imageArray = [  { path: 'https://picsum.photos/id/237/200/300', status: 'none', img: null },  { path: 'https://picsum.photos/id/238/200/300', status: 'none', img: null },  { path: 'https://picsum.photos/id/239/200/300', status: 'none', img: null },  { path: 'https://picsum.photos/id/240/200/300', status: 'none', img: null }];const loadImage = ref => new Promise(resolve => {  ref.img = new Image();  ref.img.onload = () => { ref.status = 'OK'; resolve() };  ref.img.onerror = () => { ref.status = 'bad'; resolve() };  ref.img.src = ref.path;});const changingImage = document.querySelector('#changing-image');changingImage.onanimationend = () => {  changingImage.classList.replace('fade-in', 'opa1');};Promise.all(imageArray.map(el => loadImage(el)))  .then(() => {    for (let i = imageArray.length; i--;) {      if (imageArray[i].status === 'bad')        imageArray.splice(i, 1);    }    if (imageArray.length === 0) {      console.log('problemo! no image are loaded!');      return;    }    let currentImg = 0;    setImage(currentImg);    setInterval(() => {      currentImg = ++currentImg % imageArray.length;      setImage(currentImg);    }, 5000);  });function setImage(indx) {  changingImage.className = 'opa0';  changingImage.src = imageArray[indx].path;  changingImage.classList.replace('opa0', 'fade-in');}

对应的 CSS 样式:

.opa0 { opacity: 0; }.opa1 { opacity: 1; }.fade-in {  animation: fadeIn 3s;}@keyframes fadeIn {  0% { opacity: 0; }  100% { opacity: 1; }}#changing-image {  display: block;  width: 200px;  height: 300px;  padding: 5px;  border: 1px solid lightseagreen;  margin: 1em;}

HTML 结构:

@@##@@

这段代码首先预加载所有图片,然后移除加载失败的图片。接着,它设置一个定时器,每隔 5 秒切换一次图片,并添加 fade-in 类来触发淡入动画。animationend 事件确保动画结束后移除 fade-in 类,避免重复触发。

注意事项

兼容性: animationend 事件在现代浏览器中都有良好的支持,但在一些旧版本浏览器中可能存在兼容性问题。可以使用polyfill 来解决兼容性问题。动画时长: setInterval 的时间间隔应该大于动画的持续时间,以确保动画完整播放完毕。错误处理: 在图片加载过程中,应该处理加载失败的情况,避免轮播出现异常。

总结

通过结合 animationend 事件和 Promise 预加载,我们可以创建一个流畅、高性能的图片轮播动画。animationend 事件解决了动画重复触发的问题,Promise 预加载则优化了用户体验。在实际开发中,可以根据具体需求对代码进行调整和扩展,例如添加更多的动画效果、支持不同尺寸的图片等。

图片轮播动画的实现与优化

以上就是图片轮播动画的实现与优化的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1575053.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
图片轮播动画优化:使用 animationend 事件与 Promise 预加载
上一篇 2025年12月22日 16:48:54
使用CSS和Checkbox控制元素显示:深入解析与实践
下一篇 2025年12月22日 16:48:59

相关推荐

  • 如何在Java中使用protected修饰符

    protected成员可在同类、同包及其他包的子类中访问,主要用于继承;子类不能通过父类实例访问其protected成员,只能继承访问。 在Java中,protected 是一种访问修饰符,用于控制类成员(字段、方法、构造器或内部类)的可见性。它比 private 更宽松,但比 public 更严格…

    2026年9月26日
    100
  • 360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法

    360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法

    360极速浏览器下载失败可尝试关闭下载加速模块、调整IE安全设置、切换默认下载工具、更新浏览器或使用IDM等第三方工具解决。 如果您在使用360极速浏览器下载文件时,发现下载任务频繁中断或直接失败,可能是由于浏览器设置、网络环境或安全策略限制所致。以下是针对此问题的详细排查与解决方法。 本文运行环境…

    2026年9月26日 • 用户投稿
    200
  • 如何在Java方法中正确传递和使用数组参数

    如何在Java方法中正确传递和使用数组参数如何在Java方法中正确传递和使用数组参数如何在Java方法中正确传递和使用数组参数如何在Java方法中正确传递和使用数组参数

    本文旨在帮助Java初学者理解如何在方法中正确传递和使用数组作为参数。通过一个实际的代码示例,详细讲解了如何创建、传递和访问数组,以及如何在方法内部对数组进行操作,最终返回期望的结果。掌握这些技巧对于编写高效且功能完善的Java程序至关重要。 在Java编程中,方法经常需要接收数组作为参数,以便对一…

    2026年9月26日 • 用户投稿
    500
  • 快手视频如何下载保存_快手视频下载保存的简单方法

    快手视频如何下载保存_快手视频下载保存的简单方法快手视频如何下载保存_快手视频下载保存的简单方法快手视频如何下载保存_快手视频下载保存的简单方法快手视频如何下载保存_快手视频下载保存的简单方法

    优先使用快手App内“保存到相册”功能下载公开视频,操作简单且保留原画质;2. 若视频受限制或需无水印版本,可复制链接后通过第三方解析网站提取下载;3. 通用方法为启用手机录屏功能,录制并保存视频内容至相册。 如果您在浏览快手时看到喜欢的视频,想要将其保存到本地设备以便离线观看或分享,但发现部分视频…

    2026年9月26日 • 用户投稿
    000
  • 360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作

    360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作

    登录360极速浏览器需通过左上角头像或右上角菜单进入登录界面,输入账号密码或使用手机号快捷验证完成登录;如需切换账户或保护隐私,可点击头像后选择退出登录,或通过设置菜单清除Cookie等方式彻底注销并重启浏览器。 如果您在使用360极速浏览器时需要同步收藏夹、设置或使用云服务,则必须先登录您的360…

    2026年9月26日 • 用户投稿
    100
  • Linux如何从源码编译安装软件_configure与make命令详解

    Linux如何从源码编译安装软件_configure与make命令详解Linux如何从源码编译安装软件_configure与make命令详解Linux如何从源码编译安装软件_configure与make命令详解Linux如何从源码编译安装软件_configure与make命令详解

    答案是掌握 ./configure 和 make 的作用与用法可完成 Linux 源码编译安装。1. configure 检查系统环境并生成 Makefile,确保编译条件满足,支持 –prefix、–enable、–with 等选项定制安装;2. make 读取…

    2026年9月26日 • 用户投稿
    000
  • Java 方法中数组参数的正确调用方式

    Java 方法中数组参数的正确调用方式Java 方法中数组参数的正确调用方式Java 方法中数组参数的正确调用方式Java 方法中数组参数的正确调用方式

    本文旨在阐述如何在 Java 方法中正确传递和使用数组参数。通过一个实际的例子,我们将详细讲解如何创建数组、将其作为参数传递给方法,以及如何在方法内部访问和操作数组元素。掌握这些技巧对于编写高效且易于维护的 Java 代码至关重要。 在 Java 编程中,方法经常需要接收数组作为参数,以便对一组数据…

    2026年9月26日 • 用户投稿
    000
  • 从Scanner读取单个字符时处理空格的问题

    从Scanner读取单个字符时处理空格的问题从Scanner读取单个字符时处理空格的问题从Scanner读取单个字符时处理空格的问题从Scanner读取单个字符时处理空格的问题

    本文旨在解决Java中使用Scanner读取用户输入时,由于Scanner默认以空格作为分隔符,导致读取单个字符时出现的问题。我们将深入探讨Scanner的工作原理,并提供使用Scanner.nextLine()方法读取整行输入来解决此问题的方案,确保程序能够正确处理包含空格的输入。 在使用Java…

    2026年9月26日 • 用户投稿
    100
  • grokAI平台官方网站主页 grokAI 智能助手入口官方直达地址

    GrokAI平台官方网站主页是https://grok.com/,用户可直接访问该网址进入。新用户无需注册即可点击“Start Chatting”体验基础功能,登录X账号则可使用高级服务。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Gr…

    2026年9月26日
    100
  • 从 0 开始学 V8 漏洞利用之 V8 通用利用链(二)

    作者:hcamael@知道创宇404实验室 相关阅读:从 0 开始学 V8 漏洞利用之环境搭建(一)经过一段时间的研究,先进行一波总结,不过因为刚开始研究没多久,也许有一些局限性,以后如果发现了,再进行修正。 概述 ‍我认为,在搞漏洞利用前都得明确目标。比如打CTF做二进制的题目,大部分情况下,目标…

    2026年9月26日
    100
  • x浏览器如何拦截弹窗广告_x浏览器弹窗广告拦截教程

    x浏览器如何拦截弹窗广告_x浏览器弹窗广告拦截教程x浏览器如何拦截弹窗广告_x浏览器弹窗广告拦截教程x浏览器如何拦截弹窗广告_x浏览器弹窗广告拦截教程x浏览器如何拦截弹窗广告_x浏览器弹窗广告拦截教程

    开启x浏览器广告拦截功能可有效屏蔽弹窗广告。首先在设置中启用“广告过滤”并选择强力模式;其次通过自定义规则添加已知广告域名进行精准拦截;接着在隐私与安全设置中开启“阻止弹出窗口”开关,阻断脚本触发的弹窗;最后可使用轻阅读模式简化网页结构,避免广告加载,提升浏览体验。 如果您在浏览网页时频繁遇到弹窗广…

    2026年9月26日 • 用户投稿
    300
  • 什么是线程池?为什么使用线程池?ThreadPoolExecutor有哪些核心参数?

    什么是线程池?为什么使用线程池?ThreadPoolExecutor有哪些核心参数?什么是线程池?为什么使用线程池?ThreadPoolExecutor有哪些核心参数?什么是线程池?为什么使用线程池?ThreadPoolExecutor有哪些核心参数?什么是线程池?为什么使用线程池?ThreadPoolExecutor有哪些核心参数?

    线程池通过复用预先创建的线程,避免频繁创建销毁带来的开销,提升系统性能与稳定性。ThreadPoolExecutor是Java中实现线程池的核心类,其核心参数包括corePoolSize(核心线程数)、maximumPoolSize(最大线程数)、keepAliveTime(非核心线程空闲存活时间)…

    2026年9月26日 • 用户投稿
    100
  • uc浏览器自动填充表单怎么关闭_UC浏览器关闭表单自动填充功能

    uc浏览器自动填充表单怎么关闭_UC浏览器关闭表单自动填充功能uc浏览器自动填充表单怎么关闭_UC浏览器关闭表单自动填充功能uc浏览器自动填充表单怎么关闭_UC浏览器关闭表单自动填充功能uc浏览器自动填充表单怎么关闭_UC浏览器关闭表单自动填充功能

    关闭UC浏览器自动填充需先在设置中停用智能填写功能,再清除已保存的表单数据,最后在系统设置中禁用自动填充服务以彻底阻止信息被记忆或填充。 如果您在使用UC浏览器时发现表单被自动填充,可能会影响隐私或输入准确性。为了更好地控制个人信息的输入方式,您可以按照以下方法关闭自动填充功能。 本文运行环境:小米…

    2026年9月26日 • 用户投稿
    000
  • 使用构造器注入替代 @Autowired 注解

    使用构造器注入替代 @Autowired 注解使用构造器注入替代 @Autowired 注解使用构造器注入替代 @Autowired 注解使用构造器注入替代 @Autowired 注解

    本文旨在讲解如何使用构造器注入来替代 Spring 框架中的 @Autowired 注解,从而实现更简洁、更易于测试的代码。我们将通过一个实际案例,展示如何利用 Lombok 提供的 @AllArgsConstructor 注解简化构造器注入的过程,并解决可能遇到的问题,最终避免手动创建 Bean。…

    2026年9月26日 • 用户投稿
    100
  • 如何在Java中实现对象克隆

    答案是Java中实现对象克隆需实现Cloneable接口并重写clone()方法,分为浅克隆和深克隆:浅克隆复制基本类型字段值,引用类型仅复制地址;深克隆则递归复制所有对象,确保完全独立。可通过手动克隆引用字段或序列化实现深克隆,使用时需注意异常处理、访问权限及可变对象的隔离问题,尽管克隆机制存在但…

    2026年9月26日
    200
  • 对象创建的主要流程是怎样的?(类加载检查、分配内存、初始化等)

    对象创建的主要流程是怎样的?(类加载检查、分配内存、初始化等)对象创建的主要流程是怎样的?(类加载检查、分配内存、初始化等)对象创建的主要流程是怎样的?(类加载检查、分配内存、初始化等)对象创建的主要流程是怎样的?(类加载检查、分配内存、初始化等)

    对象创建需经历类加载检查、内存分配和初始化三阶段。首先JVM检查类是否已加载,确保类结构合法并完成静态资源准备;随后在堆中为对象分配内存,采用指针碰撞或空闲列表方式,并通过TLAB或CAS解决并发问题;最后进行初始化,先将内存置零,设置对象头信息,再执行构造器完成实例化。类加载是前提,保障类型安全与…

    2026年9月26日 • 用户投稿
    100
  • 2025Yandex俄罗斯搜索引擎官网入口 Yandex网页版搜索地址与浏览器登录指南

    2025Yandex俄罗斯搜索引擎官网入口 Yandex网页版搜索地址与浏览器登录指南2025Yandex俄罗斯搜索引擎官网入口 Yandex网页版搜索地址与浏览器登录指南2025Yandex俄罗斯搜索引擎官网入口 Yandex网页版搜索地址与浏览器登录指南2025Yandex俄罗斯搜索引擎官网入口 Yandex网页版搜索地址与浏览器登录指南

    展望2025年,yandex将继续作为俄罗斯领先的互联网门户。无论您是想直接使用其强大的网页版搜索功能,还是希望登录yandex浏览器以同步您的个人数据,获取一个稳定、官方的入口地址是第一步。本篇指南将为您提供最权威的官网入口信息,并附上清晰的网页与浏览器登录步骤。 yandx免费看电影的APP☜☜…

    2026年9月26日 • 用户投稿
    100
  • 俄罗斯yandex主页手机版入口 yandex入口引擎无需登录手机链接

    俄罗斯yandex主页手机版入口 yandex入口引擎无需登录手机链接俄罗斯yandex主页手机版入口 yandex入口引擎无需登录手机链接俄罗斯yandex主页手机版入口 yandex入口引擎无需登录手机链接俄罗斯yandex主页手机版入口 yandex入口引擎无需登录手机链接

    Yandex,作为俄罗斯本土最大的互联网公司,其搜索引擎在全球范围内享有盛誉,尤其在俄语市场占据绝对主导地位。其精心优化的手机版主页入口,旨在为全球移动用户提供极致便捷的上网体验,让用户无论身处何地,都能通过无需登录的快速链接,瞬时直达其功能异常丰富的综合性平台。 一、正确的官网地址 要直接进入俄罗…

    2026年9月26日 • 用户投稿
    000
  • sublime怎么查看函数列表_sublime显示函数或方法导航列表的方法

    sublime怎么查看函数列表_sublime显示函数或方法导航列表的方法sublime怎么查看函数列表_sublime显示函数或方法导航列表的方法sublime怎么查看函数列表_sublime显示函数或方法导航列表的方法sublime怎么查看函数列表_sublime显示函数或方法导航列表的方法

    使用 Ctrl+R(或 Cmd+R)可打开符号面板查看函数列表,支持搜索并跳转;确保文件类型正确识别以启用解析;搭配 CTags 插件可增强索引与跨文件导航能力。 在 Sublime Text 中查看函数或方法列表,可以通过内置的侧边栏符号导航功能快速实现。这个功能会自动分析当前文件中的函数、类、方…

    2026年9月26日 • 用户投稿
    100
  • yandex引擎入口无需登录进入网站地址

    yandex引擎入口无需登录进入网站地址yandex引擎入口无需登录进入网站地址yandex引擎入口无需登录进入网站地址yandex引擎入口无需登录进入网站地址

    Yandex引擎无需登录的直接访问地址是https://yandex.com/,该网站提供高效精准的搜索体验,支持多语言检索,尤其擅长俄语及东欧、中亚地区语言处理,具备本地化信息匹配能力,并集成图片、视频、新闻、地图等垂直分类功能;用户无需注册即可使用全部基础服务,包括文本、语音和图像搜索,个性化设…

    2026年9月26日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信