views:

117

answers:

1

I have three images, displayed and styled as follows:

<img id="img1" src="images/category_slideshow/yellow-viper-on-car-ramps.jpg" alt="Yellow Viper on Race Ramps Car Ramps" width="557" height="415" /> 
        <img class="onBottom" src="" width="557" height="415" />  
        <img class="onTop" src="" width="557" height="415" /> 

.onBottom{
  position:absolute;
  margin-top:-415px;
  background:url(../images/category_slideshow/loading.gif) center no-repeat;
}

.onTop{
  position:absolute;
  margin-top:-415px;
  background:url(../images/category_slideshow/loading.gif) center no-repeat;
}

Here is my Javascript:

  $(document).ready(function() {

    var productImages = new Array();
    productImages["raceramps56"] = "images/category_slideshow/black-350z-on-car-ramps.jpg";
    productImages["raceramps67"] = "images/category_slideshow/red-corvette-on-car-ramps.jpg";
    productImages["xtenders"] = "images/category_slideshow/silver-sti-on-xtenders.jpg";
    productImages["sportramps"] = "images/category_slideshow/black-corvete-on-car-ramps.jpg";
    productImages["rollups"] = "images/category_slideshow/yellow-lotus-on-rollups-for-car-ramps.jpg";


    $(".onTop, .onBottom").css("opacity", "0");   //Give the two images 0 opacity

    $( '.leftMenuProductButton' ).hover ( 
      function () {                         
        //.leftMenuProductButton is a button in a menu.
        // There are several of these buttons, each button
        // has an ID such as "raceramps56" or "xtenders"

        var swapIMG = $(this).attr("id");  //This gets the ID, such as "raceramps56" or "xtenders"

        $(".onTop").css({opacity: '0', 'z-index': '3'})
          .attr("src", productImages[swapIMG])
          .load(function() {
            //This takes the first IMG, make it invsisbile,
            // brings it to the top, replaces it's SRC image
            // with the variable, then once it is loaded, it fades in.
             $(this).fadeTo(300, 1);
          })
          .removeClass("onTop")
          .addClass("replaceMe"); // This removes the class "onTop and replaces it with "replaceMe". I can't simply change onTop to onBottom yet, as I need to reference onBottom later.

         $(".onBottom").addClass("onTop").removeClass("onBottom").css({'z-index': '1'});  // This converts onTop to onBottom, and puts it at the bottom. 

         $(".replaceMe").removeClass("replaceMe").addClass("onBottom"); //Now that I no longer have an onBottom, I can replace replaceMe with onBottom

      },
      function () {
        //does nothing right now

      });
   });

This code runs pretty good. However, if I mouseover .leftMenuProductButton, then move to another .leftMenuProductButton, then move back and forth between the two, it does not behave properly.

You can view an example at www.raceramps.com/v3 .

+1  A: 

hm ok there are 2 things i would change, first of all try changing

$(".onTop").css({opacity: '0', 'z-index': '3'}).attr("src",productImages[swapIMG]).load(function() {
             $(this).fadeTo(300, 1, function(){
    $(this).removeClass("onTop").addClass("replaceMe");
});

}); 

this way it wont remove the class untill completely faded in. if you chain .removeClass like you did it will immediately be triggered after LOAD is completed not the fade.

second i would stop all animations before starting a new one try adding

$(".onTop").stop();

on top of your hovering function

Nexum