웹/(React)리액트
(React) 리액트 드롭다운 메뉴 만들기/마우스 오버시 드롭다운 - 1탄
공부가싫다가도좋아
2022. 12. 17. 02:09
반응형
<포스팅 요약>
1. 결과화면
2. 동작 설명/기능 설명
1) 마우스오버시, 세부메뉴 드롭 다운
2) 해당하는 카테고리에 마우스가 오버됐을시, 다크블루로 표시.
(예: 메뉴1에 오버했을 시, 메뉴 1 배경색깔이 바뀜)
3) 세부 카테고리에 마우스 오버됐을시, 해당하는 카테고리 및 세부카테고리 표시.
(예: 메뉴2-1에 오버했을 시, 메뉴 2와 메뉴2-1의 배경색깔이 바뀜)
3. 코드
src / App.js
import React from "react";
import Category from "./Category";
import Contents from "./Contents";
const App = () => {
return (
<>
<Category />
<Contents />
</>
);
};
export default App;
src / Category.js
import React, { useState } from "react";
import style from "./style/style.css";
const Category = () => {
const menuLst = ["menu1", "menu2", "menu3", "menu4", "menu5"];
const [hide, setHide] = useState({
menu1: false,
menu2: false,
menu3: false,
menu4: false,
menu5: false,
});
const mouseEvent = (menuName, bool) => {
const change = { ...hide };
change[menuName] = bool;
setHide(change);
};
return (
<nav className="nav">
<ul className="navContainer">
{menuLst.map((v, idx) => (
<li
className={hide[v] ? "active" : "none"}
onMouseEnter={() => mouseEvent(v, true)}
onMouseLeave={() => mouseEvent(v, false)}
>
<p>{`메뉴${idx + 1}`}</p>
</li>
))}
</ul>
<div className="detailMenu">
{menuLst.map((v, idx) => (
<ul
onMouseEnter={() => mouseEvent(v, true)}
onMouseLeave={() => mouseEvent(v, false)}
>
<li>{`메뉴${idx + 1}-${1}`}</li>
<li>{`메뉴${idx + 1}-${2}`}</li>
<li>{`메뉴${idx + 1}-${3}`}</li>
<li>{`메뉴${idx + 1}-${4}`}</li>
</ul>
))}
</div>
</nav>
);
};
export default Category;
src / Contents.js
import React from "react";
import style from "./style/style.css";
const Contents = () => {
return <div className="contents">메인 페이지 내용.</div>;
};
export default Contents;
src / style / style.css
.contents {
width: 100%;
height: 1000px;
background-color: blanchedalmond;
}
.nav {
height: 80px;
overflow: hidden;
transition: 0.25s ease-in-out;
}
.nav:hover {
height: 200px;
cursor: pointer;
}
.nav .navContainer {
height: 80px;
display: flex;
margin: auto;
justify-content: space-around;
align-items: center;
padding: 0;
}
.nav .navContainer .active {
background-color: rgb(3, 51, 90);
color: white;
}
.nav .navContainer .none {
background-color: none;
}
.nav .navContainer li {
width: 200px;
height: 100%;
list-style-type: none;
font-size: 19px;
color: rgb(3, 51, 90);
font-weight: 600;
display: flex;
align-items: center;
justify-content: center;
}
.nav .navContainer li p {
margin: 0;
}
.nav .detailMenu {
display: flex;
overflow: hidden;
}
.nav .detailMenu ul {
width: 200px;
margin: auto;
justify-content: space-around;
padding: 0;
}
.nav .detailMenu ul li {
text-align: center;
list-style-type: none;
margin-bottom: 10px;
color: rgb(7, 7, 105);
font-weight: 600;
}
.nav .detailMenu ul li:hover {
cursor: pointer;
background-color: rgb(198, 198, 241);
}
4. 코드 설명
**일단, 메뉴1,메뉴2,메뉴3... 등을 "대메뉴"라고 칭하겠습니다.
메뉴 아래의 세부메뉴들은 "소메뉴"라 칭하겠습니다.
1) hide객체 사용 이유
> Category.js에서는 hide라는 객체를 사용합니다.
hide 객체에는 소메뉴에 마우스오버시, 소메뉴가 해당하는 대메뉴의 배경색을 바꿔주기 위해 사용되는 객체입니다.
2) mouseEnter과 mouseLeave 함수
> mouseEnter 함수를 사용하여, 마우스 오버시, hide객체에서 해당하는 값을 true로 바꿔줍니다.
>mouseLeave함수사용하여, 마우스가 해당 요소를 벗어났을 시, hide객체에서 해당하는 값을 false로 바꿔줍니다.
3) css에서 중요한 코드1 - 메뉴 드롭다운 동작
.nav {
height: 80px;
overflow: hidden;
transition: 0.25s ease-in-out;
}
.nav:hover {
height: 200px;
cursor: pointer;
}
대메뉴에 마우스 오버시 세부 메뉴들을 보여줍니다.
대메뉴에 마우스 아웃을 할 경우 세부메뉴를 닫아줍니다.
반응형