유튜브 '드림코딩'님의 무료 강의 중 반응형 헤더를 따라 만들어 보았다.
1년도 더 전에 만들어보았던 아주 간단한 예제이지만 기록을 위해 남겨두고자 한다.
 
드림코딩 엘리님은 egoing의 생활코딩님 만큼이나 개인적으로 감사한 분이다.
타지에서 독학으로 웹개발을 공부하고 있는 나로서는 인터넷으로 자료를 찾아보는 게 전부였던지라 이 두 분이 아니었다면 웹개발에 대한 기초만 배우다가 포기했을 것이다.


코드 내용은 매우 매우 심플하다.

  • HTML에는 <body> 태그 안에 <nav> 태그 하나뿐
  • CSS에는 hover 효과와 반응형 효과를 주었다.
  • JS에는 미디어 쿼리가 활성화되었을 때 생기는 버튼을 클릭 시 아래 메뉴들이 토글링되는 효과를 주었다.

메인 화면
미디어 쿼리 (메뉴 비활성화)
미디어 쿼리 (메뉴 활성화)


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <link rel="stylesheet" href="style.css">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://kit.fontawesome.com/ed026db0da.js" crossorigin="anonymous"></script>
    <title>Document</title>
</head>
<body>
    <!-- navbar -->
    <nav id="navbar">
        <div class="nav_title">
            <h1><i class="fa-solid fa-paw"><span>RyanCoding</span></i></h1>
        </div>
        <ul class="nav_menu">
            <li class="nav_menu_items">Home</li>
            <li class="nav_menu_items">Gallery</li>
            <li class="nav_menu_items">Weddings</li>
            <li class="nav_menu_items">FAQ</li>
            <li class="nav_menu_items">Bookings</li>
        </ul>
        <ul class="nav_links">
            <li class="nav_links_items"><i class="fa-brands fa-twitter"></i></li>
            <li class="nav_links_items"><i class="fa-brands fa-facebook"></i></li>
        </ul>
        <button class="toggle_btn"><i class="fa-solid fa-bars"></i></button>
    </nav>
    <!-- toggle button -->
    

    <script src="main.js"></script>
</body>
</html>

HTML 코드
 
폰트어썸에서 사용가능한 간단한 아이콘들을 활용했다.
(지금 보니 토글버튼 주석이 이상한 곳에 가있다...)


/* reset */
@import url(reset.css);
/* fonts */

@font-face {
    font-family: 'TheJamsil5Bold';
    font-weight: 400;
    font-style: normal;
}

:root {
    --color-1 : rgba(53, 191, 177, 1);
    --color-2 : rgba(2, 140, 115, 1);
    --color-3 : rgba(2, 114, 94, 1);
    --color-4 :rgba(1, 63, 52, 1);
    --color-5 : rgba(12, 12, 12, 1);

 
    --font-weight-bold : 700;
    --font-weight-semi-bold : 500;
    --font-weight-light : 300;
 
    --border-radius : 8px;
 
    --animation-duration : 300ms;
 
    --cursor-pointer : pointer;
  }

html {
    font-size : 16px;
}

body {
    background-color: var(--color-3);
    font-family: 'TheJamsil5Bold';
}

#navbar {
    position: relative;
    background-color: var(--color-5);
    color: var(--color-3);
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 1.5rem 1rem;
}

.nav_title {
    cursor: var(--cursor-pointer);
    transition: var(--animation-duration) all;
}

.nav_title:hover {
    color: var(--color-1);
}

.nav_title h1 {
    font-size : 1.5rem
}

.nav_title h1 span {
    margin-left: 1rem;
}

.nav_menu, .nav_links {
    display: flex;
    align-items: center;
}

.nav_menu_items, .nav_links_items {
    display: block;
    padding: .5rem;
    margin: .25rem;
    font-weight: 700;
    cursor: var(--cursor-pointer);
    transition: var(--animation-duration) all;
}

.nav_links_items {
    font-size: 1.25rem;
}

.nav_menu_items:hover, .nav_links_items:hover {
    color: var(--color-1);
    transform: scale(1.05);
}

.nav_menu.show, .nav_links.show {
    display: flex;
}

.toggle_btn {
    display: none;
    position: absolute;
    right: 2.5%;
    border: none;
    outline: none;
    padding: .5rem;
    background-color: transparent;
    color: var(--color-3);
    cursor: var(--cursor-pointer);
    font-size: 1.5rem;
    transition: var(--animation-duration) all;
}

.toggle_btn:hover {
    color: var(--color-1);
    transform: scale(1.05);
}

@media screen and (max-width:768px) {
    html {
        font-size: 12px;
    }
    #navbar {
        flex-direction: column;
    }
    .nav_menu {
        display: none;
        margin: 2rem;
        width: 100%;
        flex-direction: column;
    }
    .nav_menu_items {
        width: 100%;
        text-align: center;
        margin: .5rem;
    }
    .nav_links {
        display: none;
    }
    .toggle_btn {
        display: block;
        top: 1rem;
    }
}

CSS 코드
 
reset.css로 모든 스타일을 초기화한 후 '눈누'라는 사이트에서 폰트를 받아썼다.
:root(가상선택자)를 사용할 정도의 긴 코드도 아니었지만 개인적으로 너무 편해서 그냥 사용했다.


const toggleBtn = document.querySelector('.toggle_btn');
const navMenu = document.querySelector('.nav_menu');
const navLinks = document.querySelector('.nav_links');

toggleBtn.addEventListener('click', () => {
    navMenu.classList.toggle('show');
    navLinks.classList.toggle('show');
})

JS 코드
 
딱 여섯 줄이다. 
필요한 요소를 변수로 지정하고, 버튼에 이벤트를 추가해 나머지 요소들을 토글링 하는 기능을 담고 있다.


https://github.com/mediumryan/navbar