JavaScript实现背景图像切换3D动画效果

news/2024/11/19 23:38:43/

🐱 个人主页:不叫猫先生
🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫优质专栏:vue3从入门到精通、TypeScript从入门到实践
📢 资料领取:前端进阶资料以及文中源码可以找我免费领取
🔥 前端学习交流:博主建立了一个前端交流群,汇集了各路大神,一起交流学习,期待你的加入!(文末有我wx或者私信)。

目录

  • 一、项目需求
  • 二、代码实现
  • 三、问题

一、项目需求

给一张长图,长图中有好多个图像,图像的动作是连续的,当鼠标在容器内移动时,背景图像会随之切换,呈现出连续的动画效果,实现效果类似于3D动画,用JS怎么实现?以下是实现效果。
在这里插入图片描述
示例图片如下,可拿去自己测试:

在这里插入图片描述

二、代码实现

<body><div id="container"></div><style>#container {width: 462.99px;//单个图像的宽度height: 260.433px;//单个图像高度background-image: url('https://media.sketchfab.com/models/01877de881c440cb9ba52b872dac85dc/fallbacks/5ca749dcb2e74dc4be85bcf8b0599a9b/a7e56f02d1004f59bdf9aae9d6cf5e70.jpeg');background-repeat: no-repeat;background-size: 6944.88px 260.433px;//参数讲解在最后}</style><script>const container = document.getElementById('container');let currentIndex = 0;container.addEventListener('mousemove', (event) => {const containerRect = container.getBoundingClientRect();const mouseOffsetX = event.clientX - containerRect.left;const imageCount = 15; // 图像的数量const imageWidth = 462.99; // 单个图像的宽度const index = Math.floor(mouseOffsetX / (containerRect.width / imageCount));currentIndex = Math.min(Math.max(index, 0), imageCount - 1);const positionX = currentIndex * imageWidth;container.style.backgroundPosition = `-${positionX}px 0`;});</script>
</body>
  • 1.先获取container

  • currentIndex
    用于存储当前背景图像的索引值,初始值为 0。
    如果鼠标在容器的左边缘,则索引为 0;如果鼠标在容器的右边缘,则索引为图像数量减 1。
    Math.min(Math.max(index, 0), imageCount - 1)将计算出来的索引值限制在 0 到 imageCount - 1 的范围,防止出现索引越界。如果计算出所以为imageCount,那么最终计算出的索引是imageCount-1

  • mousemove
    mousemove 事件监听器,鼠标在某元素上移动时触发,在事件处理函数中实现了图像切换的逻辑。

  • getBoundingClientRect(点击查看MDN详细讲解)
    用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。提供了元素的大小及其相对于视口的位置,具体如下所示:

    • top: 元素上边距离页面上边的距离
    • left: 元素右边距离页面左边的距离
    • right: 元素右边距离页面左边的距离
    • bottom: 元素下边距离页面上边的距离
    • width: 元素宽度
    • height: 元素高度
      在这里插入图片描述
  • mouseOffsetX
    获取鼠标偏移量。在事件处理函数中,首先获取了容器元素相对于视口的位置(containerRect.left;)和鼠标移动处到浏览器窗口的横距离(clientX)来计算鼠标偏移量。
    在这里插入图片描述

  • imageCount
    长图中图像的数量,示例图片中是15个图像

  • imageWidth
    单个图片的宽度

  • index
    当前显示的图像索引。containerRect.width / imageCount意思是将容器的宽度除以图像数量,从而得到每个图像的宽度。Math.floor(mouseOffsetX / (containerRect.width / imageCount))将鼠标偏移量除以每个图像的宽度,从而得到应该显示的图像的索引。

  • positionX
    当前图像应该显示的位置。 currentIndex * imageWidth当前图像索引和单个图像宽度计算得出。

最后通过修改容器元素的 backgroundPosition 样式属性实现了背景图像的切换效果。

三、问题

  • 为什么background-size设置为6944.88px 260.433px?
    background-size 属性用于设置背景图像的大小。将长图分割成了 15 个等宽的部分,每个部分都代表了不同的状态或者场景。background-size属性被设置为 6944.88px 260.433px,意味着图像被缩放成了水平方向的 6944.88px 和垂直方向的 260.433px。这个值的计算方法是将单个图像的宽度(462.99px)乘以图像的数量(15)得到的。
    因此,background-size 属性的值被设置为 6944.88px 260.433px,使得图像在容器内能够按照原本的宽高比例进行缩放,同时也确保了每个图像都能够完整地显示在容器中。

http://www.ppmy.cn/news/103595.html

相关文章

Django从Models 10分钟定制一个Admin后台

简介 Django自带一个Admin后台, 支持用户创建,权限配置和所有模型的增删改查功能, 只需要一些简单的配置就可快速得到一个开箱可用的后台管理系统 操作步骤 1. 更改设置,使用中文/亚洲时区 修改项目下django_shop目录下的settings.py文件 修改以下三行 LANGUAGE_CODE zh-h…

虚拟机配置

配置虚拟机网络 创建虚拟机 20G 4G内存 初始化用户名和密码 zhao 123456 克隆拷贝2个虚拟机 配置内存为2G 修改主机名和固定IP hostnamectl set-hostname node1 hostnamectl set-hostname node2 vim /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl stop network s…

vue中实现任意组件间通信(全局事件总线、消息订阅与发布)

1.全局事件总线&#xff0c;顾名思义&#xff0c;可以适用于任意组件间通信&#xff0c;我们需要通过$bus这个中间傀儡来实现&#xff0c;我们可以把$bus安装到Vue身上&#xff0c;这样可以让所有组件都能看到它&#xff0c; 1.1安装全局事件总线&#xff1a;我们可以在new Vu…

【机器学习】Kullback-Leibler (KL) divergence(KL 散度)

KL 散度是衡量两个概率分布之间差异的方法&#xff0c;我们首先考虑衡量两个概率分布之间差异的意义是什么: 模型评估与选择&#xff1a;在机器学习中&#xff0c;我们需要训练模型来拟合数据的概率分布。衡量预测分布与真实分布之间的差异可以帮助我们评估模型的性能&#xff…

09:mysql---事务

目录 1:事务简介 2:事务操作 3:事务四大特性 4:并发事务问题 5:事务隔离级别 1:事务简介 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&…

如何使用Axios发送异步请求?

首先&#xff0c;让我们来介绍一下Axios。Axios是一个基于Promise的HTTP客户端&#xff0c;它可以帮助我们轻松地发送异步请求。它支持所有现代浏览器&#xff08;包括IE8&#xff09;&#xff0c;并且还提供了Node.js的版本。 那么&#xff0c;如何使用Axios发送异步请求呢&a…

2023年上半年 软件设计师答案解析

前言&#xff1a;2023年上半年软考已经落幕了&#xff0c;学长整理了一下软件设计师的题目以及个人理解的答案&#xff08;仅供参考&#xff09;希望能够帮助参加软考的各个小伙伴能够清晰的估分&#xff0c;希望大家都能通过考试~ 目录 2023年上半年 软件设计师 上午试卷 2023…

【详解Collection接口、迭代器和Colletions工具类】

&#x1f320;作者&#xff1a;TheMythWS. &#x1f386;专栏&#xff1a;《集合与数据结构》 &#x1f387;座右铭&#xff1a;不走心的努力都是在敷衍自己&#xff0c;让自己所做的选择&#xff0c;熠熠发光。 目录 &#x1f440;Collection接口的常用方法 &#x1f4a8;…