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

Toggle class on Multiple Elements with UI Feedback

本文关键字:元素 UI 使用      更新时间:2023-09-26

我有一个列表(空格只是为了方便视觉):

<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>

我有一系列的"控件":

<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>控件时,在相应的<li>上添加/删除.deactivate类,例如单击.show-a,将.deactivate应用于所有没有.a类的元素。并且,因此,从任何不再需要它的<li>中删除.deactivate类。

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

注意:

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

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

  • 没有地址#2
  • 大多数显示/隐藏而不是切换类
  • 很少有解释,所以很难迭代答案并理解它们是如何工作的(这是我的最终目标)。

此解决方案使用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');
    });
});

<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;
}

我假设你想要这样的东西:

 $(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();
    });
});

结帐小提琴

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

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

和刚刚在#user-controls的div的页面加载后,all应该应用.active css类。

和这个:

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

然后如果点击发生在其他链接上,那么在这里,.siblings()是有用的函数。

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

让我们把它分开:

$(this).addClass('active')

这一行将类.active添加到所单击的链接和

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