jQueryを使用してロールオーバー時に画像ソースを変更する


443

私はいくつかの画像とそのロールオーバー画像を持っています。jQueryを使用して、onmousemove / onmouseoutイベントが発生したときにロールオーバー画像を表示/非表示にします。次のように、すべての画像名は同じパターンに従います。

元の画像: Image.gif

ロールオーバー画像: Imageover.gif

画像ソースの「over」部分をそれぞれonmouseoverイベントとonmouseoutイベントに挿入および削除します。

jQueryを使用してどうすればよいですか?


初心者向けの例を使用して、JavaScript(またはjQuery)で画像を変更するという小さなハウツーを書きました。jQueryを使用しない例もあります。
gothy

マウスオーバーで画像を変更dotnetspeaks.com/DisplayArticle.aspx?ID=89
Sumit

10
ちょうど私が探しているもの。質問を投稿していただきありがとうございます!
Samuel Meddows、2011

このような問題があります(私の質問)。この質問の答えは素晴らしいですが、IE9ではボタンを押すたびに、画像に対する追加の要求があり、それは非常に悪いです。より良い答えを持つ体はありますか?
イマン

回答:


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がを含む絶対URLの場合は機能しません。その中に(www.example.comのように)
キーランアンドリュース

8
これは、www.over.comのようなドメインを使用している場合やover、URIの別の場所にある場合にも機能しません。
Benjamin Manns

32
最後の.replaceを.replace( "over.gif"、 ".gif");で編集することをお勧めします。
Nathan Koop、2011

2
これを投稿してくれてありがとう。私がこれを私のブログに載せたことを気にしないでほしい。私のブログは「ノートブック」のようなものであり、何かを忘れたときの「気に入るもの」です。
ウェンバート、2011

1
".match(/[^\.]+/)"メソッドとRegexを使用する必要はありません。".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 2009

私はcssについてあなたに同意しますが、質問の作成者が一度に複数の画像に適用される一般的な解決策を望んでいたようです。
ジャロッドディクソン

9
いくつかの効果を実行しているのでない限り、このソリューションが最も望ましいオプションです。私はまったく同じことを考えていました+1
Angel.King.47

6
それが最善の解決策です。新しい画像(ネットワークリクエスト)を待たないようにするには、単一のimage.jpgを使用し、background-positionで遊んで、適切な画像を表示/非表示にします。
kheraud、2011

2
@kheraud単一の画像を移動することは良い解決策ですが、それが最良かどうかは画像サイズに依存します。たとえば、遅いインターネットでは、1つの巨大なファイルに1920px幅の画像を2つダウンロードすると、許容できないほど長い時間がかかります。アイコンや小さな画像の場合は問題なく動作します。
DACrosby

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
これは私のためのものでした。関数を実行するために、つまり、DOMが準備ができている "$(function(){});"場合、JavaScriptを関数内に配置することを忘れないでください。
ミーシャ

実際には、ページがまだ読み込まれているときにトリガーされ、マウスカーソルが実際にセレクターの上にあるときに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は遅れて電車に乗り込むのが嫌いですが、JavaScriptまたはCSSの
cbr

Chrome 37では機能しません。$(this).attr( "src"、src)は正常に動作します。
Le Droid 2016年

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ドー、ホバーイベントヘルパーのことを忘れてしまった!そして、画像にクラスを追加することについての素晴らしい提案-本当にベストプラクティスです:)
ジャロッド・ディクソン

1
古い画像ソースをキャッシュするため、これははるかに優れたソリューションです。
トランテ2012年

悪い点は、画像がページの下部にあり、画像が10〜20枚ある場合、レイアウトがおかしくなります。
トランテ

13

私は次のようなuber one linerを望んでいました:

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

6

探しているソリューションがアニメーションボタンに対するものである場合、パフォーマンスを向上させるためにできる最善の方法は、スプライトと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

しばらく前に解決策を探していたところ、次のようなスクリプトが見つかりました。少し手を加えたところ、うまくいきました。

2つの画像を処理します。ほとんどの場合、デフォルトで「オフ」になり、マウスが画像から外れます(image-example_off.jpg)。時々「オン」になり、マウスがホバーされるときに必要な代替画像( 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という名前の2番目のファイルがあり、facebook.pngかつfacebook_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リスト(ここではラッパーのdivクラスを介して見つかります)のimgをターゲットにするには、次のようにします。

$('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') }
); 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.