Сделайте вложенный аккордеон с jquery - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь сделать вложенный аккордеон с jQuery. Пока я сделал это:

$('.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);
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul class="accordion">
  <li>
    <a class="toggle" href="javascript:void(0);">Item :A </a>
    <ul class="inner">
      <li>
        <a href="#" class="toggle">Item : a1</a>
        <div class="inner show">
          <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">Item a2</a>
        <div class="inner">
          <p>
            Children will automatically close upon closing its parent.
          </p>
        </div>
      </li>
      <li>Option 2</li>
    </ul>
  </li>
</ul>

Однако я не удовлетворен тем, что я пытаюсь достичь, что-то вроде этого:

enter image description here

Может кто-нибудь помочь мне с этим? Также я создал ссылку jsfiddle: https://jsfiddle.net/9d3pnyc6/1/

1 Ответ

0 голосов
/ 18 февраля 2020

Здесь у вас есть код:

html: в Варианте 2 необходимо добавить класс (<li class="parentChild">Option 2</li>)

<ul class="accordion">

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

        <ul class="inner">
            <li>
                <a href="#" class="toggle">Item : a1</a>
                <div class="inner show">
                    <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">Item a2</a>
                <div class="inner">
                    <p>
                        Children will automatically close upon closing its parent.
                    </p>
                </div>
            </li>
            <li class="parentChild">Option 2</li>

        </ul>
    </li>
</ul>

css: в ul parent нужно добавить display:block!important;, а в Option 2 li.parentChild display:none;

ul {
  display:block!important;
  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.parentChild{
  display:none;
}

javascript: вам нужно добавьте $this.parent().parent().find('li .parentChild').toggle(); к обоим условиям

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

Результат можно увидеть в вашей ссылке jsfiddle: https://jsfiddle.net/mwpo7d3L/20/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...