Ändern Sie die Bildquelle beim Rollover mit jQuery


443

Ich habe ein paar Bilder und ihre Rollover-Bilder. Mit jQuery möchte ich das Rollover-Bild ein- / ausblenden, wenn das Ereignis onmousemove / onmouseout auftritt. Alle meine Bildnamen folgen demselben Muster:

Original Bild: Image.gif

Rollover Bild: Imageover.gif

Ich möchte den "Über" -Teil der Bildquelle im Ereignis onmouseover bzw. onmouseout einfügen und entfernen .

Wie kann ich das mit jQuery machen?


Ich habe eine kleine Anleitung mit Beispielen für Anfänger geschrieben: Bild mit JavaScript (oder jQuery) ändern . Es gibt auch ein Beispiel ohne jQuery.
Gothy

Ändern Sie das Bild auf mouseover dotnetspeaks.com/DisplayArticle.aspx?ID=89
Sumit

10
Genau das, wonach ich suche. Vielen Dank für die Veröffentlichung der Frage!
Samuel Meddows

Ich habe ein Problem wie dieses ( Meine Frage ). Die Antwort auf diese Frage ist großartig, aber in IE9 gibt es jedes Mal, wenn Sie über die Schaltfläche gehen, eine zusätzliche Anforderung für das Bild und es ist sehr schlecht. Hat irgendein Körper eine bessere Antwort?
Iman

Antworten:


620

So richten Sie fertig ein:

$(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);
        });
});

Für diejenigen, die URL-Bildquellen verwenden:

$(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
Dies funktioniert nicht, wenn der src eine absolute URL mit a ist. darin (wie www.example.com)
Kieran Andrews

8
Dies funktioniert auch nicht, wenn Sie eine Domain wie www.over.com verwenden oder eine overandere Stelle in der URI haben.
Benjamin Manns

32
Darf ich vorschlagen, die endgültige .replace mit .replace ("over.gif", ".gif") zu bearbeiten?
Nathan Koop

2
Vielen Dank für die Veröffentlichung. Ich hoffe es macht dir nichts aus, dass ich das auf meinen Blog stelle. Mein Blog ist wie ein "Notizbuch" und es ist mein "Go-to-Ding", wenn ich etwas vergesse.
Wenbert

1
Es ist nicht erforderlich, die Methode ".match (/[^\.‹+//)" und Regex zu verwenden. Das ".replace (". Gif "," over.gif ") reicht aus, damit es funktioniert.
Navigatron

114

Ich weiß, dass Sie nach der Verwendung von jQuery fragen, aber Sie können den gleichen Effekt in Browsern erzielen, in denen JavaScript mithilfe von CSS deaktiviert ist:

#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);
}

Es gibt eine längere Beschreibung hier

Noch besser ist es jedoch, Sprites zu verwenden: Simple-CSS-Image-Rollover


1
Ja, aber es ist etwas schwieriger, dies bei IMAGE-Elementen zu tun :) Außerdem bedeutet CSS die Trennung von Inhalt und Präsentation. Wenn Sie dies tun, schließen Sie sich diesen Dingen an;) Sie können dies nicht für eine große Site haben, oder?
Ionuț Staicu

Ich stimme Ihnen in Bezug auf das CSS zu, aber es scheint, dass der Autor der Frage eine generische Lösung wollte, die für mehrere Bilder gleichzeitig gilt.
Jarrod Dixon

9
Diese Lösung ist die am meisten bevorzugte Option, es sei denn, Sie führen einige Effekte aus. Ich dachte genau das Gleiche +1
Angel.King.47

6
Es ist die beste Lösung. Um nicht auf das neue Bild zu warten (Netzwerkanforderung), verwenden Sie eine einzelne image.jpg und spielen Sie mit der Hintergrundposition, um das gute Bild anzuzeigen / auszublenden.
Kheraud

2
@kheraud Das Verschieben eines einzelnen Bildes ist eine gute Lösung, aber ob es das beste ist oder nicht, hängt von der Bildgröße ab. Im langsamen Internet würde das Herunterladen von zwei 1920px breiten Bildern in einer riesigen Datei unannehmbar lange dauern. Für Symbole und kleine Bilder funktioniert es jedoch einwandfrei.
DACrosby

63

