一次只打开一个手风琴标签 [英] Only open one accordion tab at one time

查看:28
本文介绍了一次只打开一个手风琴标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个非常好用的手风琴,它在网站上看起来不错并且可以正常工作.但是,我正在尝试为其添加更多 JavaScript 功能,使其看起来更专业.

目前,手风琴允许您同时打开多个面板,即如果我打开一个选项卡,然后打开另一个选项卡,两个选项卡将同时打开.关闭这些面板的唯一方法是重新单击标题.

我想要的是一些 JavaScript 代码,可以防止同时打开多个选项卡,因此如果我单击一个新面板,它应该先关闭现有的打开面板.这是我的手风琴 HTML 代码:

<div class="accordion"><b>Heading 1</b></div><div class="面板"><p class="text-light">文本 1</p>

<div class="accordion"><b>标题 2</b></div><div class="面板"><p class="text-light">文本 2</p>

这是我在单独的 JavaScript 文件中的 JavaScript 代码,该文件当前允许同时打开多个选项卡

var acc = document.getElementsByClassName("accordion");变量 i;for (i = 0; i < acc.length; i++) {acc[i].onclick = function() {this.classList.toggle("active");this.nextElementSibling.classList.toggle("show");}}

不确定您是否需要所有 CSS,但这里有用于显示面板的 CSS

div.panel.show {显示:阻止!重要;}

希望有人能帮忙!提前致谢!

解决方案

要实现此目的,您需要在每次单击时将手风琴的状态重置回其原始状态,然后再为单击的元素设置所需的类.为此,您可以提取功能以将类名设置为它们自己的函数并根据需要调用它.试试这个:

var acc = document.getElementsByClassName("accordion");var panel = document.getElementsByClassName('panel');for (var i = 0; i < acc.length; i++) {acc[i].onclick = function() {var setClasses = !this.classList.contains('active');setClass(acc, 'active', 'remove');setClass(panel, 'show', 'remove');如果(设置类){this.classList.toggle("active");this.nextElementSibling.classList.toggle("show");}}}函数 setClass(els, className, fnName) {for (var i = 0; i < els.length; i++) {els[i].classList[fnName](className);}}

工作示例

I have an accordion that works really well, it looks good on the site and works as it should. However, I'm trying to add some more JavaScript functionality to it, to make it more it look more professional.

Currently, the accordion allows you to have multiple panels open at one time i.e. if I open one tab, and then open another tab, both tabs will be open at the same time. And the only way to close these panels, is to re-click on the header.

What I would like is some JavaScript code that prevents multiple tabs from being open at one time, so if I click on a new panel, it should close the existing open panel first. Here is my HTML code for the accordion:

<div class="accordion"><b>Heading 1</b></div>
<div class="panel">
    <p class="text-light">Text 1</p>
</div>
<div class="accordion"><b>Heading 2</b></div>
<div class="panel">
    <p class="text-light">Text 2</p>
</div>

Here is my JavaScript code in a separate JavaScript file which currently allows multiple tabs to be open at one time

var acc = document.getElementsByClassName("accordion");
var i;

for (i = 0; i < acc.length; i++) {
    acc[i].onclick = function() {
        this.classList.toggle("active");
        this.nextElementSibling.classList.toggle("show");
    }
}

Not sure if you need all the CSS, but heres the CSS for showing the panel

div.panel.show {
    display: block !important;
}

Hopefully someone can help! Thanks in advance!

解决方案

To achieve this you need to reset the state of the accordion back to its original state on each click, before you set the required classes on the clicked elements. To do that you can extract functionality to set the class names in to their own function and call it as required. Try this:

var acc = document.getElementsByClassName("accordion");
var panel = document.getElementsByClassName('panel');

for (var i = 0; i < acc.length; i++) {
    acc[i].onclick = function() {
        var setClasses = !this.classList.contains('active');
        setClass(acc, 'active', 'remove');
        setClass(panel, 'show', 'remove');

        if (setClasses) {
            this.classList.toggle("active");
            this.nextElementSibling.classList.toggle("show");
        }
    }
}

function setClass(els, className, fnName) {
    for (var i = 0; i < els.length; i++) {
        els[i].classList[fnName](className);
    }
}

Working example

这篇关于一次只打开一个手风琴标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
前端开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