jQuery를 사용하여 롤오버시 이미지 소스 변경


443

이미지와 롤오버 이미지가 몇 개 있습니다. jQuery를 사용하여 onmousemove / onmouseout 이벤트가 발생할 때 롤오버 이미지를 표시하거나 숨기려고합니다. 내 이미지 이름은 모두 다음과 같은 패턴을 따릅니다.

원본 이미지 : Image.gif

롤오버 이미지 : Imageover.gif

onmouseover 및 onmouseout 이벤트에서 이미지 소스 의 "over" 부분을 ​​각각 삽입하고 제거하고 싶습니다 .

jQuery를 사용하여 어떻게 할 수 있습니까?


초보자를위한 예제, JavaScript로 이미지 변경 (또는 jQuery)과 함께 작은 방법을 썼습니다 . jQuery를 사용하지 않는 예제도 있습니다.
gothy

마우스 오버에 변경 이미지 dotnetspeaks.com/DisplayArticle.aspx?ID=89
수밋

10
내가 찾고있는 것. 질문을 게시 해 주셔서 감사합니다!
Samuel Meddows

나는 이와 같은 문제가있다 ( 내 질문 ). 이 질문에 대한 답변은 훌륭하지만 IE9에서는 버튼을 누를 때마다 이미지에 대한 추가 요청이 있으며 매우 나쁩니다. 어떤 신체가 더 나은 대답을 가지고 있습니까?
Iman

답변:


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과 같은 도메인을 사용하거나 overURI에 다른 곳이있는 경우에도 작동하지 않습니다 .
Benjamin Manns

32
.replace ( "over.gif", ".gif")로 최종 .replace를 편집하는 것이 좋습니다.
Nathan Koop

2
이것을 게시 해 주셔서 감사합니다. 나는 이것을 내 블로그에 넣는 것을 신경 쓰지 않기를 바랍니다. 내 블로그는 "노트북"과 같으며 무언가를 잊었을 때의 "가야 할 것"입니다.
wenbert

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

CSS에 대해서는 동의하지만 질문 작성자는 여러 이미지에 한 번에 적용되는 일반적인 솔루션을 원한 것 같습니다.
Jarrod Dixon

9
이 솔루션은 일부 효과를 수행하지 않는 한 가장 선호되는 옵션입니다. 나는 똑같은 한 생각
Angel.King.47

6
최고의 솔루션입니다. 새 이미지 (네트워크 요청)를 기다리지 않으려면 단일 image.jpg를 사용하고 배경 위치로 재생하여 좋은 이미지를 표시 / 숨 깁니다.
kheraud

2
@kheraud 하나의 이미지를 옮기는 것이 좋은 해결책이지만 이미지 크기에 따라 최상의 이미지인지 아닌지에 달려 있습니다. 예를 들어 인터넷 속도가 느린 경우 하나의 거대한 파일로 1920px 너비의 이미지 두 개를 다운로드하면 허용 할 수없는 시간이 걸립니다. 아이콘과 작은 이미지의 경우 잘 작동합니다.
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">

자바 스크립트

$('img').bind('mouseenter mouseleave', function() {
    $(this).attr({
        src: $(this).attr('data-other-src') 
        , 'data-other-src': $(this).attr('src') 
    })
});

1
이것은 나를위한 것입니다. 자바 스크립트를 실행하기 위해 자바 스크립트를 함수 안에 넣는 것, 즉 DOM이 준비 될 때 "$ (function () {});"
Mischa

실제로 페이지가 여전히로드 될 때 트리거되고 마우스 커서가 실제로 선택기에있을 때 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는 기차에 늦게 뛰어 들지만 자바 스크립트CSS
cbr

Chrome 37에서도 작동하지 않습니다. $ (this) .attr ( "src", src)는 정상적으로 작동합니다.
르 드로이드

25

"이 이미지"및 "해당 이미지"로 제한되지 않는 일반적인 솔루션은 HTML 코드 자체에 'onmouseover'및 'onmouseout'태그를 추가하는 것입니다.

HTML

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

자바 스크립트

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

자바 스크립트 / 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 Doh, 호버 이벤트 도우미를 잊어 버렸습니다! 그리고 이미지에 클래스를 추가하는 방법에 대한 좋은 제안 - 진정으로 가장 좋은 방법입니다 :)
재 러드는 딕슨

1
이전 이미지 소스를 캐시하기 때문에 훨씬 더 나은 솔루션입니다.
trante

부정적인 부분은 이미지가 페이지의 맨 아래에 있고 10-20 개의 이미지가 있으면 레이아웃이 이상해집니다.
trante

13

나는 다음과 같은 우버 한 라이너를 바라고있었습니다.

$("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

얼마 전에 해결책을 찾고 있었지만 아래와 비슷한 스크립트를 찾았습니다.

마우스가 이미지를 벗어나는 곳 (image-example_off.jpg)에서 거의 항상 "off"로 설정되는 두 개의 이미지와 마우스를 움직 인 시간에 필요한 대체 이미지 ( "on")를 처리합니다. 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

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와 함께라는 두 번째 파일을,있을 때 만 작동 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.