【问题标题】:How to write the following code with less lines如何用更少的行编写以下代码
【发布时间】:2015-01-14 06:43:14
【问题描述】:

所以我有 2 个 <ul> ,每个上有 3 个 <li> 。当我将鼠标悬停在第一个<ul> 上的指定<li> 上时,我想更改第二个<ul> 上指定<li> 的颜色。当我不悬停元素时,我希望格式恢复正常。这是我的代码:

<ul class="a">
 <li class="a1"></li>
 <li class="a2"></li>
 <li class="a3"></li>
</ul>

<ul class="b">
 <li class="b1"></li>
 <li class="b2"></li>
 <li class="b3"></li>
</ul>

<script>
$(document.ready(function() {
   $(".a1").mouseover(function(){
        $(".b1").css({"color":"red","font-size":"19px"});
    });
   $(".a1").mouseout(function(){
        $(".b1").css({"color":"#045491","font-size":"16px"});
    });
   $(".a2").mouseover(function(){
        $(".b2").css({"color":"red","font-size":"19px"});
    });
   $(".a2").mouseout(function(){
        $(".b2").css({"color":"#045491","font-size":"16px"});
    });
   $(".a3").mouseover(function(){
        $(".b1").css({"color":"red","font-size":"19px"});
    });
$(".a3").mouseout(function(){
        $(".b1").css({"color":"#045491","font-size":"16px"});
    });

    });
</script>

所以我的问题是,如何用更少的代码执行上述操作?我尝试了一些切换/添加、删除方法,但我无法让它工作。上面的代码确实有效,但我觉得它可以用更少的代码行来执行。谢谢。

【问题讨论】:

  • 您不想在.a3 函数中使用.b3 吗?
  • 为了这个问题,我只包括了那些类名!!
  • @Walt - 这是一个问题,因为类名中的模式可能是回答问题的基础。
  • ^ 就是这样,classNames 是有帮助的,如果你只是想要一个基于索引的解决方案,这么说吧?

标签: javascript jquery html css


【解决方案1】:

您可以使用.index,因为您的class 名称除了数字之外都相同,并添加/删除class

JS

$(".a").find("li").hover(function(){
   var index = $(this).index()+1; 
    $(".b"+index).addClass("active")  
}, function(){
    $(".b").find("li").removeClass("active")
});

CSS

.active{
   color: red;
   font-size: 19px;
}

FIDDLE

更新

我看到你关于 class 名称的评论只是一个例子,我调整了我的代码仍然使用 .index() 这样li 的类名是无关紧要的,它会同时突出显示相应的 li ul.b 的位置 UPDATE 我改用 James Gaunt 的 eq() AND StevenL 的建议来使用 .toggleCLass。比起使用nth-of-type() 和悬停功能,我更喜欢这两个功能:

$(".a").find("li").hover(function(){
   var index = $(this).index(); 
   $(".b").find("li").eq(index).toggleClass("active");
});

NEW FIDDLE

【讨论】:

  • 您应该能够相当容易地修改它以不依赖于列表项类名称,例如$(".b" + index) => $(".b li").eq(index)
  • 是的,使用nth-of-type 这样做,但也可以使用.eq
  • 我会看到你很棒,干净的解决方案和你的 toggleClass(): $(".a").find("li").hover(function(){ var index = $(this).index(); $(".b").find("li").eq(index).toggleClass("active"); });
  • @StevenL 好主意,不知道为什么我没想到。更新了我的帖子
  • @jmore 我正在为这个问题想出一个非常复杂的解决方案。我将特征捆绑在一个对象中,然后将它们传递给周围……很高兴我刷新了。
【解决方案2】:

至少,您可以为 css '提取代码',为 js '进行链式调用':

起源js

$(".a1").mouseover(function(){
    $(".b1").css({"color":"red","font-size":"19px"});
});
$(".a1").mouseout(function(){
    $(".b1").css({"color":"#045491","font-size":"16px"});
});

到新的 js:

$(".a1").mouseover(..).mouseout(...);

更改您的原始 css 代码:

mouse_over_style = {"color":"red","font-size":"19px"}
mouse_out_style = {"color":"#045491","font-size":"16px"}

然后将你的 js 更改为:

$('.b1').mouseover(mouse_over_style).mouseout(mouse_out_style)

【讨论】:

  • 你可以把所有的 CSS 抽象成一个 CSS 类来保持 JS 的干净。然后只需使用.addClass().removeClass()...
  • @War10ck 哇,这很有帮助。我的整个目标是在我将鼠标悬停在第一个列表中的特定 &lt;li&gt; 上时添加不同的场景。即当我将鼠标悬停在 a1 上时,我想更改 b2 和 b3 的字体/颜色。或者当我将鼠标悬停在 a3 上时更改 b2 的字体/颜色。我忘记了你可以在 css 中创建一个类而不在 html 上。然后只需将 .removeClass() 和 addClass() 运行到我想要的任何场景。我的菜鸟错误。所以谢谢你和@Siwei Shen!
猜你喜欢
  • 2017-06-22
  • 2021-05-07
  • 2015-06-23
  • 1970-01-01
  • 2021-11-20
  • 2022-01-21
  • 2012-06-10
  • 2022-09-25
  • 2021-01-08
相关资源
最近更新 更多