简体   繁体   English

手风琴导航标题的切换图标

[英]Toggle icon for accordion nav headers

Given the following navigation, I need to be able to toggle the "HEADER"'s so that when one is open, the + becomes a - , but when you click either the same header again or another, it becomes a + again. 给定以下导航,我需要能够切换“ HEADER”,以便当一个打开时, +变为- ,但是当您再次单击相同的标题或另一个单击时,它再次变为+ It is currently staying as a - when clicking it again. 再次单击时,它当前保持为- The main navigation should function the same as the sub-navigation, except that instead of an arrow, it is changing the + and - as stated above. 主导航的功能应与子导航相同,不同的是,如上所述,它代替了箭头,而是改变了+-

HTML 的HTML

    <div class="inner">
  <button data-target="#data-nav-0" data-toggle="collapse" data-state="show" class="list-header major no-style"> <span>HEADER</span> </button>
  <div class="col-wrapper collapse in" id="data-nav-0" style="display: block;">
    <div class="column">
      <ul class="list-unstyled">

        <li class="list-header mobile"><a href="#" class="link">link</a></li>
        <li class="list-header desktop"><a href="#">head</a></li>
        <li class="mobile chevron-right" data-target="#data-inner-0-0" data-toggle="collapse" data-state="hide">
          <button class="no-style sub-header">This should toggle the ul links</button>
        </li>

        <ul class="inner collapse" id="data-inner-0-0">
          <li><a href="#" class="link">link</a></li>
          <li><a href="#" class="link">link</a></li>
          <li><a href="#" class="link">link</a></li>
          <li><a href="#" class="link">link</a></li>
        </ul>
      </ul>
    </div>
    <div class="column">
      <ul class="list-unstyled">
        <li class="list-header desktop"><a href="#">Link</a></li>
        <li class="mobile chevron-right" data-target="#data-inner-0-1" data-toggle="collapse" data-state="hide">
          <button class="no-style sub-header">This should toggle the ul links</button>
        </li>

        <ul class="inner collapse" id="data-inner-0-0">
          <li><a href="#" class="link">link</a></li>
          <li><a href="#" class="link">link</a></li>
          <li><a href="#" class="link">link</a></li>
          <li><a href="#" class="link">link</a></li>
        </ul>
      </ul>
      </ul>
    </div>
  </div>
</div>

<div class="inner">
  <button data-target="#data-nav-0" data-toggle="collapse" data-state="show" class="list-header major no-style"> <span>HEADER</span> </button>
  <div class="col-wrapper collapse in" id="data-nav-0" style="display: block;">
    <div class="column">
      <ul class="list-unstyled">

        <li class="list-header mobile"><a href="#" class="link">link</a></li>
        <li class="list-header desktop"><a href="#">head</a></li>
        <li class="mobile chevron-right" data-target="#data-inner-0-0" data-toggle="collapse" data-state="hide">
          <button class="no-style sub-header">This should toggle the ul links</button>
        </li>

        <ul class="inner collapse" id="data-inner-0-0">
          <li><a href="#" class="link">link</a></li>
          <li><a href="#" class="link">link</a></li>
          <li><a href="#" class="link">link</a></li>
          <li><a href="#" class="link">link</a></li>
        </ul>
      </ul>
    </div>
    <div class="column">
      <ul class="list-unstyled">
        <li class="list-header desktop"><a href="#">Link</a></li>
        <li class="mobile chevron-right" data-target="#data-inner-0-1" data-toggle="collapse" data-state="hide">
          <button class="no-style sub-header">This should toggle the ul links</button>
        </li>

        <ul class="inner collapse" id="data-inner-0-0">
          <li><a href="#" class="link">link</a></li>
          <li><a href="#" class="link">link</a></li>
          <li><a href="#" class="link">link</a></li>
          <li><a href="#" class="link">link</a></li>
        </ul>
      </ul>
      </ul>
    </div>
  </div>
</div>

jQuery jQuery的

