2010-09-16 32 views
1

Tenir compte the following code:Besoin d'aide avec Javascript "mouseover" et événements "mouseout"

HTML:

<div class='a'></div> 
<div class='b'></div> 

CSS:

body { 
    position: relative; 
} 
.a { 
    position: absolute; 
    left: 100px; 
    top: 100px; 
    width: 100px; 
    height: 100px; 
    background: #777; 
} 
.b { 
    position: absolute; 
    display: none; 
    background: red; 
} 

JavaScript:

$(function() { 
    $('.a').live('mouseover mouseout', function(e) { 
     switch (e.type) { 
      case 'mouseover': { 
       $('.b').offset({'left': $(this).offset().left, 
           'top': $(this).offset().top}) 
         .width($(this).outerWidth()) 
         .height($(this).outerHeight()) 
         .show(); 
       break; 
      }  
      case 'mouseout': { 
       $('.b').hide(); 
       break; 
      }   
     } 
    }); 
}); 

Comme vous pouvez voir here, une sorte de scintillement se produit, car lorsque .b est affiché, mouseout se produit automatiquement. Comment résoudrais-tu ce problème ?

Le comportement souhaité est le suivant: lorsque la souris est sur .a, .b doit être représenté (devrait couvrir .a), et lorsque la souris ne survole pas .a, .b ne doivent pas être affichés. .a doit toujours être affiché.

La position et les dimensions de .a ne sont pas constantes (elles doivent être calculées à la volée).

+0

Est-ce que '.b' * devrait couvrir initialement' .a'? –

+0

Non. Seulement lorsque la souris est sur '.a'. –

+0

Vous pourriez essayer de faire de '.b' un enfant de' .a', bien que parfois cela ne soit pas souhaitable –

Répondre

3

Je viens avec this solution:

$(function() { 
    $('.a').live('mouseover', function(e) { 
     $('.b').offset({'left': $(this).offset().left, 
         'top': $(this).offset().top}) 
       .width($(this).outerWidth()) 
       .height($(this).outerHeight()) 
       .show(); 
    }); 
    $('.b').live('mouseout', function(e) { 
     $(this).hide(); 
    }); 
}); 
+0

change '$ ('. B'). Offset' en' $ ('. B'). Css' lors du réglage de la position. sinon cela fonctionne. – lincolnk

0

Essayez

$(function() { 
    $('.a').live('mouseover', function(e) { 
     $('.b').offset({'left': $(this).offset().left, 
         'top': $(this).offset().top}) 
       .width($(this).outerWidth()) 
       .height($(this).outerHeight()) 
       .show(); 
    }); 
    $('.b').live('mouseout', function(e) { 
     $('.b').hide(); 
     break; 
    }); 
}); 

Cela devrait signifier que lorsque l'utilisateur déplace Thier la souris sur la zone a, zone b est montrée et puis quand ils se déplacent Thier souris hors de la zone b, la zone a est représentée.

+0

C'est exactement la solution que j'ai trouvée :) Mais non, je pense que ce n'est pas assez bon, parce que les dimensions de '.b' peuvent être différentes de celles de' .a'. Avez-vous une autre idée? –