깃허브: https://github.com/wusi-hub/Responsive-Header
구현할 반응형 헤더
웹 사이트를 구현하기 전에 레이아웃 구조를 먼저 생각한다.
<!DOCTYPE>
선언하기defer
이라는 키위드 입력<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Apple</title>
<script
src="https://kit.fontawesome.com/6478f529f2.js"
crossorigin="anonymous"
></script>
<script src="main.js" defer></script>
<link rel="stylesheet" href=styles.css />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Roboto:wght@500&display=swap"
rel="stylesheet"
/>
</head>
<body>
<nav class="navbar">
<div class="navbar__logo">
</div>
<ul class="navbar__menu">
</ul>
<ul class="navbar__icons">
</ul>
</nav>
</body>
<head>
안에 붙여넣기 한다.<navbar>
에 삽입한다.<a>
태그를 이용한다.<ul class="navbar__menu">
의 경우 (li>a)*5
라는 Emmet을 이용하여 한번에 입력할 수 있다.<ul>
을 쓴 경우 <li>
와 함께 쓴다.<body>
<nav class="navbar">
<div class="navbar__logo">
<i class="fab fa-apple"></i>
<a href="#">Apple</a>
</div>
<ul class="navbar__menu">
<li><a href="#">스토어</a></li>
<li><a href="#">Mac</a></li>
<li><a href="#">iPad</a></li>
<li><a href="#">iPhone</a></li>
<li><a href="#">고객지원</a></li>
</ul>
<ul class="navbar__icons">
<li><i class="fab fa-facebook-f"></i></li>
<li><i class="fab fa-twitter"></i></li>
</ul>
</nav>
</body>
:root
라는 CSS 변수를 통해 색상값 정의:root {
--text-color: aliceblue;
--background-color: slategrey;
--accent-color: cadetblue;
}
body {
margin: 0;
font-family: "Roboto", sans-serif;
}
<a>
tag에 기본 적으로 들어가는 text-decoration을 없애주고 색상 또한 변경<:root>
에 정의한 폰트 색 입력a {
text-decoration: none;
color: var(--text-color);
}
<:root>
에 정의한 폰트 색 입력.navbar {
display: flex;
justify-content: space-between;
align-items: center;
background-color: var(--background-color);
padding: 8px 12px;
}
font-size
로 사이즈 조절<:root>
에 정의한 폰트 색 입력.navbar__logo {
font-size: 24px;
color: var(--text-color);
}
display: flex
를 이용해서 세로로 나열된 메뉴 아이템들을 가로로 변경list-style: none
을 통해 점 모양을 없앤다.padding-left: 0;
을 통해 padding 값을 없앤다..navbar__menu {
display: flex;
list-style: none;
padding-left: 0;
}
.navbar__menu li {
padding: 8px 25px;
font-size: 19px;
}
<:root>
에 정의한 폰트 색이 나타난다..navbar__menu li:hover {
background-color: var(--accent-color);
border-radius: 5px;
}
<:root>
에 정의한 폰트 색 입력padding-left
를 0
으로 설정.navbar__icons {
display: flex;
list-style: none;
color: var(--text-color);
padding-left: 0;
}
.navbar__icons li {
padding: 8px 12px;
}
레이아웃을 반응형으로 만들 때는 미디어 쿼리를 이용한다.
스크린의 크기가 768px일 때 아이템들을 아래로 새롭게 레이아웃을 만든다.
그렇게 하기 위해서 제일 상위에 있는 컨테이너인 .navbar
와 .navbar__menu
의 flex-direction
을 column
으로 바꾼다.
로고의 정렬을 왼쪽으로 하기 위해 .navbar
의 align-items
를 flex-star
로 바꾼다.
메뉴의 정렬은 가운데로 하기 위해 .navbar__menu
의 width
를 100%
로 바꾸고 align-items
를 center
로 한다.
메뉴 아이템들의 하이라이팅을 전체 크기로 바꾸기 위해 .navbar__menu li
의 width
를 100%
로 설정한다.
왼쪽으로 정렬된 아이템들을 다시 가운데로 오게 하기 위해서 text-align
을 center
를 사용해야 한다.
navbar__icons
의 Flexbox의 방향은 row이기 때문에 가운데 정렬을 할 때 justify-content: center
를 이용하면 된다.
너비가 100%가 아니기 때문에 width: 100%
를 통해 너비 100%를 준다.
토글 버튼이 Max 768px일 때만 나오게 하기
메뉴와 아이콘들이 미디어 쿼리가 아닐 때는 display: none
으로 설정
@media screen and (max-width: 768px) {
.navbar {
flex-direction: column;
align-items: flex-start;
padding: 8px 24px;
}
.navbar__menu {
display: none;
flex-direction: column;
align-items: center;
width: 100%;
}
.navbar__menu li {
width: 100%;
text-align: center;
}
.navbar__icons {
display: none;
justify-content: center;
width: 100%;
}
.navbar__toggleBtn {
display: block;
}
<a href="#" class="navbar__toggleBtn"></a>
<a href="#" class="navbar__toggleBtn">
<i class="fas fa-bars"></i>
</a>
position: absolute
를 이용해 왼쪽 끝에 배치시킨다.<:root>
에 정의한 폰트 색 입력display: none;
을 통해 화면이 작아졌을 때만 나오게 설정.navbar__toggleBtn {
display: none;
position: absolute;
right: 32px;
font-size: 24px;
color: var(--text-color);
}
toggleBtn
이라는 변수에 document.querySelector
를 이용해서 html 노드중에 클래스가 .navbar__toggleBtn
을 할당 (html 안에 있는 클래스 노드들중에 .navbar__toggleBtn
을 찾아서 toggleBtn
에 연결)menu
와 icons
들도 똑같이 연결toggleBtn
이 클릭될 때마다 addEventListener
을 통해서 클릭할 때마다 지정하고 있는 함수를 호출const toggleBtn = document.querySelector('.navbar__toggleBtn');
const menu = document.querySelector('.navbar__menu');
const icons = document.querySelector('.navbar__icons');
toggleBtn.addEventListener('click', () => {
menu.classList.toggle('active');
icons.classList.toggle('active');
});