使用UI反馈在多个元素上切换类

时间:2013-03-26 07:26:09

标签: javascript jquery css toggle toggleclass

我有一个列表(空间只是为了清晰起见):

<li class="a">      A     </li>
<li class="b">      B     </li>
<li class="c">      C     </li>
<li class="a b">    A B   </li>
<li class="a c">    A C   </li>
<li class="b c">    B C   </li>
<li class="a b c">  A B C </li>

我有一系列&#39;

<a class="show-a" href="#">A</a>
<a class="show-b" href="#">B</a>
<a class="show-c" href="#">C</a>
<a class="show-all active" href="#">ALL</a>

我有一些CSS:

li           {color: red; }
 .deactivate {color: #ddd; }
a            {color: #ddd; }
 .active     {color: blue; }

我想做两件事:

  1. 点击相应的<a>控件后,将.deactivate类添加/删除到相应的<li>。例如如果点击了.show-a,请将.deactivate应用于没有.a类的所有元素。因此,请从不再需要它的任何.deactivate中删除<li>类。

  2. 反映控件中的当前选择。即,将.active类添加/移除到相应的锚链接。 (这是我永远找不到答案的部分)。

  3. 注意:

    • 在任何给定时间,只有一个控件可以.active。像单选按钮一样,但通过CSS更具风格。
    • 似乎更好的解决方案是使用jQuery和toggleClass。

    RE其他答案:有很多(例如http://jsfiddle.net/Cx4uK/2/)但

    • 无解决#2
    • 最显示/隐藏而不是切换课程
    • 解释的很少,因此很难重复回答并理解它们是如何工作的(这是我的最终目标)。

2 个答案:

答案 0 :(得分:1)

此解决方案使用data-selector属性来保存与特定链接相关的项目的选择器。它有助于使JS真正干净。

对于有效链接,我们只需从所有链接中删除.active,然后将其添加到刚刚点击的链接中。

jsFiddle

<强> JS

$(document).ready(function () {
    $('.links a').click(function () {

        // Remove .active from all links then add to the clicked one
        $('.links a').removeClass('active');
        $(this).addClass('active');

        // Remove .active from all lis then use the attribute data-selector to set
        // the relevant items
        $('.letters li').removeClass('active');
        $(this.getAttribute('data-selector')).addClass('active');
    });
});

<强> HTML

<div class="links">
    <a class="show-a" href="#" data-selector=".a">A</a>
    <a class="show-b" href="#" data-selector=".b">B</a>
    <a class="show-c" href="#" data-selector=".c">C</a>
    <a class="show-all active" href="#" data-selector=".a,.b,.c">ALL</a>
</div>

<ul class="letters">
    <li class="a">      A     </li>
    <li class="b">      B     </li>
    <li class="c">      C     </li>
    <li class="a b">    A B   </li>
    <li class="a c">    A C   </li>
    <li class="b c">    B C   </li>
    <li class="a b c">  A B C </li>
</ul>

<强> CSS

.active {
    background-color:#AAA;
}

答案 1 :(得分:0)

我认为你想要这样的东西:

 $(function () {
    $("#user-controls div").first().addClass('active'); // <---add this line
    $("#user-controls").on('click', 'div', function () {
       $(this).addClass('active').siblings().removeClass('active'); //<--and this
       var classToShow = this.id.split('-')[1],
        filter = classToShow === "all" ? 'div' : '.' + classToShow;
        $("#devices").children().show().not(filter).hide();
    });
});

CHECKOUT FIDDLE

在这里我创建了一个css类.active{}

.active {
  background:red !important;
  color:yellow;
}

在页面加载后#user-controls all中的第一个div应该应用.active css类。

这一个:

$("#user-controls div").first().addClass('active');

然后,如果点击发生在其他链接上,那么在这种情况下.siblings()是有用的功能。

$(this).addClass('active').siblings().removeClass('active');

让我们分手:

$(this).addClass('active')

此行将类.active添加到点击的链接和

.siblings().removeClass('active');

这个删除了在同一级别的其他链接上应用的其他链接类。