两种鼠标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 属性来加载更复杂的图片。

相关推荐
糕冷小美n1 小时前
elementuivue2表格不覆盖整个表格添加固定属性
前端·javascript·elementui
小哥不太逍遥2 小时前
Technical Report 2024
java·服务器·前端
沐墨染2 小时前
黑词分析与可疑对话挖掘组件的设计与实现
前端·elementui·数据挖掘·数据分析·vue·visual studio code
anOnion2 小时前
构建无障碍组件之Disclosure Pattern
前端·html·交互设计
threerocks2 小时前
前端将死,Agent 永生
前端·人工智能·ai编程
问道飞鱼3 小时前
【前端知识】Vite用法从入门到实战
前端·vite·项目构建
爱上妖精的尾巴3 小时前
8-10 WPS JSA 正则表达式:贪婪匹配
服务器·前端·javascript·正则表达式·wps·jsa
shadow fish4 小时前
react学习记录(三)
javascript·学习·react.js
小疙瘩4 小时前
element-ui 中 el-upload 多文件一次性上传的实现
javascript·vue.js·ui
Aliex_git4 小时前
浏览器 API 兼容性解决方案
前端·笔记·学习