Змініть джерело зображення під час перекидання за допомогою jQuery


443

У мене є декілька зображень та їх перекидання. Використовуючи jQuery, я хочу показати / приховати зображення перекидання, коли відбувається подія onmousemove / onmouseout. Усі назви моїх зображень відповідають одній схемі, як це:

Оригінальне зображення: Image.gif

Зображення перекидання: Imageover.gif

Я хочу вставити та видалити частину джерела зображення "over" у події onmouseover та onmouseout відповідно.

Як я можу це зробити за допомогою jQuery?


Я написав невелику практику із прикладами для початківців, Змініть зображення за допомогою JavaScript (або jQuery) . Також є приклад без використання jQuery.
gothy

Змінити зображення на курсорі
Sumit

10
Тільки те, що я шукаю. Дякуємо, що опублікували питання!
Семюел Меддоуз

У мене є така проблема ( моє запитання ). Відповідь на це питання чудова, але в IE9 кожного разу, коли ви переходите на кнопку, виникає додатковий запит на зображення, і це дуже погано. Будь-який орган має кращу відповідь?
Іман

Відповіді:


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.
Бенджамін Маннс

32
чи можу я запропонувати редагувати остаточний .replace за допомогою .replace ("over.gif", ".gif");
Натан Кооп

2
Дякуємо, що опублікували це. Сподіваюся, ви не заперечуєте, що я розміщую це у своєму блозі. Мій блог схожий на "зошит", і це моя "перехід до речі", коли я щось забуваю.
Венберт

1
Не потрібно використовувати метод ".match (/ evidence^\.Sense+/") і з Regex. ".Замінити (". 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 Переміщення одного зображення є хорошим рішенням, але це найкраще чи ні, залежить від розміру зображення. Наприклад, у повільному Інтернеті завантаження двох зображень шириною 1920 пікселів в один гігантський файл займе неприпустимо довго. Для піктограм та невеликих зображень це чудово працює.
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
Це було для мене. Просто не забудьте помістити javascript всередині функції для його виконання, тобто коли DOM готовий "$ (function () {});"
Міша

Насправді він спрацьовує, коли сторінка все ще завантажується, і коли курсор миші фактично перебуває над селектором, він замінює URL, тому ефект перевернуто
Майк,

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 Ненавиджу скочити на потяг пізно, але ви можете попередньо завантажити зображення через Javascript або CSS
cbr

Не працює і в Chrome 37. $ (this) .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 До, забув про помічника події на хові! І приємна пропозиція щодо додавання класу до зображень - справді це найкраща практика :)
Jarrod Dixon

1
Це набагато краще рішення, оскільки воно кешує старе джерело зображення.
trante

Негативна частина полягає в тому, що якщо зображення знаходиться внизу сторінки і є 10-20 зображень, то макет стає дивним.
trante

13

Я сподівався на über один лайнер, як:

$("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), а також інколи "увімкнено", де для часу, коли миша зависла, необхідне альтернативне зображення ( відображається зображення-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, як це кодується в даний час. Подача подальшого контексту дозволить зосередити ефект на конкретних елементах малюнка.
Крістофер Руут

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

Адаптовано з коду Річарда Айотта - для націлювання на імг у списку ul / li (знайдений тут через div div class), приблизно так:

$('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') }
); 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.