Cambia l'origine dell'immagine al passaggio del mouse usando jQuery


443

Ho alcune immagini e le loro immagini di rollover. Usando jQuery, voglio mostrare / nascondere l'immagine di rollover quando si verifica l'evento onmousemove / onmouseout. Tutti i nomi delle mie immagini seguono lo stesso modello, in questo modo:

Immagine originale: Image.gif

Immagine di rollover: Imageover.gif

Voglio inserire e rimuovere la parte "over" della sorgente dell'immagine nell'evento onmouseover e onmouseout, rispettivamente.

Come posso farlo usando jQuery?


Ho scritto un piccolo tutorial con esempi per principianti, Cambia immagine con JavaScript (o jQuery) . C'è anche un esempio senza usare jQuery.
gotico

Cambia immagine al passaggio del mouse dotnetspeaks.com/DisplayArticle.aspx?ID=89
Sumit

10
Proprio quello che sto cercando. Grazie per aver pubblicato la domanda!
Samuel Meddows il

Ho un problema come questo (La mia domanda ). La risposta a questa domanda è ottima, ma in IE9 ogni volta che si passa sul pulsante, c'è una richiesta aggiuntiva per l'immagine ed è pessima. Qualcuno ha una risposta migliore?
Iman,

Risposte:


620

Per impostare pronto:

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

Per quelli che usano le fonti di immagini 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
Questo non funziona se src è un url assoluto con a. in esso (come www.example.com)
Kieran Andrews,

8
Anche questo non funziona se si utilizza un dominio come www.over.com o se si ha un overaltro posto nell'URI.
Benjamin Manns,

32
posso suggerire di modificare il .replace finale con .replace ("over.gif", ".gif");
Nathan Koop,

2
Grazie per aver pubblicato questo Spero non ti dispiaccia che l'ho messo sul mio blog. Il mio blog è come un "taccuino" ed è il mio "go-to-thing" quando dimentico qualcosa.
wenbert,

1
Non è necessario utilizzare il metodo ".match (/[^\.[+/)" e con Regex. ".Replace (". Gif "," over.gif ") è sufficiente perché funzioni.
Navigatron,

114

So che stai chiedendo di usare jQuery, ma puoi ottenere lo stesso effetto nei browser che hanno JavaScript disattivato usando CSS:

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

C'è una descrizione più lunga qui

Ancora meglio, tuttavia, è usare gli sprite: simple-css-image-rollover


1
sì, ma è un po 'più difficile farlo sugli elementi IMMAGINE :) Oltre a ciò, CSS significa la separazione dei contenuti dalla presentazione. Se lo fai, ti unisci a quelle cose;) Non puoi avere questo per un sito di grandi dimensioni, giusto?
Ionuț Staicu,

Sono d'accordo con te sul CSS, ma sembra che l'autore della domanda volesse una soluzione generica che si applichi a più immagini contemporaneamente.
Jarrod Dixon

9
Questa soluzione è l'opzione più preferibile, a meno che tu non stia facendo alcuni effetti. Stavo pensando esattamente la stessa cosa +1
Angel.King.47,

6
È la migliore soluzione Per evitare di aspettare la nuova immagine (richiesta di rete) usa una singola immagine.jpg e gioca con la posizione di sfondo per mostrare / nascondere quella buona.
kheraud,

2
@kheraud Spostare una singola immagine è una buona soluzione, ma se è la migliore o meno dipende dalle dimensioni dell'immagine. Ad esempio, su Internet lento, il download di due immagini da 1920px in un file gigantesco richiederebbe un tempo inaccettabilmente lungo. Per icone e immagini di piccole dimensioni, tuttavia, funziona bene.
DACrosby,

63

Se hai più di un'immagine e hai bisogno di qualcosa di generico che non dipenda da una convenzione di denominazione.

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
Questo era quello per me. Ricorda solo di inserire il javascript in una funzione per eseguirlo, ad esempio quando DOM è pronto "$ (function () {});"
Mischa,

In realtà si attiva quando la pagina è ancora in fase di caricamento e quando il cursore del mouse si trova sul selettore, sostituisce l'URL, quindi l'effetto viene invertito
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
Tieni presente che andare in questo modo significa che l'utente vedrà una pausa al primo passaggio del mouse mentre il browser recupera l'immagine.
Tyson,

1
@Tyson Hate salire sul treno tardi, ma puoi precaricare le immagini tramite Javascript o CSS
cbr

Non funziona neanche su Chrome 37. $ (questo) .attr ("src", src) funziona bene.
Le Droid,

25

Una soluzione generica che non ti limita a "questa immagine" e "quell'immagine" potrebbe essere quella di aggiungere i tag 'onmouseover' e 'onmouseout' al codice HTML stesso.

HTML

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

JavaScript

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

A seconda della configurazione, forse qualcosa del genere funzionerebbe meglio (e richiede meno modifiche 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
    });
});

Potresti voler cambiare la classe di immagini dalla prima riga. Se hai bisogno di più classi di immagini (o percorso diverso) puoi usare

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

e così via.

Dovrebbe funzionare, non l'ho provato :)


2
+1 Doh, ho dimenticato l'helper dell'evento hover! E un bel suggerimento sull'aggiunta di una classe alle immagini - è davvero una buona pratica :)
Jarrod Dixon

1
Questa è la soluzione molto migliore perché memorizza nella cache la vecchia fonte di immagini.
trante,

La parte negativa è che se l'immagine è nella parte inferiore della pagina e ci sono 10-20 immagini, il layout diventa strano.
trante,

13

Speravo in una fodera über come:

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

6

Se la soluzione che stai cercando è un pulsante animato, il meglio che puoi fare per migliorare le prestazioni è la combinazione di sprite e CSS. Uno sprite è un'immagine enorme che contiene tutte le immagini del tuo sito (intestazione, logo, pulsanti e tutte le decorazioni che hai). Ogni immagine che hai utilizza una richiesta HTTP, e più HTTP richiede più tempo ci vorrà per caricare.

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

Le 0px 0pxcoordinate saranno l'angolo in alto a sinistra dei tuoi sprite.

Ma se stai sviluppando qualche album fotografico con Ajax o qualcosa del genere, JavaScript (o qualsiasi framework) è il migliore.

Divertiti!


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

Mentre cercavo una soluzione qualche tempo fa, ho trovato una sceneggiatura simile alla seguente, che dopo alcune modifiche ho iniziato a lavorare per me.

Gestisce due immagini, che quasi sempre di default "off", in cui il mouse è spento dall'immagine (image-example_off.jpg), e l'occasionale "on", in cui per i tempi in cui il mouse è sospeso, l'immagine alternativa richiesta ( image-example_on.jpg) viene visualizzato.

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

Mi rendo conto che la funzione sopra sarebbe eseguita per tutte le immagini all'interno del DOM così come è attualmente codificato. Fornire ulteriore contesto consentirebbe di focalizzare l'effetto su elementi img specifici.
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

Ho fatto qualcosa di simile al seguente codice :)

Funziona solo quando hai un secondo file chiamato _hover, per esempio, facebook.pngefacebook_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

Adattato dal codice di Richard Ayotte - Per indirizzare un img in un elenco ul / li (trovato tramite la classe div wrapper qui), qualcosa del genere:

$('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') }
); 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.