【问题标题】:How to add active state for "nested" accordion如何为“嵌套”手风琴添加活动状态
【发布时间】:2016-08-27 15:05:31
【问题描述】:

我在这里的 codepen 使用 'ul' 发现了这种高效实用的嵌套手风琴:https://codepen.io/brenden/pen/Kwbpyj

如下:

$('.toggle').click(function(e) {
  	e.preventDefault();
  
    var $this = $(this);
  
    if ($this.next().hasClass('show')) {
        $this.next().removeClass('show');
        $this.next().slideUp(350);
    } else {
        $this.parent().parent().find('li .inner').removeClass('show');
        $this.parent().parent().find('li .inner').slideUp(350);
        $this.next().toggleClass('show');
        $this.next().slideToggle(350);
    }
});
url('http://fonts.googleapis.com/css?family=Pacifico|Open+Sans:300,400,600');
* {
  box-sizing: border-box;
  font-family: 'Open Sans', sans-serif;
  font-weight: 300;
}
.active {
  text-decoration: underline !important;
}
a {
  text-decoration: none;
  color: inherit;
}
p {
  font-size: 1.1em;
  margin: 1em 0;
}
.description {
  margin: 1em auto 2.25em;
}
body {
  width: 40%;
  min-width: 300px;
  max-width: 400px;
  margin: 1.5em auto;
  color: #333;
}
h1 {
  font-family: 'Pacifico', cursive;
  font-weight: 400;
  font-size: 2.5em;
}
ul {
  list-style: none;
  padding: 0;
}
ul .inner {
  padding-left: 1em;
  overflow: hidden;
  display: none;
}
ul .inner.show {
  /*display: block;*/
}
ul li {
  margin: .5em 0;
}
ul li a.toggle {
  width: 100%;
  display: block;
  background: rgba(0, 0, 0, 0.78);
  color: #fefefe;
  padding: .75em;
  border-radius: 0.15em;
  transition: background .3s ease;
}
ul li a.toggle:hover {
  background: rgba(0, 0, 0, 0.9);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>
<h1>A Cool Accordion</h1>

<p class="description">
  You could simply toggle the .show class (if display: block is uncommented in the CSS) in JavaScript, but you'll lose the animation.
</p>

<ul class="accordion">
  <li>
    <a class="toggle" href="javascript:void(0);">Item 1</a>
    <ul class="inner">
      <li>Option 1</li>
      <li>Option 2</li>
      <li>Option 3</li>
    </ul>
  </li>
  
  <li>
    <a class="toggle" href="javascript:void(0);">Item 2</a>
    <ul class="inner">
      <li>Option 1</li>
      <li>Option 2</li>
      <li>Option 3</li>
    </ul>
  </li>
  
  <li>
    <a class="toggle" href="javascript:void(0);">Item 3</a>
    <ul class="inner">
      <li>
        <a href="#" class="toggle">Open Inner</a>
        <div class="inner">
          <p>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tempus placerat fringilla. Duis a elit et dolor laoreet volutpat. Aliquam ultrices mauris id mattis imperdiet. Aenean cursus ultrices justo et varius. Suspendisse aliquam orci id dui dapibus
            blandit. In hac habitasse platea dictumst. Sed risus velit, pellentesque eu enim ac, ultricies pretium felis.
          </p>
        </div>
      </li>
      
      <li>
        <a href="#" class="toggle">Open Inner #2</a>
        <div class="inner">
          <p>
            Children will automatically close upon closing its parent.
          </p>
        </div>
      </li>
      
      <li>Option 3</li>
    </ul>
  </li>
  
  <li>
    <a class="toggle" href="javascript:void(0);">Item 4</a>
    <ul class="inner">
      <li>
        <a href="#" class="toggle">Technically any number of nested elements</a>
        <ul class="inner">
          <li>
            <a href="#" class="toggle">Another nested element</a>
            <div class="inner">
              <p>
                As long as the inner element has inner as one of its classes then it will be toggled.
              </p>
              <p>
                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tempus placerat fringilla. Duis a elit et dolor laoreet volutpat. Aliquam ultrices mauris id mattis imperdiet. Aenean cursus ultrices justo et varius. Suspendisse aliquam orci id dui dapibus
                blandit. In hac habitasse platea dictumst. Sed risus velit, pellentesque eu enim ac, ultricies pretium felis.
              </p>
            </div>
          </li>
        </ul>
      </li>
      
      <li>Option 2</li>
      
      <li>Option 3</li>
    </ul>
  </li>
</ul>

但它不支持通过为打开的标题添加例如“.active”类来支持活动状态。

还请看“第 3 项”。当您单击嵌套的“a”时,活动“li”父级中的“a”的“.active”类将被删除。这里的重点是如何在单击嵌套的“a”时保持它们处于活动状态?

那么你能帮我做吗?

【问题讨论】:

  • 只需在.click() 方法中删除并添加.active 类即可。
  • 嗨,Morad Hamdy,你到底想对那个“.active”类做什么,因为它正在处理“.show”类,正如你将在代码中看到的那样,你会发现如果手风琴有 show类然后它是活动的
  • @Polyov 每个 'a' 都有类 '.toggle'。我想要为单击的“a”添加“.active”类,然后在单击另一个类似的“a”时将其删除
  • @HimeshAadeshara '.show' 被添加到下一个 'ul' 中,但我想在标题中添加 '.active' 类,即点击的 'a'
  • @MoradHamdy 我已经给出了答案,请检查下面的答案

标签: javascript jquery html accordion


【解决方案1】:

检查以下代码。

jQuery

 $('.toggle').click(function(e) { e.preventDefault();        
  var $this = $(this);  
  if ($this.next().hasClass('show')) {
    $this.next().removeClass('show');
    $this.parent().find('.active').removeClass('active')    
    $this.next().slideUp(350);
   } else {
    $this.parent().parent().find('.active').removeClass('active');       
    $this.parent('ul').find('.active').removeClass('active')
    $this.parent().parent().find('li .inner').removeClass('show');
    $this.parent().parent().find('li .inner').slideUp(350);
    $this.toggleClass('active');      
    $this.next().toggleClass('show');
    $this.next().slideToggle(350);
}
});

CSS

.active{
 background-color :blue !important;
}

它在标记中添加活动类:

<a class="toggle active" href="javascript:void(0);">Item 1</a>

【讨论】:

  • 我试过了,但它并没有给出我正在寻找的特定目的。以下是使用您建议的代码的外观:awesomescreenshot.com/image/1521160/… 我希望它为单击的类添加类并从其他类中删除。但是当我点击嵌套的'a'时,活动类对于'a'的所有父母'li's保持相同
  • ohhkay !1 @MoradHamdy 更新了我的答案,现在可以正常工作了
  • @Nilan Aggarwal .. 几乎接近了,你做得最多:) .. 看看“第 3 项”。当您单击嵌套的“a”时,活动“li”父级中的“a”的“.active”类将被删除。这里的重点是当我点击嵌套的“a”时如何让它们保持活动状态?
  • 所以你想让父母和孩子都有一个活跃的班级,如果孩子也被点击了?只有活跃的孩子不是其他的。这就是你想要的@MoradHamdy
  • 这是当前应用代码的预览:awesomescreenshot.com/image/1521461/…..我希望它是这样的:awesomescreenshot.com/image/1521462/…..我想让父母保持活跃。
