Alterar a fonte da imagem na rolagem usando jQuery

443

Eu tenho algumas imagens e suas imagens de sobreposição. Usando o jQuery, quero mostrar / ocultar a imagem de sobreposição quando o evento onmousemove / onmouseout acontecer. Todos os meus nomes de imagens seguem o mesmo padrão, assim:

Imagem original: Image.gif

Imagem de sobreposição: Imageover.gif

Desejo inserir e remover a parte "over" da fonte da imagem no evento onmouseover e onmouseout, respectivamente.

Como posso fazer isso usando jQuery?

Sachin Gaur
fonte
Eu escrevi um pequeno tutorial com exemplos para iniciantes, Alterar imagem com JavaScript (ou jQuery) . Há também um exemplo sem usar o jQuery.
quer
Alterar imagem no mouseover dotnetspeaks.com/DisplayArticle.aspx?ID=89
Sumit
10
Apenas o que estou procurando. Obrigado por postar a pergunta!
Samuel Meddows
Eu tenho um problema como este ( minha pergunta ). A resposta desta pergunta é ótima, mas no IE9 toda vez que você passa o botão, há uma solicitação adicional de imagem e é muito ruim. Alguém tem uma resposta melhor?
Iman

Respostas:

620

Para configurar o ready:

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

Para aqueles que usam fontes de imagem de 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);

            });
    });
Jarrod Dixon
fonte
7
Isso não funciona se o src for um URL absoluto com a. nele (como www.example.com)
Kieran Andrews
8
Isso também não funciona se você usar um domínio como www.over.com ou overoutro local no URI.
22811 Benjamin Manns
32
posso sugerir a edição do .replace final com .replace ("over.gif", ".gif");
Nathan Koop
2
Obrigado por postar isso. Espero que você não se importe que eu coloque isso no meu blog. Meu blog é como um "caderno" e é o meu "assunto principal" quando esqueço algo.
wenbert 16/09
1
Não é necessário usar o método ".match (///^^\" +/) "e com o Regex. O ".replace (". Gif "," over.gif ") é suficiente para funcionar.
Navigatron
114

Sei que você está perguntando sobre o uso do jQuery, mas você pode obter o mesmo efeito em navegadores com JavaScript desativado 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);
}

Há uma descrição mais longa aqui

Melhor ainda, no entanto, é usar sprites: simple-css-image-rollover

Tyson
fonte
1
sim, mas é um pouco mais difícil fazer isso nos elementos IMAGE :) Além disso, CSS significa a separação do conteúdo da apresentação. Se você fizer isso, junte-se a essas coisas;) Você não pode ter isso para um site grande, certo?
315/09 Ionuț Staicu
Concordo com você sobre o css, mas parece que o autor da pergunta queria uma solução genérica que se aplica a várias imagens ao mesmo tempo.
Jarrod Dixon
9
Esta solução é a opção mais preferível, a menos que você esteja fazendo alguns efeitos. Eu estava pensando exatamente a mesma coisa +1
Angel.King.47
6
É a melhor solução. Para evitar esperar pela nova imagem (solicitação de rede), use um único image.jpg e brinque com a posição de segundo plano para mostrar / ocultar a boa.
kheraud
2
@kheraud Mover uma única imagem é uma boa solução, mas se é a melhor ou não depende do tamanho da imagem. Por exemplo, na Internet lenta, o download de duas imagens de 1920 px em um arquivo gigantesco levaria inaceitavelmente tempo. Para ícones e imagens pequenas, embora funcione bem.
usar o seguinte código
63

Se você tiver mais de uma imagem e precisar de algo genérico que não dependa de uma convenção de nomenclatura.

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') 
    })
});
Richard Ayotte
fonte
1
Esse foi para mim. Lembre-se de colocar o javascript dentro de uma função para executá-lo, ou seja, quando o DOM estiver pronto "$ (function () {});"
precisa saber é o seguinte
Na verdade, ele dispara quando a página ainda está carregando, e quando o cursor do mouse é realmente sobre o selector substitui o url assim, então o efeito é invertida
Mike
57
    /* Teaser image swap function */
    $('img.swap').hover(function () {
        this.src = '/images/signup_big_hover.png';
    }, function () {
        this.src = '/images/signup_big.png';
    });
jonasl
fonte
4
Lembre-se de que, dessa maneira, o usuário verá uma pausa na primeira focalização enquanto o navegador buscar a imagem.
Tyson
1
@Tyson Odeio apanhar o trem atrasado, mas você pode pré-carregar as imagens por qualquer via Javascript ou CSS
cbr
Também não funciona no Chrome 37. $ (this) .attr ("src", src) funciona bem.
Le Droid
25

Uma solução genérica que não limita você a "esta imagem" e "essa imagem" pode ser apenas adicionar as tags 'onmouseover' e 'onmouseout' ao próprio código HTML.

HTML

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

Javascript

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

Dependendo da sua configuração, talvez algo assim funcione melhor (e requer menos modificações em 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"]);
  }
DACrosby
fonte
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
    });
});

Você pode alterar a classe de imagens da primeira linha. Se você precisar de mais classes de imagens (ou caminho diferente), poderá usar

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

e assim por diante.

Deve funcionar, eu não testei :)

Ionuț Staicu
fonte
2
+1 Doh, esqueceu o ajudante do evento pairar! E boa sugestão sobre como adicionar uma classe para as imagens - realmente é uma prática recomendada :)
Jarrod Dixon
1
Essa é uma solução muito melhor porque armazena em cache a fonte de imagem antiga.
trante
A parte negativa é que, se a imagem estiver na parte inferior da página e houver 10 a 20 imagens, o layout se tornará estranho.
trante
13

Eu estava esperando por um über one liner como:

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

Se a solução que você procura é um botão animado, o melhor que você pode fazer para melhorar o desempenho é a combinação de sprites e CSS. Um sprite é uma imagem enorme que contém todas as imagens do seu site (cabeçalho, logotipo, botões e todas as decorações que você possui). Cada imagem que você possui usa uma solicitação HTTP, e quanto mais solicitações HTTP, mais tempo levará para carregar.

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

As 0px 0pxcoordenadas serão o canto superior esquerdo dos seus sprites.

Mas se você estiver desenvolvendo algum álbum de fotos com o Ajax ou algo assim, o JavaScript (ou qualquer estrutura) é o melhor.

Diverta-se!

mate
fonte
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); 
});
iamrasec
fonte
4

Enquanto procurava uma solução há algum tempo, encontrei um script semelhante ao abaixo, que após alguns ajustes comecei a trabalhar para mim.

Ele lida com duas imagens, que quase sempre são padronizadas como "off", onde o mouse está fora da imagem (image-example_off.jpg), e a ocasional "on", onde, durante o tempo em que o mouse passa o mouse, a imagem alternativa necessária ( image-example_on.jpg) é exibido.

<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>
Kristopher Rout
fonte
Sei que a função acima seria executada para todas as imagens dentro do DOM, como está atualmente codificado. Fornecer outro contexto faria com que ele focalizasse o efeito em elementos IMG específicos.
precisa saber é o seguinte
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>
Imran
fonte
2

Eu criei algo como o seguinte código :)

Funciona apenas quando você tem um segundo arquivo nomeado com _hover, por exemplo, 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);
});
Grzegorz
fonte
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();
Gustav Westling
fonte
1

Adaptado do código de Richard Ayotte - Para direcionar um img em uma lista ul / li (encontrada na classe div do wrapper aqui), algo como isto:

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