เปลี่ยนแหล่งรูปภาพในแบบโรลโอเวอร์โดยใช้ jQuery


443

ฉันมีภาพไม่กี่ภาพและภาพโรลโอเวอร์ของพวกเขา ใช้ jQuery ฉันต้องการแสดง / ซ่อนภาพโรลโอเวอร์เมื่อเกิดเหตุการณ์ onmousemove / onmouseout ชื่อภาพทั้งหมดของฉันเป็นไปตามรูปแบบเดียวกันเช่นนี้:

ภาพต้นฉบับ: Image.gif

รูปภาพแบบโรลโอเวอร์: Imageover.gif

ฉันต้องการแทรกและลบส่วน"โอเวอร์"ของแหล่งรูปภาพในเหตุการณ์ onmouseover และ onmouseout ตามลำดับ

ฉันจะใช้ jQuery ได้อย่างไร


ผมเขียนขนาดเล็กวิธีการที่มีตัวอย่างสำหรับผู้เริ่มต้นเปลี่ยนภาพด้วย JavaScript (หรือ jQuery) นอกจากนี้ยังมีตัวอย่างโดยไม่ใช้ jQuery
gothy

เปลี่ยนภาพบน mouseover dotnetspeaks.com/DisplayArticle.aspx?ID=89
Sumit

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 แบบสัมบูรณ์พร้อม a ในนั้น (เช่น www.example.com)
Kieran Andrews

8
สิ่งนี้ยังใช้ไม่ได้หากคุณใช้โดเมนเช่น www.over.com หรือมีที่overอื่นใน URI
Benjamin Manns

32
ฉันขอแนะนำให้แก้ไข. แทนที่ด้วย. แทนที่ ("over.gif", ".gif");
นาธานคูป

2
ขอขอบคุณที่โพสต์สิ่งนี้ ฉันหวังว่าคุณจะไม่รังเกียจที่จะใส่สิ่งนี้ลงในบล็อกของฉัน บล็อกของฉันเป็นเหมือน "สมุดบันทึก" และเป็น "ไปสู่สิ่ง" เมื่อฉันลืมบางสิ่งบางอย่าง
Wenbert

1
ไม่จำเป็นต้องใช้วิธี ".match (/ [^^\. เหมือนกัน +/)" และด้วย Regex ".replace (". gif "," over.gif ") เพียงพอสำหรับการใช้งาน
Navigatron

114

ฉันรู้ว่าคุณกำลังถามเกี่ยวกับการใช้ jQuery แต่คุณสามารถบรรลุผลเช่นเดียวกันในเบราว์เซอร์ที่ปิดการใช้งาน JavaScript โดยใช้ 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);
}

มีคำอธิบายอีกต่อไปที่นี่

อย่างไรก็ตามดีกว่าคือการใช้สไปรต์: simple-css-image-rollover


1
ใช่ แต่ทำได้ยากขึ้นเล็กน้อยในองค์ประกอบ IMAGE :) นอกจากนั้น CSS หมายถึงการแยกเนื้อหาออกจากงานนำเสนอ ถ้าคุณทำสิ่งนี้คุณเข้าร่วมสิ่งเหล่านั้น;) คุณไม่สามารถมีเว็บไซต์ขนาดใหญ่ใช่ไหม?
Ionuț Staicu

ฉันเห็นด้วยกับคุณเกี่ยวกับ CSS แต่ดูเหมือนว่าผู้เขียนคำถามต้องการโซลูชันทั่วไปที่ใช้กับภาพหลายภาพทั้งหมดในครั้งเดียว
Jarrod Dixon

9
วิธีนี้เป็นตัวเลือกที่ดีที่สุดยกเว้นว่าคุณกำลังทำเอฟเฟกต์บางอย่าง ฉันกำลังคิดในสิ่งเดียวกัน +1
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">

JavaScript

$('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
โปรดทราบว่าการดำเนินการในลักษณะนี้จะหมายความว่าผู้ใช้จะเห็นการหยุดชั่วคราวในการโฮเวอร์แรกขณะที่เบราว์เซอร์ดึงรูปภาพ
Tyson

1
@Tyson เกลียดที่จะกระโดดขึ้นไปบนรถไฟสาย แต่คุณสามารถโหลดภาพโดยทั้งผ่านทางจาวาสคริปต์หรือCSS
cbr

ไม่สามารถใช้งานกับ Chrome 37 ได้ $ (นี่) .attr ("src", src) ทำงานได้ดี
Le Droid

25

โซลูชันทั่วไปที่ไม่ จำกัด คุณเพียง "ภาพนี้" และ "ภาพนั้น" อาจเป็นการเพิ่มแท็ก 'onmouseover' และ 'onmouseout' ลงในโค้ด HTML เท่านั้น

HTML

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

JavaScript

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

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

คุณอาจต้องการเปลี่ยนคลาสของรูปภาพจากบรรทัดแรก หากคุณต้องการคลาสภาพเพิ่มเติม (หรือเส้นทางที่แตกต่าง) คุณสามารถใช้

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

และอื่น ๆ

มันน่าจะใช้ได้นะฉันไม่ได้ทดสอบ :)


2
+1 Doh ลืมเกี่ยวกับผู้ช่วยโฮเวอร์ของเหตุการณ์! และข้อเสนอแนะที่ดีเกี่ยวกับการเพิ่มระดับให้กับภาพได้ - อย่างแท้จริงคือการปฏิบัติที่ดีที่สุด :)
Jarrod Dixon

1
นั่นเป็นทางออกที่ดีกว่าเพราะแคชแหล่งภาพเก่า
trante

ส่วนที่เป็นลบคือถ้าภาพอยู่ด้านล่างของหน้าและมี 10-20 ภาพจากนั้นเค้าโครงจะแปลก
trante

13

ฉันหวังว่าจะมีสายการบินหนึ่งเดียวที่ชอบ:

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

6

หากวิธีการแก้ปัญหาที่คุณมองหามีไว้สำหรับปุ่มแบบเคลื่อนไหวสิ่งที่ดีที่สุดที่คุณสามารถทำได้เพื่อปรับปรุงประสิทธิภาพคือการรวมกันของ Sprite และ 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

ในขณะที่กำลังมองหาวิธีการแก้ปัญหาบางครั้งฉันพบสคริปต์ที่คล้ายกับด้านล่างซึ่งหลังจาก tweaking บางฉันได้ทำงานให้ฉัน

มันจัดการภาพสองภาพที่เกือบทุกค่าเริ่มต้นเป็น "ปิด" ที่เมาส์อยู่นอกภาพ (image-example_off.jpg) และเป็นครั้งคราว "เปิด" ซึ่งเป็นเวลาที่เมาส์อยู่โฉบภาพทดแทนที่จำเป็น ( 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 - หากต้องการกำหนดเป้าหมาย img ในรายการ ul / li (พบได้ในคลาส div wrapper ที่นี่) สิ่งนี้:

$('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.