两种鼠标hover切换对应图片方法对比

方法一:鼠标hover时使用JS给元素添加类名达到切换图片效果

<!-- hover元素 -->
<div class="hover-div"><ul><li class="hover-div-item" data-index="1">当鼠标hover我切换对应的图片1</li><li class="hover-div-item" data-index="2">当鼠标hover我切换对应的图片2</li><li class="hover-div-item" data-index="3">当鼠标hover我切换对应的图片3</li><li class="hover-div-item" data-index="4">当鼠标hover我切换对应的图片4</li></ul>
</div>
<!-- 图片展示 -->
<div class="image-display active-img"><img src="example1.png" alt="Displayed Image">
</div>
<div class="image-display"><img src="example2.png" alt="Displayed Image">
</div>
<div class="image-display"><img src="example3.png" alt="Displayed Image">
</div>
<div class="image-display"><img src="example4.png" alt="Displayed Image">
</div><!-- 样式 -->
<style>.image-display{display: none;}.active-img{display: block !important;}
</style><!-- JS -->
<script>document.addEventListener('DOMContentLoaded', () => {const navItems = document.querySelectorAll('.hover-div-item');const imageDisplay = document.querySelectorAll('.image-display');navItems.forEach(item => {item.addEventListener('mouseenter', () => {imageDisplay.forEach(i => i.classList.remove('active-img'));const divIndex = item.getAttribute('data-index');imageDisplay[divIndex-1].classList.add('active-img');});});});</script>

方法二:使用JS获取hover的元素所带的data-img属性值,赋值给图片src属性达到切换图片效果

<!-- hover元素 -->
<div class="hover-div"><ul><li class="hover-div-item" data-index="1" data-imgsrc="example1.png">当鼠标hover我切换对应的图片1</li><li class="hover-div-item" data-index="2" data-imgsrc="example2.png">当鼠标hover我切换对应的图片2</li><li class="hover-div-item" data-index="3" data-imgsrc="example3.png">当鼠标hover我切换对应的图片3</li><li class="hover-div-item" data-index="4" data-imgsrc="example4.png">当鼠标hover我切换对应的图片4</li></ul>
</div>
<!-- 图片展示 -->
<div class="image-display"><img id="displayed-image" src="example1.png" alt="Displayed Image">
</div><!-- 样式 -->
<style>.image-display{display: block;}</style><!-- JS -->
<script>document.addEventListener('DOMContentLoaded', () => {const navItems = document.querySelectorAll('.hover-div-item');const displayedImage = document.getElementById('displayed-image');navItems.forEach(item => {item.addEventListener('mouseenter', () => {const imgSrc = item.getAttribute('data-imgsrc');displayedImage.src = imageUrl;});});});
</script>

解析:

1. 通过添加类名切换图片(CSS控制)

  • 方式:使用 JavaScript 在 hover 事件时给元素添加类名,然后通过 CSS 控制该类名下图片的切换效果。
  • 优点
    • 性能较好:因为图片切换通过 CSS 实现,浏览器的渲染性能较好,尤其是当涉及到复杂动画时,CSS 能更好地利用硬件加速。
    • 解耦:JavaScript 负责事件绑定,CSS 控制样式,避免了将所有逻辑写在 JavaScript 中,使代码结构更清晰。
    • 响应式设计方便:通过 CSS 可以很容易地适配不同的屏幕尺寸和设备。
  • 缺点
    • 灵活性较差,尤其是在动态加载或更复杂的图片切换场景下(如异步加载图片),需要结合更多 JavaScript 代码。

2. 通过 data-imgsrc 属性切换图片(JavaScript控制)

  • 方式:使用 JavaScript 在 hover 时获取元素的 data-imgsrc 属性值,然后直接修改目标图片的 src 属性。
  • 优点
    • 灵活性高:可以直接通过 JavaScript 控制图片的切换,适用于需要动态处理的数据(比如从服务器获取的图片或需要根据不同条件加载不同的图片)。
    • 直接控制:如果你需要更复杂的逻辑,比如逐步切换图片、延迟加载或异步图片切换等,JavaScript 方式提供了更多的控制权。
  • 缺点
    • 性能问题:如果操作不当,频繁修改 DOM 可能会影响性能,尤其是在较多图片元素上执行时。
    • 样式耦合度高:直接通过 JavaScript 控制样式,可能使得 HTML 结构与样式紧密耦合,难以维护和扩展。

