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.