открывать и закрывать меню

#javascript #html #css #navigation

#javascript #HTML #css #навигация

Вопрос:

У меня есть 4 меню, и с помощью этого фрагмента кода я могу показывать меню и скрывать их с помощью определенных btn. мой вопрос в том, как я могу, когда я открываю меню и не закрываю его, а затем открываю другое, закрыть предыдущие меню? я попытался сохранить открытое меню в переменной и проверить его при открытии другого, но это не сработало.

     <body>

    <div class="container"><div class="menu">
            <button class="btn">open</button>
            <div class="items">
                <div class="items-container">
                    <div class="item">item 1</div>
                    <div class="item">item 2</div>
                    <div class="item">item 3</div>
                    <div class="item">item 4</div>
                    <div class="item">item 6</div>
                </div>
            </div>
        </div>
        <div class="container"><div class="menu">
                <button class="btn">open</button>
                <div class="items">
                    <div class="items-container">
                        <div class="item">item 1</div>
                        <div class="item">item 2</div>
                        <div class="item">item 3</div>
                        <div class="item">item 4</div>
                        <div class="item">item 6</div>
                    </div>
                </div>
            </div>
            <div class="container"><div class="menu">
                    <button class="btn">open</button>
                    <div class="items">
                        <div class="items-container">
                            <div class="item">item 1</div>
                            <div class="item">item 2</div>
                            <div class="item">item 3</div>
                            <div class="item">item 4</div>
                            <div class="item">item 6</div>
                        </div>
                    </div>
                </div>
                <div class="container"><div class="menu">
                        <button class="btn">open</button>
                        <div class="items">
                            <div class="items-container">
                                <div class="item">item 1</div>
                                <div class="item">item 2</div>
                                <div class="item">item 3</div>
                                <div class="item">item 4</div>
                                <div class="item">item 6</div>
                            </div>
                        </div>
                    </div>
    </div>


</body>

    const btns = document.querySelectorAll(".btn");
    btns.forEach(btn => {
    const menu = btn.parentElement;
    const items = menu.querySelector(".items");
    const itemsContainer = items.querySelector(".items-container");
    const itemsContainerHeight = itemsContainer.getBoundingClientRect().height;
    let previousActivebtn = "";

    btn.addEventListener("click", (e) => {
        // change btn text
        if (e.currentTarget.innerHTML == "open") {
            e.currentTarget.innerHTML = "close";
        } else {
            e.currentTarget.innerHTML = "open";
        }


        //show and hid the menus
        if (!items.classList.contains("item-active")) {
            items.classList.add("item-active");
            items.style.height = itemsContainerHeight   32   "px";
        } else {
            items.classList.remove("item-active");
            items.removeAttribute("style");

        }


    });
});
  

Комментарии:

1. Используете ли вы фреймворк, подобный Boostrap?

Ответ №1:

Вы слишком усложняете это. Вы могли бы создать правило CSS, которое гарантировало бы, что .items оно скрыто, если .menu не открыто:

 .menu .items:not(.open) {
    display: none
}
  

И вы могли бы создать функцию, подобную этой:

 function open(item) {
    if (!item.classList.contains("open")) {
        //Hide whatever was opened
        for (let it of document.querySelectorAll(.menu .items.open)) {
            it.classList.remove("open")
        }
        item.classList.add("open");
    } else {
        item.classList.remove("open");
    }
}
  

Просто передайте этой функции элемент, имеющий класс items .