性能对比:

  • CSS 方法的性能通常更优,因为浏览器的渲染引擎对 CSS 动画优化得更好,且无需每次都触发 JavaScript 执行。
  • JavaScript 方法可能需要频繁操作 DOM,如果每次 hover 都去修改 src 属性,可能会带来一定的性能开销,尤其是在多个图片的情况下。

总结:

  • 优先选择 CSS 方法,如果你的切换需求简单,并且只涉及到预定义的几种样式或图片。CSS 方法在性能上通常更加高效,并且代码结构更清晰。
  • 如果你有 动态数据复杂逻辑,比如每次 hover 时需要加载不同的图片,或者图片是异步加载的,使用 JavaScript 切换 src 属性会更合适。

如果可以,最好是将两者结合使用:通过 CSS 实现基本的切换效果,而在需要时通过 JavaScript 动态获取 data-img 属性来加载更复杂的图片。

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

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

相关文章

Serverless架构在实时数据处理中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Serverless架构在实时数据处理中的应用 Serverless架构在实时数据处理中的应用 Serverless架构在实时数据处理中的应用 引言 Ser…

day14|static关键字和const关键字的作用、常量指针和指针常量之间有什么区别、结构体和类之间有什么区别

day14|C重难点之 static关键字和const关键字的作用、常量指针和指针常量之间有什么区别、结构体和类之间有什么区别 37.static关键字和const关键字的作用38.常量指针和指针常量之间有什么区别39.结构体和类之间有什么区别 37.static关键字和const关键字的作用 1. static 关键字…

【Android、IOS、Flutter、鸿蒙、ReactNative 】标题栏

