tags:

views:

1179

answers:

4

I have a menu composed of a single image (e.g., sprites). In order to display the hover image, I simply move the background image down. I'd like this effect to be controlled by jQuery and animated.

This is a sample menu item.

 <ul>
  <li id="home"><a href="#"></a></li>
 </ul>

This is what I'm toying with. I'm very new to jQuery and am having problems getting the proper selector going.

 $(document).ready(function(){

  $('#home a');

   // Set the 'normal' state background position
   .css( {backgroundPosition: "0 0"} )

   // On mouse over, move the background
   .mouseover(function(){
    $(this).stop().animate({backgroundPosition:"(0 -54px)"}, {duration:500})
   })

   // On mouse out, move the background back
   .mouseout(function(){
    $(this).stop().animate({backgroundPosition:"(0 0)"}, {duration:500})
   })

 });

Could you point out what I'm doing wrong? I know the selector is probably incorrect but I'm having a hard time figuring out how to manipulate the anchor.

A: 

I would imagine your background is bound to the li?! However this is set to the a of the selector, so if my assumption is correct you would need to change your code to

$(document).ready(function(){

  $('#home a')

   // On mouse over, move the background on hover
   .mouseover(function(){
    $(this).parent().stop().animate({backgroundPosition:"(0 -54px)"}, {duration:500})
   })

   // On mouse out, move the background back
   .mouseout(function(){
    $(this).parent().stop().animate({backgroundPosition:"(0 0)"}, {duration:500})
   })

 });
harpax
The background is in fact set on the anchor due to a limitation in IE6. I wish I could simply set it to the list item but it would completely break in IE.
steelfrog
+1  A: 
Pointy
That's the one I was looking at! Your second snippet fixed everything. I was also missing the plugin, which resolved the rest. Thank you!
steelfrog
Oh goodie, I'm glad it worked. I'll have to look at the plugin because now I'm curious about the sort of things one might do with that :-)
Pointy
+2  A: 

{backgroundPosition:"(0 -54px)"

(You don't want the brackets there. There's no brackets in a CSS background-position rule.)

In any case jQuery doesn't know how to animate a compound value like backgroundPosition. In IE you get access to it with backgroundPositionY, which, as a simple value, jQuery can animate. However this is non-standard and won't work elsewhere.

Here's a plugin that claims to fix it.

bobince
Yes I think that's referenced by that page I linked to my answer.
Pointy
A: 
         $('#home a')
.mouseenter(function(){
        $(this).parent().stop().animate({backgroundPosition:"(0 -54px)"},500)
       })
.mouseleave(function(){
        $(this).parent().stop().animate({backgroundPosition:"(0 0)"},500)
       })

//Use MouseEnter and MouseLeave whenever possible and you do not need to type out duration with the current version of jQuery. Hope this helps.

nolan campbell