使用jQuery更改图片来源


443

我有一些图像及其翻转图像。我想使用jQuery在onmousemove / onmouseout事件发生时显示/隐藏过渡图像。我所有的图像名称都遵循相同的模式,如下所示:

原始图片: Image.gif

展期图片: Imageover.gif

我想分别在onmouseover和onmouseout事件中插入和删除图像源的“结束”部分。

我该如何使用jQuery?


我为初学者编写了一个小示例性示例,使用JavaScript(或jQuery)更改图像。还有一个不使用jQuery的示例。
gothy 2010年


10
正是我想要的。感谢您发布问题!
塞缪尔(Samuel Meddows)2011年

我有这样的问题(我的问题)。这个问题的答案很好,但是在IE9中,每次您单击按钮时,都有额外的图像请求,这是非常糟糕的。有没有更好的答案?
伊曼2012年

Answers:


620

要准备就绪,请执行以下操作:

$(function() {
    $("img")
        .mouseover(function() { 
            var src = $(this).attr("src").match(/[^\.]+/) + "over.gif";
            $(this).attr("src", src);
        })
        .mouseout(function() {
            var src = $(this).attr("src").replace("over.gif", ".gif");
            $(this).attr("src", src);
        });
});

对于使用url图片源的用户:

$(function() {
        $("img")
            .mouseover(function() {
               var src = $(this).attr("src");
               var regex = /_normal.svg/gi;
               src = this.src.replace(regex,'_rollover.svg');
               $(this).attr("src", src);

            })
            .mouseout(function() {
               var src = $(this).attr("src");
               var regex = /_rollover.svg/gi;
               src = this.src.replace(regex,'_normal.svg');
               $(this).attr("src", src);

            });
    });

7
如果src是带的绝对网址,则此方法无效。里面(例如www.example.com)
Kieran Andrews

8
如果您使用www.over.com之类的域,或者over在URI中有其他位置,则此方法也不起作用。
本杰明·曼斯

32
我可以建议用.replace(“ over.gif”,“ .gif”)编辑最终的.replace吗?
内森·库普

2
感谢您发布此信息。希望您不要介意将此内容发布到我的博客中。我的博客就像一本“笔记本”,当我忘了某些东西时,它就是我的“入门”。
wenbert 2011年

1
不需要对Regex使用“ .match(/[^\.]+/)”方法。该“.replace(” GIF”, “over.gif”)就足以为它工作。
Navigatron

114

我知道您在问使用jQuery,但在使用CSS关闭JavaScript的浏览器中也可以达到相同的效果:

#element {
    width: 100px; /* width of image */
    height: 200px; /* height of image */
    background-image: url(/path/to/image.jpg);
}

#element:hover {
    background-image: url(/path/to/other_image.jpg);
}

有一个较长的描述在这里

然而,更好的是使用精灵:simple-css-image-rollover


1
是的,但是在IMAGE元素上执行此操作并不困难:)除此之外,CSS意味着将内容与表示分离。如果这样做,那么您就加入了这些东西;)对于大型网站,您将无法使用它,对吗?
Ionuț Staicu 09年

我对css表示同意,但是问题作者似乎希望使用一种通用解决方案,一次将其应用于多个图像。
贾罗德·迪克森

9
除非您有效果,否则此解决方案是最可取的选择。我当时在想完全相同的事情+1
Angel.King.47 2011年

6
这是最好的解决方案。为了避免等待新图像(网络请求),请使用单个image.jpg并以背景位置播放来显示/隐藏好图像。
kheraud 2011年

2
@kheraud移动单个图像是一个很好的解决方案,但是是否最佳取决于图像的大小。例如,在缓慢的互联网上,在一个巨大的文件中下载两个1920px宽的图像将花费不可接受的时间。对于图标和小图像,虽然效果很好。
DACrosby 2012年

63

如果您有多个图像,并且需要某种不依赖命名约定的通用图像。