Android 标题栏 参考 Android Studio版本 配置gradle镜像 阿里云 Android使用 android:theme 显示标题栏 添加依赖 dependencies {implementation("androidx.appcompat:appcompat:1.6.1")implementation("com.google.android.material:material:1.9.0")…

pytorch量化训练

训练时量化&#xff08;Quantization-aware Training, QAT&#xff09;是一种在模型训练过程中&#xff0c;通过模拟低精度量化效应来增强模型对量化操作的鲁棒性的技术。与后训练量化不同&#xff0c;QAT 允许模型在训练过程中考虑到量化引入的误差&#xff0c;从而在实际部署…

docker--工作目录迁移

前言 安装docker&#xff0c;默认的情况容器的默认存储路径会存储系统盘的 /var/lib/docker 目录下&#xff0c;系统盘一般默认 50G&#xff0c;容器输出的所有的日志&#xff0c;文件&#xff0c;镜像&#xff0c;都会存在这个地方&#xff0c;时间久了就会占满系统盘。 一、…

开发效率工具链全解析

&#x1f6e0; 开发效率工具链全解析&#xff1a;从入门到精通 在现代前端开发中&#xff0c;高效的工具链对于提升开发效率至关重要。本文将全方位剖析项目脚手架、包管理工具以及构建工具的深度集成与实战应用。 &#x1f4d1; 内容导航 工具链概述项目脚手架包管理工具常见…

[ 网络安全介绍 3 ] 网络安全事件相关案例有哪些?

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

【Unity基础】Unity中碰撞及触发类物理交互应用场景说明

一、碰撞类回调方法 在Unity中&#xff0c;碰撞类回调方法是用于处理物体间碰撞的逻辑。这些方法常用于 MonoBehaviour 脚本中&#xff0c;以便在物体发生碰撞时进行响应。以下是最常用的三个碰撞类回调方法的详细说明&#xff1a; 1. OnCollisionEnter(Collision collision)…

【MySQL】MySQL中的函数之REGEXP_SUBSTR

在 MySQL 中&#xff0c;REGEXP_SUBSTR() 函数用于从字符串中提取与正则表达式匹配的子串。这个函数也是从 MySQL 8.0 开始引入的。下面是一些关于如何使用 REGEXP_SUBSTR() 的详细说明和示例。 基本语法 REGEXP_SUBSTR(str, pat [, position [, occurrence [, match_type ]]…

使用Java绘制图片边框,解决微信小程序map组件中marker与label层级关系问题,label增加外边框后显示不能置与marker上面

今天上线的时候发现系统不同显示好像不一样&#xff0c;苹果手机打开的时候是正常的&#xff0c;但是一旦用安卓手机打开就会出现label不置顶的情况。尝试了很多种办法&#xff0c;也在官方查看了map相关的文档&#xff0c;发现并没有给label设置zIndex的属性&#xff0c;只看到…

arm64架构的linux 配置vm_page_prot方式

在 ARM64 架构上&#xff0c;通过 vm_page_prot 属性可以修改 UIO 映射内存的访问权限及缓存策略&#xff0c;常见的有非缓存&#xff08;Non-cached&#xff09;、写合并&#xff08;Write Combine&#xff09;等。下面是 ARM64 常用的 vm_page_prot 设置及其对应的操作方式。…

Redisson的可重入锁

初始状态&#xff1a; 表示系统或资源在没有线程持有锁的情况下的状态&#xff0c;任何线程都可以尝试获取锁。 线程 1 获得锁&#xff1a; 线程 1 首次获取了锁并进入受保护的代码区域。 线程 1 再次请求锁&#xff1a; 在持有锁的情况下&#xff0c;线程 1 再次请求锁&a…

探秘Spring Boot中的@Conditional注解

文章目录 1. 什么是Conditional注解&#xff1f;2. 为什么需要Conditional注解&#xff1f;3. 如何使用Conditional注解&#xff1f;4. Conditional注解的高级用法5. 注意事项6. 结语推荐阅读文章 在Spring Boot的世界里&#xff0c;配置的灵活性和多样性是至关重要的。有时候&…

三周精通FastAPI:37 包含 WSGI - Flask,Django,Pyramid 以及其它

官方文档&#xff1a;https://fastapi.tiangolo.com/zh/advanced/wsgi/ 包含 WSGI - Flask&#xff0c;Django&#xff0c;其它 您可以挂载多个 WSGI 应用&#xff0c;正如您在 Sub Applications - Mounts, Behind a Proxy 中所看到的那样。 为此, 您可以使用 WSGIMiddlewar…

Swagger UI

Swagger UI 是一个开源工具&#xff0c;用于可视化、构建和交互式地探索 RESTful API。 它是 Swagger 生态系统的一部分&#xff0c;Swagger 是一套用于描述、生成、调用和可视化 RESTful Web 服务的工具和规范。 Swagger UI 可以自动生成 API 文档&#xff0c;并提供一个交互…

thinkphp6 --数据库操作 增删改查

一、数据库连接配置 如果是本地测试&#xff0c;它会优先读取 .env 配置&#xff0c;然后再读取 database.php 的配置&#xff1b; 如果禁用了 .env 配置&#xff0c;则会读取数据库连接的默认配置&#xff1a; # .env文件&#xff0c;部署服务器&#xff0c;请禁用我 我们可以…

WPF中MVVM工具包 CommunityToolkit.Mvvm

CommunityToolkit.Mvvm&#xff0c;也称为MVVM工具包&#xff0c;是Microsoft Community Toolkit的一部分。它是一个轻量级但功能强大的MVVM&#xff08;Model-View-ViewModel&#xff09;库&#xff0c;旨在帮助开发者更容易地实现MVVM设计模式。 特点 独立于平台和运行时&a…

【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-最大的数

CL13 最大的数(20 分) 输入一个有 n 个无重复元素的整数数组 a&#xff0c;输出数组中最大的数。提示&#xff1a;如使用排序库函数 sort()&#xff0c;需要包含头文件#include 。输入&#xff1a; 第一行是一个正整数 n(2<n<20)&#xff1b; 第二行包含 n 个不重复的整…

让Git走代理

有时候idea提交代码或者从github拉取代码&#xff0c;一直报错超时或者:Recv failure: Connection was reset,下面记录一下怎么让git走代理从而访问到github。 1.打开梯子 2.打开网络和Internet设置 3.设置代理 记住这个地址和端口 4.打开git bash终端 输入以下内容 git c…

vivo 游戏中心包体积优化方案与实践

作者&#xff1a;来自 vivo 互联网大前端团队- Ke Jie 介绍 App 包体积优化的必要性&#xff0c;游戏中心 App 在实际优化过程中的有效措施&#xff0c;包括一些优化建议以及优化思路。 一、包体积优化的必要性 安装包大小与下载转化率的关系大致是成反比的&#xff0c;即安装…