0

0

动态图片切换:鼠标悬停恢复原始图片源的专业指南

聖光之護

聖光之護

发布时间:2025-09-27 13:02:01

|

452人浏览过

|

来源于php中文网

原创

动态图片切换:鼠标悬停恢复原始图片源的专业指南

本教程详细阐述了如何在网页中实现图片动态切换,即鼠标悬停时显示新图片,鼠标移开时自动恢复原始图片,且无需硬编码原始图片路径。文章着重解决了在获取原始图片 src 时常见的 DOM 元素选择器错误,并提供了基于 jQuery 的正确实现方法,确保代码的健壮性和可维护性。

动态图片切换:鼠标悬停恢复原始图片源的专业指南

在现代网页设计中,为用户提供丰富的交互体验至关重要。图片动态切换是常见的交互方式之一,例如当鼠标悬停在一个链接或区域上时,主图片会相应地发生变化,而当鼠标移开时,图片应恢复到其原始状态。本文将深入探讨如何高效且健壮地实现这一功能,特别是在不硬编码原始图片路径的情况下,以及如何避免在获取 dom 元素时常见的错误。

挑战:动态恢复原始图片源

通常,实现鼠标悬停图片切换的逻辑相对简单:

  1. 鼠标悬停 (mouseover): 获取目标图片的新 src 路径,并将其赋给主图片。
  2. 鼠标移开 (mouseout): 将主图片的 src 恢复到原始路径。

然而,当页面中存在多个触发元素(例如多个链接对应同一张主图片的不同切换效果),且不希望为每个触发元素都硬编码原始图片路径时,问题就出现了。我们需要一种机制来动态地获取并存储主图片的原始 src,以便在 mouseout 事件中引用。

常见陷阱:DOM 元素选择器错误

在尝试动态获取原始 src 时,开发者常犯的一个错误是使用不恰当的 DOM 元素选择方法。例如,以下代码尝试获取 .img-set img 元素的 src:

var original = document.getElementsByClassName(".img-set img").getAttribute("src");

这段代码存在两个关键问题:

  1. document.getElementsByClassName() 方法的参数应该是纯粹的类名(不带 .),并且它返回的是一个 HTMLCollection(一个类数组对象),而不是单个 DOM 元素。
  2. 即使参数正确,getAttribute() 方法也不能直接在一个 HTMLCollection 上调用。它需要作用于一个具体的 DOM 元素。因此,上述代码会因尝试在一个非元素对象上调用 getAttribute 而导致错误(通常是 TypeError),或者在严格模式下 getElementsByClassName 无法识别 .img-set img 这种复合选择器而返回空集合。

为了正确地获取单个元素的属性,我们需要使用能够精确选择单个元素的方法,例如 document.querySelector() 或 jQuery 的 $() 函数。

解决方案:正确捕获与恢复原始 src

为了克服上述挑战并实现动态恢复原始图片源,我们可以遵循以下步骤:

1. 捕获初始图片 src

在 DOM 加载完成后,立即获取主图片的原始 src 并将其存储在一个作用域可访问的变量中。使用 document.querySelector() 或 jQuery 的 $() 是最可靠的方法。

$(document).ready(function() {
    // 使用 jQuery 选择器获取元素并获取其 src 属性
    var originalImageSrc = $(".img-set img").attr("src");

    // 或者使用原生 JavaScript
    // var originalImageSrc = document.querySelector(".img-set img").getAttribute("src");

    // ... 后续事件处理逻辑
});

将 originalImageSrc 变量定义在 $(document).ready() 回调函数的外部或其内部的父级作用域中,确保 mouseover 和 mouseout 事件处理器都能访问到它。

2. 实现鼠标事件处理逻辑

接下来,我们将为触发元素(例如 hotspots a)绑定 mouseover 和 mouseout 事件处理器。

HTML 结构示例:

Cutout.Pro抠图
Cutout.Pro抠图

AI批量抠图去背景

下载

TITLE

Name 1 Name 2
@@##@@

JavaScript/jQuery 代码:

