【问题标题】:Jquery/JS/CSS Hover codeJquery/JS/CSS 悬停代码
【发布时间】:2023-03-10 06:32:01
【问题描述】:

好的,这是我的问题: 我得到了以下html:

<ul>
    <li class="normal">Item1</li>
    <li class="normal">Item2</li>
    <li class="special">Item3</li>
    <li class="normal">Item4</li>
    <li class="normal">Item5</li>
</ul>

所以现在我想知道如何获得一些棘手的悬停效果:

  • 当您悬停“.normal”时:文本颜色为红色。
  • 当您将鼠标悬停在 '.normal' 和 'special' 之前:'.normal' 颜色 红色和“.special”绿色。
  • 当您将鼠标悬停在 '.normal' 和 'special' 之后:'.normal' 颜色 红色和“.special”蓝色。

我认为 JS/Jquery 可以做到这一点,但我什至不知道从哪里开始。

感谢您对这个问题的任何帮助。

附: 对于想知道我将在哪里使用它的每个人:http://dl.dropbox.com/u/4281191/weboutfit/index.html

【问题讨论】:

  • 你可能只使用adjacent sibling selectors 就可以用 css 做一些事情。读一读
  • @petervaz:我认为 CSS 不支持回溯。
  • @jnpcl 很粗糙。尚不支持回溯,但您可以使用 JQuery + CSS 制作一个更简单的示例,在几分钟内发布答案
  • 您是否只希望 .special 元素与 hover 元素相邻时突出显示,或者即使它们是分开的几个元素?
  • 我不想把所有的“.normal”都染成红色,而只想把悬停的那个染成红色。

标签: javascript jquery html css hover


【解决方案1】:

这是一个纯 jQuery 解决方案,它实现了您的所有 3 个要求。

查看工作演示: http://jsfiddle.net/usmanhalalit/Rn3jR/2/

$(function(){
    $('.normal').hover(function(){
        $(this).css('color','red');
        var $prev=$(this).prev();
        var $next=$(this).next();
        if($prev.hasClass('special'))
            $prev.css('color','green');
        if($next.hasClass('special'))
            $next.css('color','blue');
    },function(){
        $(this).css('color','black');        
        $('.special').css('color','black');        

    });
})

【讨论】:

  • 这段代码似乎完美运行并且有效:D 非常感谢!我喜欢你的代码的地方是它同时 prev&next ;)
【解决方案2】:

假设您有 3 个类别,即红色、蓝色和绿色(每个类别都有一个颜色定义)。

.red {
    color: red;
}
.blue {
    color: blue;
}
.green {
    color: green;
}

悬停代码如下:

$('.normal').hover(function() {
    $(this).addClass('red');
    if($(this).prev().hasClass('special') {
         $(this).prev().addClass('blue');
    }
    else if($(this).next().hasClass('special') {
         $(this).next().addClass('green');
    }
}, function() {
    $('.normal').removeClass().addClass('normal');
    $('.special').removeClass().addClass('special');
});

【讨论】:

  • 我试过了,但它在我的网站上不起作用:/它甚至没有通过验证...所以我编辑了代码并修复了一些验证问题:dl.getdropbox.com/u/4281191/sdfhgxdhtgfchyjcyfgk.txt 但它仍然没有工作:/
  • 这是一个使用您的代码的示例:dl.getdropbox.com/u/4281191/test.html 如您所见,它不起作用:(
  • 我选择了来自 Usman 的代码,因为它更简洁一些,并且可以同时进行 prev&next,但是您的代码也很好,也很棒 ^^
  • 你需要把它放在某个地方,这样它只有在 dom 准备好后才会执行。即在$(document).ready() 块内。检查这个小提琴:jsfiddle.net/pFPu8 以获得我给出的代码的运行演示。 :)
  • 啊,这解释了很多......但我还是选择了上面,因为它同时做 prev 和 next,两个 if 不是无效的吗?
【解决方案3】:

jQuery 解决方案:http://jsfiddle.net/mQWsP/1/

$('.normal').hover(function () {
var that = $(this),
    special = $('.special');

that.addClass('red');

if (that.prev('li').hasClass('special')) {
    special.addClass('green');
} else {
    if (that.next('li').hasClass('special')) {
        special.addClass('blue');
    }
}   
},
function () {
    $('.special').removeClass().addClass('special');
    $(this).removeClass().addClass('normal');
});

【讨论】:

  • 这段代码似乎工作完美并且有效,但不如@Usman 的代码那么干净,因为它在不同时间之后和之前呈现。所以我使用来自 Usman 的代码,但大多数其他发布的答案也很棒:D
  • 如果“干净”的意思是毫无意义地同时检查 prev 和 next,省略花括号,并且间距很差,那么是的,他的代码是“干净的”。
  • 我的意思是使用 else if 而不是另一个 if 这使得代码的 2 部分同时运行。他也更早了:P
  • 这两种情况是互斥的,它们不会像您建议的那样异步运行。将它们放在 if-else-if 而不是两个 if 语句中可以提高性能。但是是的,他更早:P
【解决方案4】:

我使用 CSS / JS 组合让它变得更简单

CSS:

.normal, .special {
    color: red;
}

.special + li:hover {
    color: green;
}

JS:

$('.special').prev().hover(function() {
     $(this).css('color', 'green'); 
}, function() {
     $(this).css('color', 'red');  
});

演示:http://jsfiddle.net/gn96t/

【讨论】:

  • 您也可以使用.addClass().removeClass() 而不是.css(),就像techfoobar 在他的回答中所做的那样。
  • 嗯,我也试过了,但有点令人困惑:/ 它至少在 IE7 中有效吗?因为即使在那个旧的垃圾浏览器中我也真的需要它工作......
  • 究竟是什么? CSS 对 .special 之后的元素进行着色,而 JS 代码在 .special 之前进行着色。
  • 我希望 '.special' 变为绿色或蓝色,具体取决于您将项目悬停在它之前还是之后而不是 '.normal' 元素本身。
  • 好的,在我重写所有内容之前,使用techfoobar的;)