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

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

html 复制代码
<!-- 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属性达到切换图片效果

html 复制代码
<!-- 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 属性来加载更复杂的图片。

相关推荐
Mr Xu_2 分钟前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
未来龙皇小蓝5 分钟前
RBAC前端架构-01:项目初始化
前端·架构
程序员agions13 分钟前
2026年,微前端终于“死“了
前端·状态模式
万岳科技系统开发14 分钟前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
程序员猫哥_21 分钟前
HTML 生成网页工具推荐:从手写代码到 AI 自动生成网页的进化路径
前端·人工智能·html
龙飞0522 分钟前
Systemd -systemctl - journalctl 速查表:服务管理 + 日志排障
linux·运维·前端·chrome·systemctl·journalctl
我爱加班、、27 分钟前
Websocket能携带token过去后端吗
前端·后端·websocket
AAA阿giao27 分钟前
从零拆解一个 React + TypeScript 的 TodoList:模块化、数据流与工程实践
前端·react.js·ui·typescript·前端框架
杨超越luckly33 分钟前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
hedley(●'◡'●)1 小时前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机