Drop Down Menu
1. Drop Down Menu
화면 상단 네비게이션으로 자주 사용되는 방법입니다. 상단 메뉴 영역에 마우스가 호버(hover)되면 아래로 하위 메뉴들이 나타납니다.
1.1. HTML 코드
.menus클래스를 지닌 블록은 메뉴 영역입니다..sub-menus클래스를 지닌 블록은 하위 메뉴 영역입니다.
<div class="wrap">
<div class="menus">
<li class="menus__item"><a href="#">menu1</a></li>
<li class="menus__item"><a href="#">menu2</a></li>
<li class="menus__item"><a href="#">menu3</a></li>
<li class="menus__item"><a href="#">menu4</a></li>
</div>
<div class="sub-menus">
<ul class="sub-menus__items">
<li class="sub-menus__item"><a href="#">sub menu 1-1</a></li>
<li class="sub-menus__item"><a href="#">sub menu 1-2</a></li>
<li class="sub-menus__item"><a href="#">sub menu 1-3</a></li>
<li class="sub-menus__item"><a href="#">sub menu 1-4</a></li>
<li class="sub-menus__item"><a href="#">sub menu 1-5</a></li>
</ul>
<ul class="sub-menus__items">
<li class="sub-menus__item"><a href="#">sub menu 2-1</a></li>
<li class="sub-menus__item"><a href="#">sub menu 2-2</a></li>
<li class="sub-menus__item"><a href="#">sub menu 2-3</a></li>
<li class="sub-menus__item"><a href="#">sub menu 2-4</a></li>
</ul>
<ul class="sub-menus__items">
<li class="sub-menus__item"><a href="#">sub menu 3-1</a></li>
<li class="sub-menus__item"><a href="#">sub menu 3-2</a></li>
<li class="sub-menus__item"><a href="#">sub menu 3-3</a></li>
</ul>
<ul class="sub-menus__items">
<li class="sub-menus__item"><a href="#">sub menu 4-1</a></li>
<li class="sub-menus__item"><a href="#">sub menu 4-2</a></li>
<li class="sub-menus__item"><a href="#">sub menu 4-3</a></li>
<li class="sub-menus__item"><a href="#">sub menu 4-4</a></li>
<li class="sub-menus__item"><a href="#">sub menu 4-4</a></li>
</ul>
</div>
<div class="content">
<p>content</p>
</div>
</div>
1.2. CSS 코드
- 영역 표시나 크기를 설정한 속성들에 대한 설명은 제외하였습니다.
- 설명에 대한 내용은 가독성을 높이기 위해 주석에 작성하였습니다.
a {
color: #000000;
text-decoration: none;
}
ul,
li {
margin: 0;
padding: 0;
list-style: none;
}
.wrap {
position: relative;
width: 100%;
border: 1px solid;
}
.menus {
padding-right: 3rem;
height: 2rem;
background-color: rgba(0, 0, 0, 0.5);
/* 메뉴를 오른쪽으로 정렬합니다. */
display: flex;
justify-content: right;
align-items: center;
gap: 3rem;
}
.menus .menus__item {
/* 각 메뉴 별 width를 지정합니다. */
width: 3rem;
}
.menus a {
color: white;
font-size: 1rem;
}
.menus a:hover {
color: aqua;
}
.sub-menus {
width: 100%;
/* 컨텐츠 위에 하위 메뉴가 오버레이 될 수 있도록 absolute 값을 지정합니다. */
position: absolute;
/* 메뉴의 높이만큼 하위 메뉴 위치를 조정합니다. */
top: 2rem;
z-index: 1;
background-color: rgba(0, 0, 0, 0.3);
/* 최초 화면에는 보이지 않도록 none 처리합니다. */
display: none;
justify-content: right;
/* 메뉴와 동일한 정렬 방법과 갭(gap)을 지정합니다. */
gap: 3rem;
}
.sub-menus .sub-menus__items {
/* 메뉴와 동일한 width 값을 갖도록 지정합니다. */
width: 3rem;
/* 하위 메뉴 길이가 긴 경우에도 하단으로 내려가지 않도록 nowrap 값을 지정합니다. */
white-space: nowrap;
}
.sub-menus .sub-menus__items:last-child {
padding-right: 3rem;
}
.sub-menus .sub-menus__items .sub-menus__item {
margin-top: 0.5rem;
}
/* sub-menus 클래스에 on 클래스가 추가되거나, hover 상태인 경우에 flex 블록을 유지합니다. */
.sub-menus.on,
.sub-menus:hover {
display: flex;
}
.sub-menus a {
color: white;
font-size: 0.8rem;
}
.sub-menus a:hover {
color: blue;
}
.content {
width: 100%;
height: 20rem;
background-color: #ccaacc;
}
.content > p {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: white;
font-size: 1.5rem;
text-align: center;
}
1.3. JavaScript 코드
.menus__item클래스를 지닌 DOM 객체들을 찾아서mouseover,mouseout이벤트를 지정합니다.mouseover이벤트.sub-menus클래스를 지닌 블록에.on클래스를 추가합니다.
mouseout이벤트.sub-menus클래스를 지닌 블록에.on클래스를 제거합니다.
const menusItems = document.querySelectorAll(".menus__item");
menusItems.forEach((menu) => {
menu.addEventListener("mouseover", () => {
const subMenus = document.querySelector(".sub-menus");
subMenus.classList.add("on");
});
menu.addEventListener("mouseout", () => {
const subMenus = document.querySelector(".sub-menus");
subMenus.classList.remove("on");
});
});
2. 결과
See the Pen Drop Down Menu by Junhyunny (@Junhyunny) on CodePen.
댓글남기기