2009-11-08 7 views
2

J'essaye d'animer une image qui est partiellement cachée (via overflow: hidden) dans un élément de la liste. Je veux que cela se produise lorsqu'un utilisateur survole un tag A à l'intérieur du même élément de liste.jQuery le plus proche();

je le balisage suivant:

<div id="projects" class="section"> 
    <ul> 
     <li> 
      <img src="assets/img/projects/pf6.jpg" width="980" height="500" alt="Project title" /> 
      <h2 class="left middle"><span>new</span><a href="#">Title 1</a></h2> 
     </li> 
     <li> 
      <img src="assets/img/projects/pf4.jpg" width="980" height="500" alt="Project title" /> 
      <h2 class="bottom right"><a href="#">Title 2</a></h2> 
     </li> 
    </ul> 
</div> 

Mon css de base:

#projects ul li { 
    width: 100%; 
    height: 450px; 
    position: relative; 
    display: block; 
    margin-bottom: 20px; 
    color: #fff; 
    overflow: hidden; 
} 

#projects ul li img { 
    position: absolute; 
    top: -50px; 
    left: 0; 
} 

Je suis en train de ce qui suit avec jQuery pour déplacer l'image (en vain):

$("#projects li h2 a").hover(
    function() { 
     $(this).closest("img").animate({paddingTop: "50px"}, "slow"); 
    }, 
    function() { 
     $(this).closest("img").animate({paddingTop: "0"}, "slow"); 
    } 
); 

Tout le monde a une idée de pourquoi cela ne fonctionne pas! - toute aide très appréciée :-)

+0

J'ai récemment découvert que les animations impliquant un débordement peuvent devenir risquées dans FireFox. Dans mon cas, il s'agissait d'un div avec débordement, et j'ai déplacé son élément contenant, mais cela a créé un désordre dans FireFox. Je ne suis pas (du tout) sûr que cela va s'appliquer à vous, mais je vous suggère de faire quelques tests dans FireFox et d'autres navigateurs. –

+0

Je recommande d'utiliser le 'native' natif comme ceci' $ (this.closest ('img')). Animate ... 'cela augmentera considérablement le code (voir http://jsperf.com/jquery-closest-vs-element -closest) – oriadam

Répondre

10

closest() ne sélectionne que l'élément en cours et ses éléments parents (et le limite ensuite à la première correspondance).

Votre élément img est pas un parent du lien que vous avez le gestionnaire de vol stationnaire sur, donc il ne fonctionne pas.

Mise à jour: comme souligné par ScottyUSCD, le code précédent que j'ai posté ne fonctionnera pas. J'ai mal lu la source et j'ai pensé que les éléments étaient des frères et soeurs.

Sa réponse était correcte:

$(this).closest("li").children("img") 

Ce naviguera jusqu'à le plus proche parent élément li, puis regardez à travers les enfants de cet élément pour tous img éléments.

+0

Oh chouette, je ne savais pas celui-là. Je l'ai utilisé parent() trouver() – stimms

+0

Grande - grâce ... Donc, mon javascript doit être:.. $ ("# projets li h2 un") vol stationnaire ( \t \t function() { \t . \t \t $ (this) .prevAll ("img") animés ({paddingTop: "10px"}, "lent"); \t \t}, \t \t function() { \t \t \t $ (this). prevAll ("img").animate ({paddingTop: "0"}, "lent"); \t \t} \t); Difficulté à faire ce travail encore - désolé! – Fred

+0

Cela ne va pas fonctionner parce que "un" ET "img" ne sont pas frères et soeurs. a est un enfant de "h2" – ScottyUCSD

11

Je pense qu'il devrait être:

$(this).closest("li").children("img").animate() 

Ou vous pourriez faire:

$(this).closest("h2").prevAll("img") 
1

Si le <img> pourrait aussi être après la <h2>, utilisez:

$(this).closest("h2").siblings("img");