【解决方案2】:

在这里我更新了我的答案,因为您对我的答案发表了评论,请查看。

$('.toggle').click(function(e) {
  	e.preventDefault();
  
var $this = $(this);
 
if ($this.next().hasClass('show')) {
    $this.next().removeClass('show');
  
    /* JUST ADD HERE CLASS .ACTIVE */
    $this.removeClass("active");

    $this.next().slideUp(350);
} else {
    $this.parent().parent().find('li .inner').removeClass('show');
   
    if($this.hasClass('parent')){
    
    	/* JUST REMOVING HERE CLASS .ACTIVE FROM EARLY APPLIED */
      
      $this.parents(".accordion").find(".toggle").removeClass("active");        	
      
				}else if($this.hasClass('child')){
    
    	/* JUST REMOVING HERE CLASS .ACTIVE FROM EARLY APPLIED FOR CHILD */
    	$this.parents(".accordion").find(".toggle.child").removeClass("active");
      
				}else{
    
    	/* JUST REMOVING HERE CLASS .ACTIVE FROM EARLY APPLIED FOR CHILD OF CHILD */
    	$this.parents(".accordion").find(".toggle.child-child").removeClass("active");
      
				}
  
    $this.parent().parent().find('li .inner').slideUp(350);
    $this.next().toggleClass('show');
    
    /* JUST ADD HERE CLASS .ACTIVE */
    $this.addClass("active");      
    $this.next().slideToggle(350);
}
});
url('http://fonts.googleapis.com/css?family=Pacifico|Open+Sans:300,400,600');
* {
  box-sizing: border-box;
  font-family: 'Open Sans', sans-serif;
  font-weight: 300;
}
.active {
  text-decoration: underline !important;
}
a {
  text-decoration: none;
  color: inherit;
}
p {
  font-size: 1.1em;
  margin: 1em 0;
}
.description {
  margin: 1em auto 2.25em;
}
body {
  width: 40%;
  min-width: 300px;
  max-width: 400px;
  margin: 1.5em auto;
  color: #333;
}
h1 {
  font-family: 'Pacifico', cursive;
  font-weight: 400;
  font-size: 2.5em;
}
ul {
  list-style: none;
  padding: 0;
}
ul .inner {
  padding-left: 1em;
  overflow: hidden;
  display: none;
}
ul .inner.show {
  /*display: block;*/
}
ul li {
  margin: .5em 0;
}
ul li a.toggle {
  width: 100%;
  display: block;
  background: rgba(0, 0, 0, 0.78);
  color: #fefefe;
  padding: .75em;
  border-radius: 0.15em;
  transition: background .3s ease;
}
ul li a.toggle:hover {
  background: rgba(0, 0, 0, 0.9);
}

