【问题标题】:How to addClass and removeClass to child element when aria true or false?当 aria true 或 false 时,如何向子元素添加类和删除类?
【发布时间】:2016-05-15 18:52:17
【问题描述】:

我正在使用 dropdown button by Zurb Foundation 5 字体真棒,想法是在菜单可见时旋转字体,并在隐藏后将其旋转回来。

Zurb Foundation 5 不在元素上使用打开类,因此 hasClass 不起作用,而是使用 Aria,由于 hasAria 不存在,我尝试使用一些解决方案,但遗憾的是,这些解决方案无法以一种方式或更多的。我想要做的是当父.wf-burgeraria-expanded = true 时将类fa-rotate-90 添加到字体元素<i> 并在aria-expanded = false 时将其删除。

这是我相当简单的 HTML 代码:

<h1>
    <a aria-expanded="false" aria-controls="drop1" data-dropdown="drop1" href="#" class="wf-burger">
        <i aria-hidden="true" class="fa fa-bars fa-rotate-90"></i>
    </a>
</h1> 
<ul aria-hidden="true" class="f-dropdown" id="drop1" data-dropdown-content>
    <li><a title="Link 1" href="#1">Link 1</a></li>
    <li><a title="Link 2" href="#2">Link 2</a></li>
    <li><a title="Link 3" href="#3">Link 3</a></li>
    <li><a title="Link 4" href="#4">Link 4</a></li>
    <li><a title="Link 5" href="#5">Link 5</a></li>
</ul>

此代码有效,但在 aria 为 false 时不会删除该类:

(function($) {
    var attr = $('.wf-burger').attr('aria-expanded');
    if (typeof attr !== typeof undefined && attr !== false) {
            $('.fa.fa-bars').addClass('fa-rotate-90');
    }
    if (typeof attr !== typeof undefined && attr !== true) {
        $('.fa.fa-bars').removeClass('fa-rotate-90');
    }
})(jQuery);

这段代码根本不起作用:

(function($) {
    if ($('.wf-burger').attr('aria-expanded') === 'true') {
        $('.fa.fa-bars').addClass('fa-rotate-90');
    }
    if ($('.wf-burger').attr('aria-expanded') === 'false') {
        $('.fa.fa-bars').removeClass('fa-rotate-90');
    }
})(jQuery);

【问题讨论】:

  • 或者干脆if(!attr)

标签: javascript jquery css zurb-foundation font-awesome


【解决方案1】:

更简单的解决方案是在点击时简单地切换类。

$(".wf-burger").click(function(){
   $('.wf-burger .fa').toggleClass('fa-rotate-90');
});

CSS 解决方案

我刚刚检查了它在打开下拉菜单时使用了 open 类,它不适用于文档,但它正在使用 CodePen 示例,我使用了基础 5.5.3 版本. http://cdn.foundation5.zurb.com/foundation.js

.wf-burger.open .fa{
  transform: rotate(90deg);
}

参见示例:http://codepen.io/shoaibik/pen/xVevrv

更新答案:

问题是下拉列表应该是附加到下拉列表的锚的兄弟,如果您删除 H1 标记它应该可以工作。

<a aria-expanded="false" aria-controls="drop1" data-dropdown="drop1" href="#" class="wf-burger">
        <i aria-hidden="true" class="fa fa-bars fa-rotate-90"></i>
</a>
<ul aria-hidden="true" class="f-dropdown" id="drop1" data-dropdown-content>
    <li><a title="Link 1" href="#1">Link 1</a></li>
    <li><a title="Link 2" href="#2">Link 2</a></li>
    <li><a title="Link 3" href="#3">Link 3</a></li>
    <li><a title="Link 4" href="#4">Link 4</a></li>
    <li><a title="Link 5" href="#5">Link 5</a></li>
</ul>

【讨论】:

  • 我确实想到了这个解决方案,虽然在这种情况下它对某些情况有好处,但这并不是因为单击任何其他元素旁边 .wf-burger 会关闭该元素,这意味着切换仍将处于活动状态.
  • @SimonHayter 我已经更新了解决方案,看起来 GitHub 文件和基础 CDN 文件之间存在差异。你用过 GitHub 的 Foundation 吗?
  • 怎么知道cdn上是5.5.3版本?因为它没有版本控制。
  • 在JavaScript源文件中搜索5.5.3就可以了,里面有提到。
  • 我应该使用这很奇怪和令人困惑,因为两者都标记为 5.5.3 但有区别。
【解决方案2】:

你可以使用它。你只需要使用$('.wf-burger').attr('aria-expanded') == 'true'。无需使用类型检查===

同时使用toggleClass() 将是一个很好的方法。

$('.fa.fa-bars').toggleClass(
    'fa-rotate-90', 
    $('.wf-burger').attr('aria-expanded') == 'true'
);
.fa-rotate-90 {
  border:1px solid red;
  height:20px;
  width:20px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<a aria-expanded="true" aria-controls="drop1" data-dropdown="drop1" href="#" class="wf-burger">
  <i aria-hidden="true" class="fa fa-bars fa-rotate-90"></i>
</a>
<ul aria-hidden="true" class="f-dropdown" id="drop1" data-dropdown-content>
  <li><a title="Link 1" href="#1">Link 1</a>
  </li>
  <li><a title="Link 2" href="#2">Link 2</a>
  </li>
  <li><a title="Link 3" href="#3">Link 3</a>
  </li>
  <li><a title="Link 4" href="#4">Link 4</a>
  </li>
  <li><a title="Link 5" href="#5">Link 5</a>
  </li>
</ul>

【讨论】:

  • 可悲的是,即使运行代码 sn-p 也不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
相关资源
最近更新 更多