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

news2024/11/27 0:18:59

🐱 个人主页:不叫猫先生
🙋‍♂️ 作者简介: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.coloradmin.cn/o/538404.html

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

相关文章

Flask全套知识点从入门到精通,学完可直接做项目

目录 Flask入门 运行方式 URL与函数的映射(动态路由) PostMan的使用 查询参数的获取 上传文件 其它参数 url_for 函数 响应-重定向 响应-响应内容 响应-自定义响应 Flask模板 模板介绍 模板的使用 模板-传参 模板使用url_for函数 过滤器介绍 Jinja模板自带过滤器 流程…

DTFT和DFT有何区别?一文为你讲解清楚

很多人在开始学习数字信号处理的时候&#xff0c;对于各种傅里叶变换特别是离散傅里叶变化的概念及作用完全不清楚&#xff0c;IC修真院在网上整理了关于DTFT、DFT的各知识点。下面就来了解一下关于DTFT和DFT的区别吧。 DTFT&#xff0c; DFT 的区别是含义不同、性质不同、用途…

Elasticsearch集群搭建与相关知识点整理

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章参考网上的课程&#xff0c;介绍Elasticsearch集群的搭建&#xff0c;以及Elasticsearch集群相关知识点整理。 如果文章有什么需要改进的地方还请大佬不吝赐教&am…

C++刷题--选择题4

1, 在&#xff08;&#xff09;情况下适宜采用 inline 定义内联函数 A 函数体含有循环语句 B 函数体含有递归语句 C 函数代码少、频繁调用 D 函数代码多&#xff0c;不常调用 解析 C&#xff0c;以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方…

SpringSecurity实现角色权限控制(SpringBoot+SpringSecurity+JWT)

文章目录 一、项目介绍二、SpringSecurity简介SpringSecurity中的几个重要组件&#xff1a;1.SecurityContextHolder&#xff08;class&#xff09;2.SecurityContext&#xff08;Interface&#xff09;3.Authentication&#xff08;Interface&#xff09;4.AuthenticationMana…

c++项目环境搭建(VMware+linux+ubantu+vscode+cmake)

想运行一个c项目&#xff0c;但是环境怎么整呢&#xff1f;b站走起&#xff01;&#xff01;&#xff01; 本文需要的安装包 链接&#xff1a;https://pan.baidu.com/s/1XJbR2F1boQ-CqV8P71UOqw 提取码&#xff1a;swin 一、在虚拟机中安装ubantu 八分钟完成VMware和ubunt…

Git命令大全,涵盖Git全部分类,非常值得收藏!

Git是一个分布式版本控制系统&#xff0c;可以让开发者在不同的平台和环境中协作开发项目。Git有很多命令&#xff0c;可以用来管理项目的状态、历史、分支、合并、冲突等。本文将介绍一些Git常用的命令&#xff0c;并给出示例和分类。 配置命令 配置命令可以用来设置Git的全局…

算法设计与分析:贪心法

目录 第一关&#xff1a;贪心法 任务描述&#xff1a; 相关知识&#xff1a; 贪心法的优缺点&#xff1a; 例题&#xff1a; 解题分析&#xff1a; 程序实现&#xff1a; 关键代码&#xff1a; 编程要求&#xff1a; 测试说明&#xff1a; 第二关&#xff1a;最小生成…

体验了下科大讯飞版ChatGPT,厉害了!

前几天科大讯飞的星火认知大模型发布了&#xff0c;我刚好有朋友在科大讯飞工作&#xff0c;于是就第一时间体验了一波。 一番体验下来确实比我预想的效果要好&#xff0c;没想到国产模型的效果还不错&#xff0c;我试了很多方面&#xff0c;比如通用常识功能、写作功能、学习…

【论文阅读】基于鲁棒强化学习的无人机能量采集可重构智能表面

只做学习记录&#xff0c;侵删原文链接 article{peng2023energy, title{Energy Harvesting Reconfigurable Intelligent Surface for UAV Based on Robust Deep Reinforcement Learning}, author{Peng, Haoran and Wang, Li-Chun}, journal{IEEE Transactions on Wireless Comm…

今日不足——学习目标做了但是没执行

今天复习概率论的时候我发现我复习数值计算方法的时候没有严格按照步骤来&#xff0c;如果按照步骤来我的最小二乘本来可以不用错的。我在复习时候的步骤之间就是抛开书本然后之间进入应用然后遇到不会的回头复习概念虽然缺失能做题目了但是不了解每个知识点的原理和思想&#…

el-drawer 被遮罩层覆盖 显示异常

这是由于元素的一些层级设置不同导致的&#xff0c;所以蒙层被放在了最顶端。解决方法就是加上如下2行代码: <el-drawer title"我是标题" :visible.sync"showDrawer" :direction"ltr" :append-to-body"true":modal-append-to-body&…

【C++ STL】 list 模拟实现

文章目录 &#x1f4cd;前言&#x1f308;STL之list的模拟实现&#x1f388;list_node节点的定义&#x1f388;iterator迭代器&#x1f56f;️构造函数&#x1f56f;️*it&#x1f56f;️->&#x1f56f;️it/it&#x1f56f;️it--/--it&#x1f56f;️! / &#x1f388;l…

Web开发介绍

Web开发介绍 1 什么是web开发 Web&#xff1a;全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 所以Web开发说白了&#xff0c;就是开发网站的&#xff0c;例如下图所示的网站&#xff1a;淘宝&#xff0c;京东等等 那么我们…

如何使用sbvadmin进行私有化部署的代码开发

前言 本文主要讲述如何使用sbvadmin进行私有化部署的代码开发&#xff0c;这里我们用的私有化仓库是gitee&#xff0c;当然你也可以用自己搭建的gitlab来做&#xff0c;原理差不多。 一、新建仓库 1.后端api 导入后端仓库&#xff1a;https://github.com/billyshen26/sbvadmi…

08- 算法解读 Mask R-CNN (目标检测)

要点&#xff1a; Mask R-CNN 解读 参考资料&#xff1a;vision/references/detection at main pytorch/vision GitHub 四 Mask R-CNN 基本信息 4.1 环境配置 Python3.6/3.7/3.8Pytorch1.10或以上pycocotools(Linux:pip install pycocotools; Windows:pip install pycoco…

Zigbee物联网应用与开发复习汇总(附某高校期末真题试卷)

文章目录 一、知识梳理二、编程实战三、高校真题A卷B卷 一、知识梳理 1. Zigbee、蓝牙、IEEE802.11b&#xff08;WiFi&#xff09;标准都是工作在2.4G频段的无线通信标准&#xff1b;Zigbee主要用在短距离无线控制系统&#xff0c;传输少量的控制信息&#xff1b; 2. 短距离无…

【Linux系统】Linux进程信号详解

Linux进程信号 0 引言1 认识信号1.1 什么是信号1.2 发送信号的本质1.3 信号的处理 2 信号的产生2.1 键盘产生2.2 调用系统函数向进程发送信号2.3 由软件条件产生信号2.4 硬件异常产生信号 3 信号的保存4 信号的处理5 总结 0 引言 本篇文章会从Linux信号的产生到信号的保存&…

rtl仿真器-epicsim安装和测试

前言 epicsim 是芯华章的仿真器&#xff0c;基于iverilog 据说速度快两倍。 源码 github https://github.com/x-epic/EpicSim gittee https://gitee.com/x-epic/ 公司网站 https://www.x-epic.com/index.html#/en/developer 维护中了 安装 依赖 有些 apt-get install 就可…

【2023秋招】2023华为od4.28三道题

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&…