$('.list-header.major').next('div').toggle();
    $('.list-header.major').click(function(){
    $('.list-header.major').next('div').slideUp();
      $(this).next('div').toggle();
      $('.list-header').removeClass('active');
      $(this).toggleClass('active');
      return false;
    });

$('.mobile').next('ul').toggle();
$('.mobile').click(function() {
  $('.mobile').next('ul').slideUp();
  $(this).next('ul').toggle();
  $('.mobile button').removeClass('active');
  if ($(this).next('ul').is(':visible')) {
      $(this).find('button').addClass('active');
  }
  return false;
});

CSS 的CSS

 button.list-header.major {
  &:before,
  &:after {
    color: $purple;
    font-family: 'Material Icons';
    font-size: 20px;
    position: absolute;
    right: 20px;
  }

  &:before {
    content: "\E145"; <--THIS IS A PLUS SIGN
  }

  &:after {
    content: "\E15B"; <--THIS IS A MINUS SIGN
  }
}
.sub-header:after{
      content: " >";
      font-family: 'Material Icons';
      display: inline-block;
      transform: rotate(0);
      font-size: 26px;
      color: $white;
      position: relative;
      top: 8px;
      transition: transform .3s;
    }
    .sub-header.active:after{
      content: " v";
      color: red;
      display: inline-block;
      transform: rotate(8deg);
      font-size: 26px;
      color: $neon-green;
      transition: transform .3s;
    }

JSFIDDLE: https://jsfiddle.net/jdkwcpva/10/ JSFIDDLE: https ://jsfiddle.net/jdkwcpva/10/

//UPDATE// //更新//

I found that the state of the hearers is always set to active, and that the only way to toggle the + or - sign is to toggle the data-state from show to hide , which would be based on the state of the .col-wrapper classes style being either display:none or display: block . 我发现听众的状态始终设置为活动状态,并且切换+-符号的唯一方法是将data-stateshow切换为hide ,这将基于.col-wrapper的状态。 .col-wrapper类的styledisplay:nonedisplay: block

The question is how to look for the display state of the .col-wrapper class and change the data-state based on whether the .list-header has been clicked or not. 问题是如何查找.col-wrapper类的显示状态并根据是否已单击.list-header更改data-state I've included screen shots of the states from the fiddle( https://jsfiddle.net/2bu35uLn/3/show/ ) below. 我在下面提供了小提琴( https://jsfiddle.net/2bu35uLn/3/show/ )中状态的屏幕截图。

This is the closed state 这是关闭状态 在此处输入图片说明

This is the open state Notice that the .col-wrapper class has display:block to show the subnav, but the .list-header class is still set to data-state="hide" , which keeps the header from being toggled. 这是打开状态。请注意, .col-wrapper类具有display:block来显示子导航,但.list-header类仍设置为data-state="hide" ,可防止切换标题。 在此处输入图片说明

I'm trying to target the data-state to change to hide if the .col-wrapper class is display:none , but doing something like this: 我正在尝试将.col-wrapper类为display:nonedata-state更改为hide ,但是这样做是这样的:

$(".list-header").on('click', function(){
    if($(this).find(".col-wrapper").css("display", "none")){
      force data-state to be hide
    }
});

Essentially, the issue is that the icons aren't toggling back to the plus sign, if the user clicks on another header. 本质上,问题在于,如果用户单击另一个标题,则图标不会切换回加号。 This should force any closed list header to go back to the plus sign. 这将强制所有封闭列表标头返回加号。

You are almost done. 您快完成了。

I added some more stuff. 我增加了一些东西。

$('.list-header.major').next('div').toggle();
    $('.list-header.major').click(function(){
    $('.list-header.major').next('div').slideUp();
      isActive = $(this).hasClass('active');
      $('.list-header.major').removeClass('active');
      if(isActive){
        $(this).removeClass('active') }
      else{
        $(this).addClass('active').next('div').slideDown();
      }
      return false;
    });

