Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Netflix
- Nomad coder
- expo
- javascript
- 클론코딩
- Project
- scflix
- Vanilla
- 느낀 점
- Hook
- TiMER
- coding
- 마무리
- 바닐라 자바스크립트
- 자바스크립트
- Nicolas
- react-hook
- 계획
- Firebase
- react
- HTML
- CSS
- 프로젝트
- Clone
- react-native
- vanilla js
- 코코아톡
- Nomad
- github
- 오류
Archives
- Today
- Total
꾸매코딩
[Vanilla JS] Menu 만들기 본문
반응형
HTML 태그를 나누고 배열하는데 여러 번 헤매었던 것 같다.
상단 메뉴만 만드는 것은 생각보다 쉬웠는데, 메뉴 안에 하위 메뉴를 출력하려하니 HTML 코드가 이상하게 되어있는 것 같아서 코드를 여러 번 수정했다.
[ HTML ]
<div class="wrapper">
<div class="navbar">
<ul>
<li>
<a href="#" class="content">
<div class="wrap">
<span class="icon"><i class="fas fa-home"></i></span>
<span class="text">Home</span>
</div>
</a>
</li>
<li>
<a href="#" class="content">
<div class="wrap">
<span class="icon"><i class="fas fa-volleyball-ball"></i></span>
<span class="text">Sports</span>
</div>
</a>
<div class="sub-menu">
<ul>
<li>
<a href="#" class="sub-menu__content">
<div class="wrap">
<span class="icon"><i class="fas fa-home"></i></span>
<span class="text">Home</span>
</div>
</a>
</li>
<li>
<a href="#" class="sub-menu__content">
<div class="wrap">
<span class="icon"
><i class="fas fa-volleyball-ball"></i
></span>
<span class="text">Sports</span>
</div>
</a>
</li>
<li>
<a href="#" class="sub-menu__content">
<div class="wrap">
<span class="icon"><i class="fas fa-utensils"></i></span>
<span class="text">Food</span>
</div>
</a>
</li>
<li>
<a href="#" class="sub-menu__content">
<div class="wrap">
<span class="icon"
><i class="fas fa-paper-plane"></i
></span>
<span class="text">Items</span>
</div>
</a>
</li>
<li>
<a href="#" class="sub-menu__content">
<div class="wrap">
<span class="icon"><i class="fas fa-cog"></i></span>
<span class="text">Setting</span>
</div>
</a>
</li>
</ul>
</div>
</li>
<li>
<a href="#" class="content">
<div class="wrap">
<span class="icon"><i class="fas fa-utensils"></i></span>
<span class="text">Food</span>
</div>
</a>
<div class="sub-menu">
<ul>
<li>
<a href="#" class="sub-menu__content">
<div class="wrap">
<span class="icon"><i class="fas fa-home"></i></span>
<span class="text">Home</span>
</div>
</a>
</li>
<li>
<a href="#" class="sub-menu__content">
<div class="wrap">
<span class="icon"
><i class="fas fa-volleyball-ball"></i
></span>
<span class="text">Sports</span>
</div>
</a>
</li>
<li>
<a href="#" class="sub-menu__content">
<div class="wrap">
<span class="icon"><i class="fas fa-utensils"></i></span>
<span class="text">Food</span>
</div>
</a>
</li>
<li>
<a href="#" class="sub-menu__content">
<div class="wrap">
<span class="icon"
><i class="fas fa-paper-plane"></i
></span>
<span class="text">Items</span>
</div>
</a>
</li>
<li>
<a href="#" class="sub-menu__content">
<div class="wrap">
<span class="icon"><i class="fas fa-cog"></i></span>
<span class="text">Setting</span>
</div>
</a>
</li>
</ul>
</div>
</li>
<li>
<a href="#" class="content">
<div class="wrap">
<span class="icon"><i class="fas fa-paper-plane"></i></span>
<span class="text">Items</span>
</div>
</a>
</li>
<li>
<a href="#" class="content">
<div class="wrap">
<span class="icon"><i class="fas fa-cog"></i></span>
<span class="text">Setting</span>
</div>
</a>
</li>
</ul>
</div>
</div>
HTML에서 사용된 icon은 Font Awsome에서 받아왔다.
[ CSS ]
* {
padding: 0;
margin: 0;
box-sizing: border-box;
list-style: none;
text-decoration: none;
}
.wrapper {
width: 100%;
background-color: #0a3d62;
display: flex;
justify-content: center;
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
}
.navbar {
width: 80%;
}
.navbar > ul {
display: flex;
justify-content: space-around;
align-items: center;
height: 60px;
}
.navbar ul li {
position: relative;
}
.navbar ul li a {
display: block;
color: #fff;
letter-spacing: 0.2rem;
text-transform: uppercase;
width: 180px;
height: 60px;
text-align: center;
padding: 20px;
}
.navbar .sub-menu {
opacity: 0;
}
.wrap {
color: white;
}
.sub-menu {
position: absolute;
top: 60px;
left: 0px;
width: 80px;
}
.sub-menu__content {
background-color: #0a3d62;
}
.active {
font-size: 18px;
transition: all 0.5s ease-in-out;
}
.navbar ul li a:hover,
.navbar ul li a:active,
.navbar .sub-menu ul li a:hover,
.navbar .sub-menu ul li a:active {
background-color: #1e3799;
}
.navbar ul li a.content.active + .sub-menu {
opacity: 1;
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
transition: all 0.5s ease-in-out;
}
[ JavaScript ]
const content = document.querySelectorAll('.content');
const subContent = document.querySelectorAll('.sub-menu__content')
const ACTIVE = "active"
content.forEach(function(contents){
contents.addEventListener("click",function(){
subContent.forEach(function(subContents){
subContents.classList.remove(ACTIVE);
})
content.forEach(function(contents){
contents.classList.remove(ACTIVE);
});
contents.classList.add(ACTIVE);
})
contents.classList.remove(ACTIVE);
})
subContent.forEach(function(subContents){
subContents.addEventListener("click",function(){
subContent.forEach(function(subContents){
subContents.classList.remove(ACTIVE);
})
subContents.classList.add(ACTIVE);
})
})
[ 결과 ]
See the Pen VanillaJs-Menu by 신성철 (@pugoxjbx-the-animator) on CodePen.
반응형