如何在列表上实现多个悬停效果

3

好的,所以我想知道如何在鼠标悬停时选择多个项目,例如当我将鼠标悬停在列表a上时,突出显示a,并在列表b上显示框阴影。我尝试编写代码,但由于某些原因无法实现多个悬停效果。

CSS代码:

#a:hover ~ #b {
    background: #ccc
}

HTML代码:

<div><ul id="a"><li>Div A</li></ul></div>
<div>random elements</div>
<div>random elements</div>
<div>random elements</div>
<div><ul id="b"><li>Div B</li></ul></div>

我想帮忙,但是我只会Html,CSS,MySQL和PHP。哈哈 - user2818003
当鼠标悬停在其中一个标签上时,您是否想同时突出显示两个标签? - jbrya029
@n00b 是的,如果可能的话,反之亦然? - user2818003
请检查http://jsfiddle.net/yB9p2/1/。 - Eugine Joseph
如果你想改变#a或#b的背景,请同时在jQuery中进行更改.. :) - Eugine Joseph
显示剩余3条评论
4个回答

1
“~”波浪符号表示兄弟元素。
但是,“#b”不是“#a”的兄弟元素。
更改id后它将正常工作: (http://jsbin.com/AxUzOX/1/edit)
<div id="a">
    <ul >
        <li>Div A</li>
    </ul>
</div>
<div>
    random elements
</div>
<div>
    random elements
</div>
<div>
    random elements
</div>
<div id="b">
    <ul >
        <li>Div B</li>
    </ul>
</div>

如果您想要使用jQuery解决方案,可以参考以下链接:http://jsbin.com/AxUzOX/4/edit


你的代码是正确的,但我实际上想尝试不使用外部div,而是想使用ul来作为id。 - user2818003
没问题。但是你不能使用~,因为它们不是兄弟节点。 - Royi Namir
我需要使用什么来处理兄弟节点? - user2818003
@TonyThinkk 给那个父级 div 添加一些类名或 ID 名称,否则无法实现。 - Mr_Green
@Mr_Green 你的意思是像 class="a" 这样的吗? - user2818003
我不太懂jQuery,但既然它能用,我猜我有一本新书要读了,哈哈。不过还是谢谢@RoyiNamir的回答。除了他的答案,我还想尝试使用HTML CSS来设计div(a)。 - user2818003

0

你应该给包含 ul 标签的父级 div 元素指定一个 class 名称或 id 名称,例如 #a,但是如果你不想指定名称,你可以使用下面所示的 :first-child

#a:hover {
    background: #ccc
}

div:first-child:hover ~ div>ul#b{
    color: red;
}

正如您所看到的,我悬停在 div 的第一个子元素上,而不是 ul,因为在您的情况下,悬停在 ul 上与悬停在父 div 上相同。

我这样做是因为在 css 中没有父选择器可用,甚至在 css3/css4 中也没有。

工作演示

更新

对于您之前的兄弟选择器问题,请使用 jquery。

$('#b').hover(function() { $('#a').css('color','blue'); });

其他的事情你可以像平常一样只用 CSS 来做 :)


嘿,你的答案确实有效,但我该如何做到相反的操作呢? - user2818003
@TonyThinkk,你不能仅使用CSS来完成。因为在CSS中也没有“_previous sibling_”选择器可用。你应该使用JavaScript或jQuery动态完成此操作。 - Mr_Green
是的,但这是因为我不懂JavaScript或jQuery,但如果我真的需要相反的效果,我想我会使用第二个答案。无论如何,谢谢你的回答,它非常有效。 - user2818003
好的,既然你提供了一个好的答案,那么我怎么将你的 CSS 用于另一个外部 div 呢?例如:<div><div><ul id="a"><li></li></ul></div></div> - user2818003
@TonyThinkk 如果您开一个新的问题,您只是在扩展您的要求......哈哈:D。那不可能只使用CSS实现。 - Mr_Green

0

这是我使用的 jQuery

$('#a').hover(function(){
  $('#a').css('background','#ccc');
  $('#b').css('background','#ccc');
}, function(){
  $('#a').css('background','#fff');  // Background of #a by default 
  $('#b').css('background','#fff');  // Background of #b by default 
})

$('#b').hover(function(){
  $('#a').css('background','#ccc');
  $('#b').css('background','#ccc');
}, function(){
  $('#a').css('background','#fff');  // Background of #a by default 
  $('#b').css('background','#fff');  // Background of #b by default 
})

如果您要更改#a或#b的背景,请同时指定我提到的地方的颜色。简单 :)

1
我猜如果我在使用HTML CSS时找不到正确的答案,我会选择您的答案作为最有用的,顺便感谢一下。 - user2818003
是的,你的回答最好了,哈哈,谢谢伙计,干得漂亮。 - user2818003
让我们期望在CSS中进行更多的修改,利用父元素等等。 :) - Eugine Joseph

0

如果您添加一个包装div,就可以在没有任何js的情况下实现它。 您示例中唯一的问题是中间的<div>没有应用任何效果,因此jsfiddle解决方案看起来有点奇怪,但是调整效果可能就是您想要的。

这个想法是当您悬停在父元素上并应用样式时,然后当鼠标悬停在子元素上时将不同的样式应用于该子元素。

如果可能,请尽量避免使用id,它们会限制您的需求。

.parent:hover .list-a, .parent:hover .list-b {
    box-shadow: 3px 3px 5px 6px #ccc;
}
.parent .list-a:hover {
    box-shadow: none;
    background:#aaa;
}
.parent .list-b:hover {
    box-shadow: none;
    background:#4c4;
}

http://jsfiddle.net/tHTN4/


现在让我们重新编辑jQuery部分。由于您不了解任何jQuery,或者知识不够丰富。jQuery(JavaScript的工具)只是帮助您以简单高效的方式操作HTML(DOM)。为了帮助您不必在多个地方编辑CSS,请使用addClass和removeClass函数:
$(function(){

    $('#a').hover(function(){
      $('#a').addClass('.list-one-effect');
      $('#b').addClass('.list-two-effect');
    }, function(){
      $('#a').removeClass('.list-one-effect');
      $('#b').removeClass('.list-two-effect');
    })
});

一旦您删除类,它将自动恢复到原始状态(或上次被其他效果更改的状态!)。jQuery还有一个toggleClass函数,但我建议您不要使用它,因为上面的代码将始终告诉您当前处于什么状态。为了完整起见,这个代码块被包裹在$(function(){})中,这是一种确保您已经加载了jQuery并且页面准备好运行此代码的常见方法。


你可以通过更新CSS在你的Fiddle上实现上述功能,只需将类名更改为你提供的ID即可。 - KnowHowSolutions

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接