Wenn Sie mehr als ein Bild haben und etwas Allgemeines benötigen, das nicht von einer Namenskonvention abhängt.

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
Dies war der eine für mich. Denken Sie daran, das Javascript in eine Funktion einzufügen, um es auszuführen, dh wenn DOM bereit ist "$ (function () {});"
Mischa

Tatsächlich wird es ausgelöst, wenn die Seite noch geladen wird, und wenn sich Ihr Mauszeiger tatsächlich über der Auswahl befindet, wird die URL ersetzt, sodass der Effekt invertiert wird
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
Beachten Sie, dass der Benutzer beim ersten Schweben eine Pause sieht, während der Browser das Bild abruft.
Tyson

1
@Tyson Ich hasse es, spät in den Zug zu steigen, aber Sie können die Bilder entweder per Javascript oder CSS
vorladen

Funktioniert auch nicht mit Chrome 37. $ (this) .attr ("src", src) funktioniert einwandfrei.
Le Droid

25

Eine generische Lösung, die Sie nicht nur auf "dieses Bild" und "dieses Bild" beschränkt, besteht möglicherweise darin, dem HTML-Code selbst die Tags "onmouseover" und "onmouseout" hinzuzufügen.

HTML

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

JavaScript

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

Abhängig von Ihrem Setup funktioniert so etwas möglicherweise besser (und erfordert weniger HTML-Änderungen).

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
    });
});

Möglicherweise möchten Sie die Klasse der Bilder in der ersten Zeile ändern. Wenn Sie mehr Bildklassen (oder einen anderen Pfad) benötigen, können Sie diese verwenden

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

und so weiter.

Es sollte funktionieren, ich habe es nicht getestet :)


2
+1 Doh, habe den Hover Event Helfer vergessen! Und netter Vorschlag zum Hinzufügen einer Klasse zu den Bildern - ist wirklich eine bewährte Methode :)
Jarrod Dixon

1
Das ist eine weitaus bessere Lösung, da die alte Bildquelle zwischengespeichert wird.
Trante

Der negative Teil ist, wenn sich das Bild unten auf der Seite befindet und 10 bis 20 Bilder vorhanden sind, wird das Layout seltsam.
Trante

13

Ich hatte auf einen über einen Liner gehofft wie:

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

6

Wenn Sie nach einer animierten Schaltfläche suchen, können Sie die Leistung am besten durch die Kombination von Sprites und CSS verbessern. Ein Sprite ist ein riesiges Bild, das alle Bilder Ihrer Website enthält (Kopfzeile, Logo, Schaltflächen und alle Dekorationen, die Sie haben). Jedes Bild, das Sie haben, verwendet eine HTTP-Anforderung. Je mehr HTTP-Anforderungen vorhanden sind, desto länger dauert das Laden.

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

Die 0px 0pxKoordinaten sind die linke obere Ecke Ihrer Sprites.

Wenn Sie jedoch ein Fotoalbum mit Ajax oder ähnlichem entwickeln, ist JavaScript (oder ein beliebiges Framework) das Beste.

Habe Spaß!


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

Als ich vor einiger Zeit nach einer Lösung suchte, fand ich ein ähnliches Skript wie das folgende, das ich nach einigen Optimierungen für mich arbeiten ließ.

Es werden zwei Bilder verarbeitet, die fast immer standardmäßig "Aus" sind, wenn die Maus vom Bild abweicht (image-example_off.jpg), und gelegentlich "Ein", wenn für die Zeit, in der die Maus bewegt wird, das erforderliche alternative Bild ( image-example_on.jpg) wird angezeigt.

<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>

Mir ist klar, dass die obige Funktion für alle Bilder innerhalb des DOM ausgeführt wird, wie es derzeit codiert ist. Wenn Sie weiteren Kontext bereitstellen, wird der Effekt auf bestimmte img-Elemente konzentriert.
Kristopher Rout

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

Ich habe so etwas wie den folgenden Code gemacht :)

Dies funktioniert nur, wenn Sie beispielsweise eine zweite Datei mit dem Namen _hover facebook.pngund habenfacebook_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

Angepasst an Richard Ayottes Code - Um ein Bild in einer ul / li-Liste anzuvisieren (hier über die Wrapper-Div-Klasse zu finden), ungefähr so:

$('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') }
); 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.