的HTML

<img data-other-src="big-zebra.jpg" src="small-cat.jpg">
<img data-other-src="huge-elephant.jpg" src="white-mouse.jpg">
<img data-other-src="friendly-bear.jpg" src="penguin.jpg">

的JavaScript

$('img').bind('mouseenter mouseleave', function() {
    $(this).attr({
        src: $(this).attr('data-other-src') 
        , 'data-other-src': $(this).attr('src') 
    })
});

1
这是给我的。只要记住将javascript放在函数中即可执行它,即当DOM准备就绪时“ $(function(){});”。
Mischa 2012年

实际上,它会在页面仍在加载时触发,并且当您的鼠标光标实际上位于选择器上方时,它将替换url,因此效果会被反转
Mike

57
    /* Teaser image swap function */
    $('img.swap').hover(function () {
        this.src = '/images/signup_big_hover.png';
    }, function () {
        this.src = '/images/signup_big.png';
    });

4
请记住,这种方式将意味着在浏览器获取图像时,用户会在第一次悬停时看到暂停。
泰森

1
@Tyson Hate迟到了,但是您可以通过JavascriptCSS
cbr 2014年

在Chrome 37上也无法使用。$(this).attr(“ src”,src)正常工作。
Le Droid

25

不将您限制为仅“此图像”和“该图像”的通用解决方案可能是在HTML代码本身中添加“ onmouseover”和“ onmouseout”标签。

的HTML

<img src="img1.jpg" onmouseover="swap('img2.jpg')" onmouseout="swap('img1.jpg')" />

的JavaScript

function swap(newImg){
  this.src = newImg;
}

根据您的设置,也许类似的方法会更好(并且需要更少的HTML修改)。

的HTML

<img src="img1.jpg" id="ref1" />
<img src="img3.jpg" id="ref2" />
<img src="img5.jpg" id="ref3" />

JavaScript / jQuery

// Declare Arrays
  imgList = new Array();
  imgList["ref1"] = new Array();
  imgList["ref2"] = new Array();
  imgList["ref3"] = new Array();

//Set values for each mouse state
  imgList["ref1"]["out"] = "img1.jpg";
  imgList["ref1"]["over"] = "img2.jpg";
  imgList["ref2"]["out"] = "img3.jpg";
  imgList["ref2"]["over"] = "img4.jpg";
  imgList["ref3"]["out"] = "img5.jpg";
  imgList["ref3"]["over"] = "img6.jpg";

