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 =...