ul li a.toggle.active{
  background: blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h1>A Cool Accordion</h1>

<p class="description">
  You could simply toggle the .show class (if display: block is uncommented in the CSS) in JavaScript, but you'll lose the animation.
</p>

<ul class="accordion">
  <li>
    <a class="toggle parent" href="javascript:void(0);">Item 1</a>
    <ul class="inner">
      <li>Option 1</li>
      <li>Option 2</li>
      <li>Option 3</li>
    </ul>
  </li>
  
  <li>
    <a class="toggle parent" href="javascript:void(0);">Item 2</a>
    <ul class="inner">
      <li>Option 1</li>
      <li>Option 2</li>
      <li>Option 3</li>
    </ul>
  </li>
  
  <li>
    <a class="toggle parent" href="javascript:void(0);">Item 3</a>
    <ul class="inner">
      <li>
        <a href="#" class="toggle child">Open Inner</a>
        <div class="inner">
          <p>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tempus placerat fringilla. Duis a elit et dolor laoreet volutpat. Aliquam ultrices mauris id mattis imperdiet. Aenean cursus ultrices justo et varius. Suspendisse aliquam orci id dui dapibus
            blandit. In hac habitasse platea dictumst. Sed risus velit, pellentesque eu enim ac, ultricies pretium felis.
          </p>
        </div>
      </li>
      
      <li>
        <a href="#" class="toggle child">Open Inner #2</a>
        <div class="inner">
          <p>
            Children will automatically close upon closing its parent.
          </p>
        </div>
      </li>
      
      <li>Option 3</li>
    </ul>
  </li>
  
  <li>
    <a class="toggle parent" href="javascript:void(0);">Item 4</a>
    <ul class="inner">
      <li>
        <a href="#" class="toggle child">Technically any number of nested elements</a>
        <ul class="inner">
          <li>
            <a href="#" class="toggle child-child">Another nested element</a>
            <div class="inner">
              <p>
                As long as the inner element has inner as one of its classes then it will be toggled.
              </p>
              <p>
                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tempus placerat fringilla. Duis a elit et dolor laoreet volutpat. Aliquam ultrices mauris id mattis imperdiet. Aenean cursus ultrices justo et varius. Suspendisse aliquam orci id dui dapibus
                blandit. In hac habitasse platea dictumst. Sed risus velit, pellentesque eu enim ac, ultricies pretium felis.
              </p>
            </div>
          </li>
        </ul>
      </li>
      
      <li>Option 2</li>
      
      <li>Option 3</li>
    </ul>
  </li>
</ul>

这里是演示

JSFIDDLE DEMO

【讨论】:

  • 最近。还是漏了点什么。例如,当您打开“项目 4”,然后打开第 1 个嵌套,然后打开第 2 个嵌套,然后返回关闭标题为“Technically any number of nested elements”的第一个,然后再打开它,您会发现它的嵌套尽管应该将其删除,但标题为“另一个嵌套元素”的仍然具有 .active 类。上面的“Nalin Aggarwal”已经实现了我要求的特定风格。看一下以区分预览以了解我的具体意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2018-12-23
  • 2021-07-25
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多