//Add the swapping functions
  $("img").mouseover(function(){
    $(this).attr("src", imgList[ $(this).attr("id") ]["over"]);
  }

  $("img").mouseout(function(){
    $(this).attr("src", imgList[ $(this).attr("id") ]["out"]);
  }

21
$('img.over').each(function(){
    var t=$(this);
    var src1= t.attr('src'); // initial src
    var newSrc = src1.substring(0, src1.lastIndexOf('.'));; // let's get file name without extension
    t.hover(function(){
        $(this).attr('src', newSrc+ '-over.' + /[^.]+$/.exec(src1)); //last part is for extension   
    }, function(){
        $(this).attr('src', newSrc + '.' + /[^.]+$/.exec(src1)); //removing '-over' from the name
    });
});

您可能要从第一行更改图像的类别。如果您需要更多图像类别(或其他路径),则可以使用

$('img.over, #container img, img.anotherOver').each(function(){

等等。

它应该工作,我没有测试它:)


2
+1 Doh,忘记了悬停事件助手!关于向图像添加类的好建议-确实是一种最佳实践:)
Jarrod Dixon

1
那是更好的解决方案,因为它缓存了旧的图像源。
trante 2012年

不利的一面是,如果图像在页面底部,并且有10-20张图像,则布局变得很奇怪。
trante 2012年

13

我希望有一个像这样的über班轮:

$("img.screenshot").attr("src", $(this).replace("foo", "bar"));

6

如果您正在寻找的解决方案是使用动画按钮,那么提高性能的最佳方法就是将Sprite和CSS结合使用。子画面是一个巨大的图像,其中包含您网站上的所有图像(标题,徽标,按钮以及您拥有的所有装饰)。您拥有的每个图像都使用一个HTTP请求,并且HTTP请求越多,加载所需的时间就越多。

.buttonClass {
    width: 25px;
    height: 25px;
    background: url(Sprite.gif) -40px -500px;
}
.buttonClass:hover {
    width: 25px;
    height: 25px;
    background: url(Sprite.gif) -40px -525px;
}

0px 0px坐标将是你的精灵左上角。

但是,如果您正在使用Ajax或类似的东西来开发相册,那么JavaScript(或任何框架)是最好的。

玩得开心!


4
$('img').mouseover(function(){
  var newSrc = $(this).attr("src").replace("image.gif", "imageover.gif");
  $(this).attr("src", newSrc); 
});
$('img').mouseout(function(){
  var newSrc = $(this).attr("src").replace("imageover.gif", "image.gif");
  $(this).attr("src", newSrc); 
});

4

在寻找解决方案的同时,我找到了与下面类似的脚本,经过一些调整后,我开始为我工作。

它处理两个图像,几乎总是默认为“ off”(鼠标不在图像上)(image-example_off.jpg),以及偶尔的“ on”(在鼠标悬停的时候)所需要的替代图像( image-example_on.jpg)。

<script type="text/javascript">        
    $(document).ready(function() {        
        $("img", this).hover(swapImageIn, swapImageOut);

        function swapImageIn(e) {
            this.src = this.src.replace("_off", "_on");
        }
        function swapImageOut (e) {
            this.src = this.src.replace("_on", "_off");
        }
    });
</script>

我意识到上述功能将针对DOM中当前编码的所有图像执行。提供进一步的上下文将使其效果集中于特定的img元素。
Kristopher Rout 2012年

3
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>JQuery</title>
<script src="jquery.js" type="text/javascript"> </script>
<style type="text/css">
    #box{
        width: 68px;
        height: 27px;
        background: url(images/home1.gif);
        cursor: pointer;
    }
</style>

<script type="text/javascript">

$(function(){

    $('#box').hover( function(){
        $('#box').css('background', 'url(images/home2.gif)');

    });
    $('#box').mouseout( function(){
        $('#box').css('background', 'url(images/home1.gif)');

    });

});
</script>
</head>

<body>
<div id="box" onclick="location.href='index.php';"></div>
</body>
</html>

2

我做了类似下面的代码:)

它的工作原理只是,当你有_hover命名第二个文件,例如,facebook.pngfacebook_hover.png

$('#social').find('a').hover(function() {
    var target = $(this).find('img').attr('src');
    //console.log(target);
    var newTarg = target.replace('.png', '_hover.png');
    $(this).find('img').attr("src", newTarg);
}, function() {
    var target = $(this).find('img').attr('src');
    var newTarg = target.replace('_hover.png', '.png');
    $(this).find('img').attr("src", newTarg);
});

1
<img src="img1.jpg" data-swap="img2.jpg"/>



img = {

 init: function() {
  $('img').on('mouseover', img.swap);
  $('img').on('mouseover', img.swap);
 }, 

 swap: function() {
  var tmp = $(this).data('swap');
  $(this).attr('data-swap', $(this).attr('src'));
  $(this).attr('str', tmp);
 }
}

img.init();

1

改编自Richard Ayotte的代码-要定位ul / li列表中的img(可通过wrapper div类在此处找到),如下所示:

$('div.navlist li').bind('mouseenter mouseleave', function() {    
    $(this).find('img').attr({ src: $(this).find('img').attr('data-alt-src'), 
    'data-alt-src':$(this).find('img').attr('src') }
); 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.