简体   繁体   English

如何一次只打开 1 个手风琴

[英]How to open only 1 accordion at one time

$('.accordion').on('click', '.accordion-control', function(e){
    e.preventDefault();
    $(this)
    .next('.accordion-panel')
    .not(':animated')
    .slideToggle();
});
<ul class="accordion">
        <li>
    <button class="accordion-control">Something</button>
    <div class="accordion-panel">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    </div>
        </li>

        <li>
    <button class="accordion-control">Something</button>
    <div class="accordion-panel">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    </div>
        </li>
</ul>

My accordion is working just fine.我的手风琴工作正常。 But i want it to be like the user can only open one accordion at once.但我希望它就像用户一次只能打开一个手风琴一样。 When one accordion is open the user cannot open another accordion.当一个手风琴打开时,用户不能打开另一个手风琴。 This is simple jQuery, no other libraries or frameworks are used.这是简单的 jQuery,没有使用其他库或框架。 I have also included some part of my HTML file you can have a look.我还包含了我的 HTML 文件的某些部分,您可以看看。

Just close all of them and open the one that the user click on:只需关闭所有这些并打开用户单击的那个:

 $('.accordion-control').click(function(){ $(".accordion-panel").slideUp(); $(this).next('.accordion-panel').slideToggle(); });
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <ul class="accordion"> <li> <button class="accordion-control">Something</button> <div class="accordion-panel"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> </div> </li> <li> <button class="accordion-control">Something</button> <div class="accordion-panel"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> </div> </li> </ul>

This SO relate: JS slideToggle close other open divs这个 SO 相关: JS slideToggle close other open divs

I rewrote your sample input with prescribed jQuery UI markup, as documented here: https://api.jqueryui.com/accordion/#entry-examples我使用规定的jQuery UI 标记重写了您的示例输入,如下所述: https : //api.jqueryui.com/accordion/#entry-examples

Your sample code in your question doesn't match correct markup very closely.您问题中的示例代码与正确的标记不太匹配。

As you can see in the working example below, only one panel is open at any given time, which is what you reported as the desired behavior.正如您在下面的工作示例中看到的那样,在任何给定时间只有一个面板打开,这就是您报告的所需行为。 As mentioned in my comment above, that is also the default behavior.正如我在上面的评论中提到的,这也是默认行为。

Run snippet below to see a working version in action.运行下面的代码片段以查看正在运行的工作版本。

 $("#accordion").accordion();
 <link href="//code.jquery.com/ui/1.12.1/themes/smoothness/jquery-ui.css" rel="stylesheet"/> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script> <div id="accordion"> <h3>Something 1</h3> <div> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> </div> <h3>Something 2</h3> <div> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> </div> </div>

You need to close the open panel.您需要关闭打开的面板。

 $('.accordion').on('click', '.accordion-control', function(e) { e.preventDefault(); //Close Open panel $(this).closest(".accordion").find(".accordion-panel:visible").slideToggle(); $(this) .next('.accordion-panel') .not(':animated') .slideToggle(); });
 .accordion-panel { display: none; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <ul class="accordion"> <li> <button class="accordion-control">Something</button> <div class="accordion-panel"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> </div> </li> <li> <button class="accordion-control">Something</button> <div class="accordion-panel"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> </div> </li> </ul>

probably what you could do is disable all of your accordions and everytime the user clicks on one of them enable the next one.可能您可以做的是禁用所有手风琴,并且每次用户单击其中一个时启用下一个。

You can see an example here hope that will solve your problem.你可以在这里看到一个例子希望能解决你的问题。

I also have provided a code snippet to help you with the previous example.我还提供了一个代码片段来帮助您完成前面的示例。

 // Disable #x $('.accordion').on('click', function(e){ e.preventDefault(); $(this) .next('.accordion-panel') .not(':animated') .slideToggle(); $( "#x" ).prop( "disabled", false ); });
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <select id="x" class="form-control" disabled> <option>1</option> <option>2</option> <option>3</option> <option>4</option> <option>5</option> </select> <button class="accordion">click me</button>

What you are trying to achieve is also possible with the framework bootstrap in an easy way that you can see by clicking here .您尝试实现的目标也可以通过框架引导程序以一种简单的方式实现,您可以单击此处查看 Bootstrap also uses jquery so if you need to costumize anything it's possible too. Bootstrap 也使用 jquery,所以如果你需要修改任何东西,它也是可能的。 To download it you can click here .要下载它,你可以点击这里 Please note, in order to bootstrap code work you need to download it and write the right path on the head of your html or add this scripts:请注意,为了引导代码工作,您需要下载它并在 html 的头部写入正确的路径或添加以下脚本:

<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.min.js" integrity="sha384-w1Q4orYjBQndcko6MimVbzY0tgp4pWB4lZ7lr30WKz0vr/aWKhXdBNmNb5D92v7s" crossorigin="anonymous"></script>

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

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