JSFiddle - React, Tailwind, and code Playground

by learningforever

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Menu Example</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div class="sub-menu">
        <div class="sub-menu-main" id="sub-menu-main">
            <div class="main-menu-title" id="main-menu-title">회사소개</div>
            <ul id="main-menu-list">
                <li data-value="회사소개">회사소개</li>
                <li data-value="서비스">서비스</li>
                <li data-value="개발">개발</li>
                <li data-value="문의">문의</li>
            </ul>
        </div>
        <div class="sub-menu-sub" id="sub-menu-sub">
            <div class="sub-menu-title" id="sub-menu-title"></div>
            <ul id="sub-menu-list">
                <!-- Submenu options will be dynamically loaded here -->
            </ul>
        </div>
    </div>
    <div id="content">
        <!-- Content will be dynamically loaded here -->
    </div>
    <script src="script.js"></script>
</body>
</html>

CSS

body {
    font-family: Arial, sans-serif;
}
.sub-menu {
    display: flex;
    background-color: #f9f9f9;
    padding: 20px;
    margin-top: 20px;
}
.sub-menu-main,
.sub-menu-sub {
    position: relative;
    padding: 10px;
    background-color: white;
    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
    cursor: pointer;
}
.sub-menu-main {
    border-right: none;
    border-top-left-radius: 5px;
    border-bottom-left-radius: 5px;
}
.sub-menu-sub {
    border-top-right-radius: 5px;
    border-bottom-right-radius: 5px;
}
.main-menu-title,
.sub-menu-title {
    padding: 10px;
}
#main-menu-list,
#sub-menu-list {
    position: absolute;
    top: 100%;
    left: 0;
    width: 100%;
    padding: 10px;
    background-color: white;
    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
    list-style-type: none;
    display: none;
    opacity: 0;
    transition: opacity 0.3s ease, transform 0.3s ease;
    transform: translateY(-10px);
}
#main-menu-list {
    border-bottom-left-radius: 5px;
}
#sub-menu-list {
    border-bottom-right-radius: 5px;
}
#main-menu-list li,
#sub-menu-list li {
    padding: 5px;
}
.sub-menu-main:hover #main-menu-list,
.sub-menu-sub:hover #sub-menu-list,
.sub-menu-main:focus-within #main-menu-list,
.sub-menu-sub:focus-within #sub-menu-list {
    display: block;
    opacity: 1;
    transform: translateY(0);
}

JavaScript

document.addEventListener('DOMContentLoaded', () => {
    const mainMenuTitle = document.getElementById('main-menu-title');
    const mainMenuList = document.getElementById('main-menu-list');
    const subMenuTitle = document.getElementById('sub-menu-title');
    const subMenuList = document.getElementById('sub-menu-list');
    const subMenuSubContainer = document.getElementById('sub-menu-sub');
    const menuData = {
        "회사소개": {
            "인사말": "#",
            "조직도": "#"
        },
        "서비스": {
            "서비스 1": "#",
            "서비스 2": "#"
        },
        "개발": {
            "개발 1": "#",
            "개발 2": "#",
            "개발 3": "#"
        },
        "문의": {
            "": "#"
        }
    };
    mainMenuTitle.addEventListener('click', () => {
        mainMenuList.classList.toggle('show');
    });
    mainMenuList.addEventListener('click', (event) => {
        if (event.target.tagName === 'LI') {
            const selectedMain = event.target.dataset.value;
            mainMenuTitle.innerText = selectedMain;
            loadSubMenuOptions(selectedMain);
            const firstSubMenu = Object.keys(menuData[selectedMain])[0] || null;
            if (firstSubMenu) {
                subMenuTitle.innerText = firstSubMenu;
                window.location.href = menuData[selectedMain][firstSubMenu];
            } else {
                loadContent(selectedMain, null);
                window.location.href = menuData[selectedMain][""];
            }
            mainMenuList.classList.remove('show');
        }
    });
    subMenuTitle.addEventListener('click', () => {
        subMenuList.classList.toggle('show');
    });
    subMenuList.addEventListener('click', (event) => {
        if (event.target.tagName === 'LI') {
            const selectedMain = mainMenuTitle.innerText;
            const selectedSub = event.target.dataset.value;
            subMenuTitle.innerText = selectedSub;
            window.location.href =...