Prévenir CSS :hover style de propagation de l'
Dans l'exemple suivant, quand je souris sur le bouton "X", l'élément de liste hover
style sera activée ainsi, je ne veux pas que cela se produise.
Est-il possible d'avoir un hover
de style sur le bouton indépendant de la hover
de style sur le list-group-item
? Quelque chose comme éviter le "hover" propagation?
Est-il un autre moyen d'y parvenir? Peut-être que l'assemblage de tous de ce de HTML/CSS/JS dans une manière différente?
<ul class="list-group">
<li class="list-group-item">
Lalalalaiaia
<button class="btn btn-default btn-xs pull-right remove-item">
<span class="glyphicon glyphicon-remove"></span>
</button>
</li>
<li class="list-group-item">
Panananannaeue
<button class="btn btn-default btn-xs pull-right remove-item">
<span class="glyphicon glyphicon-remove"></span>
</button>
</li>
</ul>
CSS
.list-group-item:hover {
background: #fafafa;
cursor: pointer;
}
JavaScript
$('.list-group-item').on('click', function(){
console.log('clicked item');
});
$('.remove-item').on('click', function(e){
console.log('clicked remove-item btn');
e.stopPropagation();
});
Mise à JOUR
Le problème semble être que lorsque le curseur de la intérieure X bouton de la souris ne fait pas quitter la "list-group-item" élément, ainsi, il maintient l'état de pointage.
J'ai été en mesure de le résoudre manuellement à l'envoi mouseenter
et mouseleave
sur "list-group-item" dans le mouseleave
et mouseenter
cas de la "remove-item' bouton, respectivement, sans la nécessité d'utiliser de l'événement.stopPropagation()' (sauf pour le bouton gestionnaire de clic).
L'inconvénient, c'est que j'ai besoin d'un mouseenter
et un mouseleave
gestionnaire d'événement pour les deux éléments. De préférence j'aimerais utiliser uniquement le CSS, mais qui semble être impossible.
Je ne suis pas sûr de savoir si c'est une solution propre, qu'en pensez-vous?
CSS
.list-group-item.mouseover {
background: #fafafa;
cursor: pointer;
}
.list-group-item .remove-item.mouseover {
background: #aaf;
cursor: pointer;
}
JavaScript
//LIST-ITEM EVENT HANDLERS
$('.list-group-item').on('mouseenter', function(e){
$(this).addClass('mouseover');
}).on('mouseleave', function(e){
$(this).removeClass('mouseover');
});
$('.list-group-item').on('click', function(){
console.log('clicked item');
});
//LIST-ITEM REMOVE BUTTON EVENT HANDLERS
$('.remove-item').on('mouseenter', function(e){
$(this).addClass('mouseover');
$(this).parent().mouseleave();
}).on('mouseleave', function(e){
$(this).removeClass('mouseover');
$(this).parent().mouseenter();
});
$('.remove-item').on('click', function(e){
console.log('clicked remove-item btn');
e.stopPropagation();
});
.list-group-item:hover button
que l'onu ne les placez le style de l'élément du groupe lui-même.Mais une règle sur
.list-group-item:hover button
serait de modifier le CSS pour le bouton, pas l'élément de la liste, qui est ce que l'OP veut changer. Il veut que quand vous passez la souris sur le bouton, la liste hover ne s'active pas (ou ne ressemble pas à elle active).eh bien j'ai deviné qu'il ne voulait pas le bouton pour être touchés par la héritables sur les styles de groupe de la liste, mais je ne sais pas pourquoi; l'arrière-plan ne sera probablement pas modifier l'arrière-plan du bouton. C'est peut-être le curseur?
c'est l'inverse, comme j08691 a écrit 🙂
Oh oh, je vois. Si vous voulez assombrir l'élément lorsque vous êtes sur elle, mais alors, quand vous êtes sur le bouton, il doit pas conserver l'élément sombre. C'est difficile/impossible avec les CSS. J'ai sorte de me demande si il serait pas un peu bizarre quand même; je veux dire, le curseur est toujours au-dessus de l'élément, après tout.
OriginalL'auteur zok | 2014-08-11
Vous devez vous connecter pour publier un commentaire.
C'est impossible à faire avec CSS uniquement, à l'exception de la pas-si-propre manière décrite par @Pointu.
Vous pouvez le faire avec javascript en utilisant
event.stopPropagation()
. Donc passez votre style doit devenir une classe qui vous bascule sur passage de la souris.Cette question est un doublon de css :hover n'affectent haut div de nid
li
mais à côté de lui en quelque sorte, mais qui ne semble pas être une bonne idéeOriginalL'auteur Issam Zoli
Vous pouvez faire une négation caluse comme Pointu donne à penser, mais un de plus solide à la solution consiste en l'ajout d'un nœud supplémentaire. L'idée est que la ligne et le bouton de devenir de vraies frères et sœurs puisque vous ne pouvez pas le style d'un TextNode.
Maintenant vous pouvez le faire:
Vous aurez besoin d'un peu plus de ruse pour obtenir le bouton dans le bon endroit, comme:
display: inline
à l'emballage des div, mais la couleur de fond pourrait être appliqué que du texte, et non l'ensemble de l'élément de liste arrière-plan..Supprimer tout remplissage de l'élément de liste. Il n'a pas d'importance si l'arrière-plan est sur l'élément de liste ou de la div.
OriginalL'auteur Halcyon
Je ne pouvais pas trouver une réponse qui a travaillé dans tous les cas, et est aussi simple à mettre en œuvre. Malheureusement, il semble y avoir aucune solution compatible qui est purement CSS et/ou nécessite des dispositions spéciales du code HTML de.
Ici est un jQuery solution qui semble fonctionner dans tous les cas.
N'importe quel élément avec
.ui-hoverable
recevrez un.ui-hover
classe qui ne se propagent pas. De sorte que vous pouvez empiler.ui-hoverable
éléments et seulement le plus haut, en vertu de la souris aura le.ui-hover
classe.Cela fonctionne parce que les
mousemove
événement de recherche le plus proche.ui-hoverable
et si elle n'est pas l'élément le.ui-hover
est supprimé. De sorte que le plus haut recevront le.ui-hover
et un élément de sous il va l'avoir retiré.Profiter de signaler les problèmes.
Merci,
OriginalL'auteur cgTag