$(document).ready(function() {
    // 1. 捕获原始图片 src
    var originalImageSrc = $(".img-set img").attr("src");

    // 2. 绑定 mouseover 事件
    $(".hotspots a").mouseover(function() {
        // 获取 data-src 属性作为新的图片源
        var newImageSrc = $(this).attr('data-src');
        // 更新主图片的 src
        $(".img-set img").attr("src", newImageSrc);

        // 处理相关联的文本元素显示/隐藏
        var targetId = $(this).data("target");
        $("#" + targetId).removeClass("opacity-0");
    });

    // 3. 绑定 mouseout 事件
    $(".hotspots a").mouseout(function() {
        // 恢复主图片的 src 到原始值
        $(".img-set img").attr("src", originalImageSrc);

        // 处理相关联的文本元素显示/隐藏
        var targetId = $(this).data("target");
        $("#" + targetId).addClass("opacity-0");
    });
});

在上述代码中:

  • originalImageSrc 在 $(document).ready() 块的顶部被初始化,确保在任何事件触发前获取到正确的值。
  • mouseover 事件处理器从触发的 元素中读取 data-src 属性,并将其设置为 img-set 中图片的 src。
  • mouseout 事件处理器则简单地将 img-set 中图片的 src 恢复为之前存储的 originalImageSrc。
  • 同时,代码也处理了与图片切换相关联的文本元素的显示/隐藏(通过添加/移除 opacity-0 类),增加了交互的完整性。

完整示例

将 HTML 结构与 JavaScript 代码结合,形成一个完整的、可工作的示例:




    
    
    动态图片切换与恢复
    
    


    

图片交互示例

产品 A 详情 产品 B 详情

注意事项与最佳实践

  1. 变量作用域: 将 originalImageSrc 变量定义在 $(document).ready() 的顶层作用域,确保它能够被内部的 mouseover 和 mouseout 事件处理器访问到。

  2. jQuery 优势: jQuery 提供了简洁的 DOM 操作 API,如 attr()、data()、removeClass() 和 addClass(),极大地简化了代码。

  3. 图片预加载: 如果切换的图片较多或较大,可以考虑在页面加载时预加载这些图片,以避免切换时的闪烁或延迟。

  4. 多图片集场景: 如果页面中有多个独立的图片切换区域(即有多个 .img-set),上述方案需要略作调整。一种方法是在每个 .img-set img 元素上使用 data-original-src 属性来存储其自身的原始 src,然后在事件处理器中使用 $(this).closest('.img-set').find('img') 来定位当前操作的图片,并读取/写入其 data-original-src。

    // 适用于多个独立图片集的场景
    $(document).ready(function() {
        // 遍历每个图片集,存储其原始src
        $(".img-set img").each(function() {
            $(this).data("original-src", $(this).attr("src"));
        });
    
        $(".hotspots a").mouseover(function() {
            var newImageSrc = $(this).attr('data-src');
            // 找到当前链接所属的图片集中的图片
            $(this).closest('.col-12').find(".img-set img").attr("src", newImageSrc);
    
            var targetId = $(this).data("target");
            // 隐藏所有,显示当前
            $(this).closest('.col-12').find(".some-name").addClass("opacity-0");
            $("#" + targetId).removeClass("opacity-0");
        });
    
        $(".hotspots a").mouseout(function() {
            // 找到当前链接所属的图片集中的图片,恢复其原始src
            var currentImage = $(this).closest('.col-12').find(".img-set img");
            currentImage.attr("src", currentImage.data("original-src"));
    
            // 隐藏所有文本
            $(this).closest('.col-12').find(".some-name").addClass("opacity-0");
        });
    });

    请注意,上述多图片集示例中的 closest('.col-12') 假设了 hotspots 和 img-set 都在同一个 .col-12 父级下。实际应用中需根据具体的 HTML 结构调整选择器。

总结

通过正确地选择 DOM 元素并管理变量作用域,我们可以轻松实现无需硬编码的动态图片切换与恢复功能。关键在于在页面加载时准确捕获原始 src,并将其存储在可访问的变量中,以便在 mouseout 事件中引用。这种方法不仅提高了代码的可维护性,也使得功能扩展变得更加简单。

Some ImageOriginal Image

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

542

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

372

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

727

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

470

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

391

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

990

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

653

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

544

2023.09.20

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 1.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号