$('.mobile').next('ul').toggle();
$('.mobile').click(function() {
  $('.mobile').next('ul').slideUp();
  $(this).next('ul').toggle();
  $('.mobile button').removeClass('active');
  if ($(this).next('ul').is(':visible')) {
      $(this).find('button').addClass('active');
  }
  return false;
});

Look at this: https://jsfiddle.net/2bu35uLn/ 看这个: https : //jsfiddle.net/2bu35uLn/

My proposal is (see comment: I changed the next line). 我的建议是(请参阅评论:我更改了下一行)。

This works because toggleclass adds the class if it does not exist or remove if it exists. 之所以有效,是因为toggleclass如果不存在则添加该类,如果存在则将其删除。

 $(function () { $('.list-header.major').next('div').toggle(); $('.list-header.major').click(function(){ $('.list-header.major').next('div').slideUp(); $(this).next('div').toggle(); // I changed the next line $('.list-header.major').not(this).removeClass('active'); $(this).toggleClass('active'); return false; }); $('.mobile').next('ul').toggle(); $('.mobile').click(function() { $('.mobile').next('ul').slideUp(); $(this).next('ul').toggle(); $('.mobile button').removeClass('active'); if ($(this).next('ul').is(':visible')) { $(this).find('button').addClass('active'); } return false; }); }); 
 .list-header.major:after{ content: " +"; color: red; } .list-header.major.active:after{ content: " -"; color: red; } .sub-header:after{ content: " >"; font-family: 'Material Icons'; display: inline-block; transform: rotate(0); font-size: 26px; color: $white; position: relative; top: 8px; transition: transform .3s; } .sub-header.active:after{ content: " v"; color: red; display: inline-block; transform: rotate(8deg); font-size: 26px; color: $neon-green; transition: transform .3s; } 
 <script src="https://code.jquery.com/jquery-1.12.1.min.js"></script> <div class="inner"> <button data-target="#data-nav-0" data-toggle="collapse" data-state="show" class="list-header major no-style"><span>HEADER</span> </button> <div class="col-wrapper collapse in" id="data-nav-0" style="display: block;"> <div class="column"> <ul class="list-unstyled"> <li class="list-header mobile"><a href="#" class="link">link</a></li> <li class="list-header desktop"><a href="#">head</a></li> <li class="mobile chevron-right" data-target="#data-inner-0-0" data-toggle="collapse" data-state="hide"> <button class="no-style sub-header">This should toggle the ul links</button> </li> <ul class="inner collapse" id="data-inner-0-0"> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> </ul> </ul> </div> <div class="column"> <ul class="list-unstyled"> <li class="list-header desktop"><a href="#">Link</a></li> <li class="mobile chevron-right" data-target="#data-inner-0-1" data-toggle="collapse" data-state="hide"> <button class="no-style sub-header">This should toggle the ul links</button> </li> <ul class="inner collapse" id="data-inner-0-0"> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> </ul> </ul> </ul> </div> </div> </div> <div class="inner"> <button data-target="#data-nav-0" data-toggle="collapse" data-state="show" class="list-header major no-style"><span>HEADER</span> </button> <div class="col-wrapper collapse in" id="data-nav-0" style="display: block;"> <div class="column"> <ul class="list-unstyled"> <li class="list-header mobile"><a href="#" class="link">link</a></li> <li class="list-header desktop"><a href="#">head</a></li> <li class="mobile chevron-right" data-target="#data-inner-0-0" data-toggle="collapse" data-state="hide"> <button class="no-style sub-header">This should toggle the ul links</button> </li> <ul class="inner collapse" id="data-inner-0-1"> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> </ul> </ul> </div> <div class="column"> <ul class="list-unstyled"> <li class="list-header desktop"><a href="#">Link</a></li> <li class="mobile chevron-right" data-target="#data-inner-0-1" data-toggle="collapse" data-state="hide"> <button class="no-style sub-header">This should toggle the ul links</button> </li> <ul class="inner collapse" id="data-inner-0-2"> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> </ul> </ul> </ul> </div> </div> </div> 

What I was able to do is check whether the clicked element was open and then hide all the lists. 我所能做的就是检查clicked元素是否已打开,然后隐藏所有列表。 IF the clicked element was closed to begin with, then I was able to show it. 如果被单击的元素一开始是关闭的,那么我可以显示它。 This snippet will work for you: 该代码段将为您工作:

 $('.list-header.major').click(function(){ var is_open = false; if ($(this).hasClass('active')){ is_open = true; } $('.list-header.major').next('div').slideUp(); $('.list-header.major').removeClass('active'); if (!is_open) { $(this).addClass('active'); $(this).next('div').slideDown(); } }); $('.mobile').click(function() { var is_open = false; if ($(this).children('button').hasClass('active')){ is_open = true; } $('.mobile').next('li').slideUp(); $('.mobile').children('button').removeClass('active'); if(!is_open){ $(this).next('li').slideDown(); $(this).children('button').addClass('active'); } }); 
 .major-content, .mobile-content{ display:none; } .mobile-content{ list-style:none } .list-header.major:after{ content: " +"; color: red; } .list-header.major.active:after{ content: " -"; color: red; } .sub-header:after{ content: " >"; font-family: 'Material Icons'; display: inline-block; transform: rotate(0); font-size: 26px; color: $white; position: relative; top: 8px; transition: transform .3s; } .sub-header.active:after{ content: " v"; color: red; display: inline-block; transform: rotate(8deg); font-size: 26px; color: $neon-green; transition: transform .3s; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="inner"> <button data-target="#data-nav-0" data-toggle="collapse" data-state="show" class="list-header major no-style"> <span>HEADER</span> </button> <div class="col-wrapper collapse in major-content" id="data-nav-0"> <div class="column"> <ul class="list-unstyled"> <li class="list-header"><a href="#" class="link">link</a></li> <li class="list-header desktop"><a href="#">head</a></li> <li class="mobile chevron-right" data-target="#data-inner-0-0" data-toggle="collapse" data-state="hide"> <button class="no-style sub-header">This should toggle the ul links</button> </li> <li class="mobile-content"> <ul class="inner collapse" id="data-inner-0-0"> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> </ul> </li> </ul> </div> <div class="column"> <ul class="list-unstyled"> <li class="list-header desktop"><a href="#">Link</a></li> <li class="mobile chevron-right" data-target="#data-inner-0-1" data-toggle="collapse" data-state="hide"> <button class="no-style sub-header">This should toggle the ul links</button> </li> <li class="mobile-content"> <ul class="inner collapse" id="data-inner-0-0"> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> </ul> </li> </ul> </ul> </div> </div> </div> <div class="inner"> <button data-target="#data-nav-0" data-toggle="collapse" data-state="show" class="list-header major no-style"> <span>HEADER</span> </button> <div class="col-wrapper collapse in major-content" id="data-nav-0"> <div class="column"> <ul class="list-unstyled"> <li class="list-header"><a href="#" class="link">link</a></li> <li class="list-header desktop"><a href="#">head</a></li> <li class="mobile chevron-right" data-target="#data-inner-0-0" data-toggle="collapse" data-state="hide"> <button class="no-style sub-header">This should toggle the ul links</button> </li> <li class="mobile-content"><ul class="inner collapse" id="data-inner-0-0"> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> </ul></li> </ul> </div> <div class="column"> <ul class="list-unstyled"> <li class="list-header desktop"><a href="#">Link</a></li> <li class="mobile chevron-right" data-target="#data-inner-0-1" data-toggle="collapse" data-state="hide"> <button class="no-style sub-header">This should toggle the ul links</button> </li> <li class="mobile-content"><ul class="inner collapse" id="data-inner-0-0"> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> <li><a href="#" class="link">link</a></li> </ul></li> </ul> </ul> </div> </div> </div> 

On a side note, I wrapped the nested ul elements within li elements to make it valid html. 附带说明一下,我将嵌套的ul元素包装在li元素中以使其有效为html。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM