Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery change CSS background position and mouseover/mouseout

Tags:

jquery

css

menu

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.

like image 714
steelfrog Avatar asked Mar 25 '10 12:03

steelfrog


3 Answers

If you were not animating the transitions — and given the kinds of images I've grouped as sprites, I don't know why you'd ever do that — then you'd want something like this:

$(document).ready(function(){
  $('#home a')
    // On mouse over, move the background on hover
   .mouseover(function() {
     $(this).css('backgroundPosition', '0 -54px');
   })
   // On mouse out, move the background back
   .mouseout(function() {
     $(this).css('backgroundPosition', '0 0');
   })
 });

Now, if you are trying to animate that, then you've got bad syntax for the CSS and for the calls to "animate".

$(document).ready(function(){
  $('#home a')
   // On mouse over, move the background on hover
   .mouseover(function(){
     $(this).stop().animate({backgroundPosition: "0 -54px"}, 500);
   })
   // On mouse out, move the background back
   .mouseout(function(){
      $(this).stop().animate({backgroundPosition: "0 0"}, 500);
   })
 });

Again, I am doubtful that jQuery is going to be able to animate "backgroundPosition" for you, but then I don't do "animate()" very often and jQuery always manages to surprise me.

edit: here's a page: http://snook.ca/archives/javascript/jquery-bg-image-animations/

like image 188
Pointy Avatar answered Oct 22 '22 00:10

Pointy


{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.

like image 41
bobince Avatar answered Oct 22 '22 01:10

bobince


i liked this method (just css)

.maintopbanner a:hover{
    background-position: -200px 0 !important;}
.maintopbanner a {
 -webkit-transition: all .2s ease;
    -moz-transition: all .2s ease;
    transition: all .2s ease;
}
like image 2
Fedwar Avatar answered Oct 22 '22 02:10

Fedwar