Tout d'abord, je suppose que c'est trop complexe pour CSS3, mais s'il y a une solution quelque part, j'aimerais bien l'utiliser avec cela.
Le code HTML est assez simple.
<div class="parent">
<div class="child">
Text Block 1
</div>
</div>
<div class="parent">
<div class="child">
Text Block 2
</div>
</div>
La division enfant est configurée pour afficher: aucune; par défaut, mais change ensuite pour afficher: block; lorsque la souris survole le div parent. Le problème est que ce balisage apparaît à plusieurs endroits sur mon site et je ne veux que l'enfant soit affiché si la souris est au-dessus de son parent, et non si l'un des autres parents est survolé (ils ont tous la même classe nom et pas d'identifiant).
J'ai essayé d'utiliser $(this)
et .children()
en vain.
$('.parent').hover(function(){
$(this).children('.child').css("display","block");
}, function() {
$(this).children('.child').css("display","none");
});
Pourquoi ne pas utiliser simplement CSS?
.parent:hover .child, .parent.hover .child { display: block; }
puis ajoutez JS pour IE6 (dans un commentaire conditionnel par exemple) qui ne prend pas en charge: survolez correctement:
jQuery('.parent').hover(function () {
jQuery(this).addClass('hover');
}, function () {
jQuery(this).removeClass('hover');
});
Voici un exemple rapide: Fiddle
Pas besoin d’utiliser JavaScript ou jquery, CSS suffit:
.child{ display:none; }
.parent:hover .child{ display:block; }
Utilisez toggleClass()
.
$('.parent').hover(function(){
$(this).find('.child').toggleClass('color')
});
où color
est la classe. Vous pouvez styliser la classe à votre guise pour obtenir le comportement souhaité. L'exemple montre comment la classe est ajoutée et supprimée à l'entrée et à la sortie de la souris.
.parent:hover > .child {
/*do anything with this child*/
}
J'ai ce que je pense être une meilleure solution, puisqu'elle est extensible à plusieurs niveaux, autant que souhaité, pas seulement deux ou trois.
J'utilise des bordures, mais cela peut aussi être fait avec le style souhaité, comme la couleur de fond.
Avec la frontière, l’idée est de:
Vous pouvez le tester à: http://jsbin.com/ubiyo3/13
Et voici le code:
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Hierarchie Borders MarkUp</title>
<style>
.parent { display: block; position: relative; z-index: 0;
height: auto; width: auto; padding: 25px;
}
.parent-bg { display: block; height: 100%; width: 100%;
position: absolute; top: 0px; left: 0px;
border: 1px solid white; z-index: 0;
}
.parent-bg:hover { border: 1px solid red; }
.child { display: block; position: relative; z-index: 1;
height: auto; width: auto; padding: 25px;
}
.child-bg { display: block; height: 100%; width: 100%;
position: absolute; top: 0px; left: 0px;
border: 1px solid white; z-index: 0;
}
.child-bg:hover { border: 1px solid red; }
.grandson { display: block; position: relative; z-index: 2;
height: auto; width: auto; padding: 25px;
}
.grandson-bg { display: block; height: 100%; width: 100%;
position: absolute; top: 0px; left: 0px;
border: 1px solid white; z-index: 0;
}
.grandson-bg:hover { border: 1px solid red; }
</style>
</head>
<body>
<div class="parent">
Parent
<div class="child">
Child
<div class="grandson">
Grandson
<div class="grandson-bg"></div>
</div>
<div class="child-bg"></div>
</div>
<div class="parent-bg"></div>
</div>
</body>
</html>
La réponse de Stephen est correcte mais voici mon adaptation de sa réponse:
<div class="parent">
<p> parent 1 </p>
<div class="child">
Text Block 1
</div>
</div>
<div class="parent">
<p> parent 2 </p>
<div class="child">
Text Block 2
</div>
</div>
.parent { width: 100px; min-height: 100px; color: red; }
.child { width: 50px; min-height: 20px; color: blue; display: none; }
.parent:hover .child, .parent.hover .child { display: block; }
//this is only necessary for IE and should be in a conditional comment
jQuery('.parent').hover(function () {
jQuery(this).addClass('hover');
}, function () {
jQuery(this).removeClass('hover');
});
Vous pouvez voir cet exemple en train de travailler sur jsFiddle .
Si vous utilisez Twitter Bootstrap styling et base JS pour un menu déroulant:
.child{ display:none; }
.parent:hover .child{ display:block; }
C'est la pièce manquante pour créer des listes déroulantes collantes (qui ne sont pas gênantes)
Pour changer de css, vous n'avez même pas besoin de définir la classe enfant.
.parent > div:nth-child(1) { display:none; }
.parent:hover > div:nth-child(1) { display: block; }
Je ne suis pas sûr qu'il y ait de terribles raisons de le faire ou non, mais cela semble fonctionner avec la dernière version de Chrome/Firefox, sans aucun problème de performance visible avec de nombreux éléments sur la page.
*:not(:hover)>.parent-hover-show{
display:none;
}
Mais de cette façon, tout ce dont vous avez besoin est d’appliquer parent-hover-show
à un élément, le reste est pris en charge et vous pouvez conserver le type d’affichage par défaut de votre choix sans qu'il soit toujours "bloqué" ou créé plusieurs classes pour chaque type.