ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • position, flexbox 를 활용한 웹페이지 기본 디자인
    프론트엔드/HTML & CSS 강의 2024. 2. 13. 14:28
    728x90

    실습을 위한 준비를 한다. 

    <!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>플럭스박스</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>헤더</header>
        <main>메인</main>
        <footer>푸터</footer>
    </body>
    </html>
    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }

    header, main, footer 로 분리하고 화면의 기본적인 스타일을 작성한다.

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }

     헤더, 메인, 푸터를 감싸고 있는 전체 컨테이너의 높이를 브라우저 화면 높이로 설정한다. 또한, 컨테이너에 플럭스박스를 적용하고, flex-direction: column 을 지정하여 메인축 방향을 세로방향으로 정한다. 헤더, 메인, 푸터는 세로방향으로 정렬이 되어야 하기 때문이다.

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        background: brown;
    }

    헤더, 푸터의 높이를 고정폭으로 설정한다. 또한, 메인 컨텐츠 높이는 브라우저 전체높이에서 헤더, 푸터를 제외한 나머지를 다 차지하도록 flex:1 로 설정한다.

    웹화면 기본 뼈대구조 만들기

     

    * 헤더영역 디자인하기

    <header>
            <a href="#">
                <img src="logo.avif" alt="logo">
                sunblocks
            </a>
            <nav>
                <ul>
                    <li><a href="#">home</a></li>
                    <li><a href="#">about</a></li>
                    <li><a href="#">contact</a></li>
                </ul>
            </nav>
        </header>

    헤더부분을 위와 같이 작성한다. 로고 이미지는 아무거나 다운로드 받아서 사용하면 된다.

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        background: brown;
    }
    header img{
        width: 50px;
        height: 50px;
    }

    우선 로고 이미지가 너무 크기 때문에 너비, 높이를 헤더 안에 들어오도록 맞춰준다.

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        background: brown;
    }
    header img{
        width: 50px;
        height: 50px;
    }
    header{
        display: flex;
        justify-content: space-between;
    }

    로고와 네비게이션 메뉴가 수평으로 나열되도록 헤더에 플럭스박스를 적용한다. 또한, 로고와 네비게이션 메뉴는 각각 웹화면의 좌측과 우측에 배치되도록 justify-content: space-between 을 적용한다. 

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        background: brown;
    }
    header img{
        width: 50px;
        height: 50px;
    }
    header{
        display: flex;
        justify-content: space-between;
    }
    header nav ul{
        display: flex;
        gap: 3rem;
        list-style: none;
        margin-right: 2rem;
    }

    네비게이션 메뉴도 수평으로 나열되도록 플럭스박스를 적용하고, 각 메뉴 사이에 여백을 주기 위하에 gap 속성을 적용한다. 네비게이션 우측에 마진을 설정해서 네비게이션 메뉴가 너무 화면 우측에 붙어있지 않도록 한다.

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        background: brown;
    }
    header img{
        width: 50px;
        height: 50px;
    }
    header{
        display: flex;
        justify-content: space-between;
        align-items: center; /* 추가 */
    }
    header nav ul{
        display: flex;
        gap: 3rem;
        list-style: none;
        margin-right: 2rem;
    }

    헤더에 align-items: center 를 적용하여 헤더 안의 아이템들이 교차축(세로) 방향으로 중앙에 정렬되도록 한다.

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        background: brown;
    }
    header img{
        width: 50px;
        height: 50px;
    }
    header{
        display: flex;
        justify-content: space-between;
        align-items: center; /* 추가 */
    }
    header nav ul{
        display: flex;
        gap: 3rem;
        list-style: none;
        margin-right: 2rem;
    }
    a{
        text-decoration: none;
        color: #333;
        font-weight: bold;
    }

    링크에는 밑줄을 전부 제거한다. 그리고 웹화면의 모든 링크의 색상을 동일하게 지정한다.

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        background: brown;
    }
    header img{
        width: 50px;
        height: 50px;
    }
    header{
        display: flex;
        justify-content: space-between;
        align-items: center; /* 추가 */
    }
    header nav ul{
        display: flex;
        gap: 3rem;
        list-style: none;
        margin-right: 2rem;
    }
    a{
        text-decoration: none;
        color: #333;
        font-weight: bold;
    }
    header a{
        display: flex;
        align-items: center;
    }

    헤더 안의 로고가 들어가는 링크에도 플럭스박스를 적용하여 로고 텍스트가 세로방향으로 중앙에 위치하도록 정렬한다.

    헤더 스타일링하기

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        background: brown;
    }
    header img{
        width: 50px;
        height: 50px;
    }
    header{
        display: flex;
        justify-content: space-between;
        align-items: center; 
    }
    header nav ul{
        display: flex;
        gap: 3rem;
        list-style: none;
        margin-right: 2rem;
    }
    a{
        text-decoration: none;
        color: #333;
        font-weight: bold;
    }
    header a{
        display: flex;
        align-items: center;
        transition: .3s;
    }
    header a:hover{
        color: brown;
    }

    헤더의 모든 링크에 마우스 호버시 글자색을 변경한다.

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        background: brown;
    }
    header img{
        width: 50px;
        height: 50px;
    }
    header{
        display: flex;
        justify-content: space-between;
        align-items: center; 
    }
    header nav ul{
        display: flex;
        gap: 3rem;
        list-style: none;
        margin-right: 2rem;
    }
    a{
        text-decoration: none;
        color: #333;
        font-weight: bold;
    }
    header a{
        display: flex;
        align-items: center;
        transition: .3s;
    }
    header a:hover{
        color: brown;
    }
    header nav ul li{
        position: relative;
    }
    header nav ul li::before{
        position: absolute; bottom: -5px; 
        content: '';
        width: 0; height: 5px;
        border-radius: 10px; 
        background: brown;
        transition: .3s;
    }
    header nav ul li:hover::before{
        width: 100%;
    }

    네비게이션 메뉴에 마우스 호버시 밑줄이 보이도록 호버 효과를 적용한다. 

    <nav>
        <ul>
            <li>
                <a href="#">home</a>
                <ul>
                    <li><a href="#">sub1sub1sub1</a></li>
                    <li><a href="#">sub2</a></li>
                    <li><a href="#">sub3</a></li>
                </ul>
            </li>
            <li>
                <a href="#">about</a>
                <ul>
                    <li><a href="#">sub1</a></li>
                    <li><a href="#">sub2</a></li>
                    <li><a href="#">sub3</a></li>
                    <li><a href="#">sub4</a></li>
                    <li><a href="#">sub5</a></li>
                    <li><a href="#">sub6</a></li>
                </ul>
            </li>
            <li><a href="#">contact</a></li>
        </ul>
    </nav>

    네비게이션에 서브메뉴를 추가한다.

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        background: brown;
    }
    header img{
        width: 50px;
        height: 50px;
    }
    header{
        display: flex;
        justify-content: space-between;
        align-items: center; 
    }
    header > nav > ul{
        display: flex;
        gap: 3rem;
        list-style: none;
        margin-right: 2rem;
    }
    a{
        text-decoration: none;
        color: #333;
        font-weight: bold;
    }
    header > a{
        display: flex;
        align-items: center;
        transition: .3s;
    }
    header > a:hover{
        color: brown;
    }
    header > nav > ul > li{
        position: relative;
    }
    header > nav > ul > li::before{
        position: absolute; bottom: -5px; 
        content: '';
        width: 0; height: 5px;
        border-radius: 10px; 
        background: brown;
        transition: .3s;
    }
    header > nav > ul > li:hover::before{
        width: 100%;
    }
    header > nav > ul > li > ul{
        display: none;
    }

    서브메뉴에는 마우스 호버시 밑줄이 나타나지 않도록 하고, 메인 메뉴에만 적용될 수 있도록 자식선택자(>)로 전부 변경한다. 또한, 서브메뉴는 우선 웹화면에 보이지 않도록 가린다. 

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        background: brown;
    }
    header img{
        width: 50px;
        height: 50px;
    }
    header{
        display: flex;
        justify-content: space-between;
        align-items: center; 
    }
    header > nav > ul{
        display: flex;
        gap: 3rem;
        list-style: none;
        margin-right: 2rem;
    }
    a{
        text-decoration: none;
        color: #333;
        font-weight: bold;
    }
    header > a{
        display: flex;
        align-items: center;
        transition: .3s;
    }
    header > a:hover{
        color: brown;
    }
    header > nav > ul > li{
        position: relative;
    }
    header > nav > ul > li::before{
        position: absolute; bottom: -5px; 
        content: '';
        width: 0; height: 5px;
        border-radius: 10px; 
        background: brown;
        transition: .3s;
    }
    header > nav > ul > li:hover::before{
        width: 100%;
    }
    header > nav > ul > li > ul{
        display: none;
    }
    header > nav > ul > li:hover > ul{
        display: block;
    }

    그런 다음 메인메뉴에 마우스 호버시 서브메뉴가 나타나도록 display: block 을 설정한다. 하지만 실제로 해보면 서브메뉴가 나타나기는 하지만 위치가 제대로 잡히지 않고 있다. 서브메뉴는 메인메뉴 바로 아래에 나란히 위치하는게 좋다. 

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        /* background: brown; */
    }
    header img{
        width: 50px;
        height: 50px;
    }
    header{
        display: flex;
        justify-content: space-between;
        align-items: center; 
    }
    header > nav > ul{
        display: flex;
        gap: 3rem;
        list-style: none;
        margin-right: 2rem;
    }
    a{
        text-decoration: none;
        color: #333;
        font-weight: bold;
    }
    header > a{
        display: flex;
        align-items: center;
        transition: .3s;
    }
    header > a:hover{
        color: brown;
    }
    header > nav > ul > li{
        position: relative;
        display: flex; /* 추가 */
        flex-direction: column; /* 추가 */
    }
    header > nav > ul > li::before{
        position: absolute; bottom: -5px; 
        content: '';
        width: 0; height: 5px;
        border-radius: 10px; 
        background: brown;
        transition: .3s;
    }
    header > nav > ul > li:hover::before{
        width: 100%;
    }
    header > nav > ul > li > ul{
        display: none;
    }
    header > nav > ul > li:hover > ul{
        display: block;
        margin: 0; padding: 0; /* 추가 */
        list-style: none; /* 추가 */
        position: absolute; /* 추가 */
        top: 250%; width: auto; /* 추가 */
        background: brown; padding: .5rem .5rem; /* 추가 */
    }
    header > nav > ul > li > ul > li > a{
        color: #fff;
    }

    우선 메인메뉴와 서브메뉴가 현재 수평으로 나열되어 있으므로 메인메뉴에 flex-direction: column 으로 설정하여 메인메뉴와 서비메뉴를 세로방향으로 나열한다. 또한, 서브메뉴(ul)의 여백을 제거하고, 디폴트 목록 스타일도 제거한다. 서브메뉴의 위치를 잡아주기 위하여 position: absolute 로 설정하고, top을 100% 이상으로 설정해서 메인메뉴 하단에 서브메뉴가 위치하도록 끌어내린다. 

     

    * 메인영역 디자인하기

    <main>
        <section>메인컨텐츠</section>
        <aside>사이드메뉴</aside>
    </main>

    메인영역을 사이드메뉴와 메인컨텐츠 부분으로 나눈다.

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        /* background: brown; */
        display: flex; /* 추가 */
    }
    
    /* 헤더영역 */
    header img{
        width: 50px;
        height: 50px;
    }
    header{
        display: flex;
        justify-content: space-between;
        align-items: center; 
    }
    header > nav > ul{
        display: flex;
        gap: 3rem;
        list-style: none;
        margin-right: 2rem;
    }
    a{
        text-decoration: none;
        color: #333;
        font-weight: bold;
    }
    header > a{
        display: flex;
        align-items: center;
        transition: .3s;
    }
    header > a:hover{
        color: brown;
    }
    header > nav > ul > li{
        position: relative;
        display: flex; 
        flex-direction: column; 
    }
    header > nav > ul > li::before{
        position: absolute; bottom: -5px; 
        content: '';
        width: 0; height: 5px;
        border-radius: 10px; 
        background: brown;
        transition: .3s;
    }
    header > nav > ul > li:hover::before{
        width: 100%;
    }
    header > nav > ul > li > ul{
        display: none;
    }
    header > nav > ul > li:hover > ul{
        display: block;
        margin: 0; padding: 0; 
        list-style: none; 
        position: absolute; 
        top: 250%; width: auto; 
        background: brown; padding: .5rem .5rem; 
    }
    header > nav > ul > li > ul > li > a{
        color: #fff;
    }
    
    /* 메인영역 */
    main aside{
        width: 300px;
        flex: none;
        border: 1px solid red;
    }
    main section{
        flex: 1;
        border: 1px solid green;
    }

    메인영역은 사이드바 메뉴와 메인컨텐츠로 나누어지며, 수평방향으로 정렬하기 위하여 main 에 플럭스박스를 적용한다. 사이드바 메뉴는 고정폭을 지정하고, 메인컨텐츠는 flex: 1을 설정하여 디바이스 크기에 따라 너비가 변하도록 한다.

    <section>
        <div class="slider">
            <div class="slide">
                <img src="slide-1.jpg" alt="slide-1">
            </div>
            <div class="slide">
                <img src="slide-2.jpg" alt="slide-2">
            </div>
            <div class="slide">
                <img src="slide-3.jpg" alt="slide-3">
            </div>
        </div>
    </section>

    메인컨텐츠의 히어로 영역에 슬라이드 화면을 추가한다.

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        /* background: brown; */
        display: flex; /* 추가 */
    }
    
    /* 헤더영역 */
    header img{
        width: 50px;
        height: 50px;
    }
    header{
        display: flex;
        justify-content: space-between;
        align-items: center; 
    }
    header > nav > ul{
        display: flex;
        gap: 3rem;
        list-style: none;
        margin-right: 2rem;
    }
    a{
        text-decoration: none;
        color: #333;
        font-weight: bold;
    }
    header > a{
        display: flex;
        align-items: center;
        transition: .3s;
    }
    header > a:hover{
        color: brown;
    }
    header > nav > ul > li{
        position: relative;
        display: flex; 
        flex-direction: column; 
    }
    header > nav > ul > li::before{
        position: absolute; bottom: -5px; 
        content: '';
        width: 0; height: 5px;
        border-radius: 10px; 
        background: brown;
        transition: .3s;
    }
    header > nav > ul > li:hover::before{
        width: 100%;
    }
    header > nav > ul > li > ul{
        display: none;
    }
    header > nav > ul > li:hover > ul{
        display: block;
        margin: 0; padding: 0; 
        list-style: none; 
        position: absolute; 
        top: 250%; width: auto; 
        background: brown; padding: .5rem .5rem; 
    }
    header > nav > ul > li > ul > li > a{
        color: #fff;
    }
    
    /* 메인영역 */
    main aside{
        width: 300px;
        flex: none;
        border: 1px solid red;
    }
    main section{
        flex: 1;
        border: 1px solid green;
    }
    main section .slider .slide{
        width: 100%;
        height: 100%;
    }
    main section .slider img{
        width: 100%;
        height: 100%;
        object-fit: cover;
        object-position: center;
    }
    main section .slider{
        width: 50%; height: 300px;
        margin: 2rem auto;
        border: 3px solid brown;
    }

    슬라이드 영역에 대한 스타일 코드를 추가한다. 슬라이드 영역을 감싸고 있는 컨테이너의 너비와 높이를 설정하고, 위치도 지정한다. 각각의 슬라이드 이미지는 부모요소인 컨테이너에 맞춘다. 

    정렬되지 않은 슬라이드 이미지

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        /* background: brown; */
        display: flex; 
    }
    
    /* 헤더영역 */
    header img{
        width: 50px;
        height: 50px;
    }
    header{
        display: flex;
        justify-content: space-between;
        align-items: center; 
    }
    header > nav > ul{
        display: flex;
        gap: 3rem;
        list-style: none;
        margin-right: 2rem;
    }
    a{
        text-decoration: none;
        color: #333;
        font-weight: bold;
    }
    header > a{
        display: flex;
        align-items: center;
        transition: .3s;
    }
    header > a:hover{
        color: brown;
    }
    header > nav > ul > li{
        position: relative;
        display: flex; 
        flex-direction: column; 
    }
    header > nav > ul > li::before{
        position: absolute; bottom: -5px; 
        content: '';
        width: 0; height: 5px;
        border-radius: 10px; 
        background: brown;
        transition: .3s;
    }
    header > nav > ul > li:hover::before{
        width: 100%;
    }
    header > nav > ul > li > ul{
        display: none;
    }
    header > nav > ul > li:hover > ul{
        display: block;
        margin: 0; padding: 0; 
        list-style: none; 
        position: absolute; 
        top: 250%; width: auto; 
        background: brown; padding: .5rem .5rem; 
    }
    header > nav > ul > li > ul > li > a{
        color: #fff;
    }
    
    /* 메인영역 */
    main aside{
        width: 300px;
        flex: none;
        border: 1px solid red;
    }
    main section{
        flex: 1;
        border: 1px solid green;
    }
    main section .slider .slide{
        width: 100%;
        height: 100%;
    }
    main section .slider img{
        width: 100%;
        height: 100%;
        object-fit: cover;
        object-position: center;
    }
    main section .slider{
        width: 50%; height: 300px;
        margin: 2rem auto;
        border: 3px solid brown;
        display: flex; /* 추가 */
    }

    슬라이드 이미지를 담고 있는 컨테이너에 플럭스박스를 적용하면 아래와 같이 수평으로 슬라이드가 나열된다. 

    수평으로 나열된 슬라이드 이미지

    html, body{
        margin: 0; padding: 0;
        box-sizing: border-box;
    }
    body{
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    header, footer{
        height: 70px;
        flex: none;
    }
    main{
        flex: 1;
        /* background: brown; */
        display: flex; 
    }
    
    /* 헤더영역 */
    header img{
        width: 50px;
        height: 50px;
    }
    header{
        display: flex;
        justify-content: space-between;
        align-items: center; 
    }
    header > nav > ul{
        display: flex;
        gap: 3rem;
        list-style: none;
        margin-right: 2rem;
    }
    a{
        text-decoration: none;
        color: #333;
        font-weight: bold;
    }
    header > a{
        display: flex;
        align-items: center;
        transition: .3s;
    }
    header > a:hover{
        color: brown;
    }
    header > nav > ul > li{
        position: relative;
        display: flex; 
        flex-direction: column; 
    }
    header > nav > ul > li::before{
        position: absolute; bottom: -5px; 
        content: '';
        width: 0; height: 5px;
        border-radius: 10px; 
        background: brown;
        transition: .3s;
    }
    header > nav > ul > li:hover::before{
        width: 100%;
    }
    header > nav > ul > li > ul{
        display: none;
    }
    header > nav > ul > li:hover > ul{
        display: block;
        margin: 0; padding: 0; 
        list-style: none; 
        position: absolute; 
        top: 250%; width: auto; 
        background: brown; padding: .5rem .5rem; 
    }
    header > nav > ul > li > ul > li > a{
        color: #fff;
    }
    
    /* 메인영역 */
    main aside{
        width: 300px;
        flex: none;
        border: 1px solid red;
    }
    main section{
        flex: 1;
        border: 1px solid green;
    }
    main section .slider .slide{
        width: 100%;
        height: 100%;
        flex: none; /* 추가 */
    }
    main section .slider img{
        width: 100%;
        height: 100%;
        object-fit: cover;
        object-position: center;
    }
    main section .slider{
        width: 50%; height: 300px;
        margin: 2rem auto;
        border: 3px solid brown;
        display: flex; /* 추가 */
    }

    각 슬라이드 이미지에 flex:none 과 width: 100%를 설정하여 컨테이너에 하나의 슬라이드 이미지만 들어갈 수 있도록 너비를 고정한다.

    컨테이너에 하나만 담긴 슬라이드 이미지

    html, body{
      margin: 0; padding: 0;
      box-sizing: border-box;
    }
    body{
      height: 100vh;
      display: flex;
      flex-direction: column;
    }
    header, footer{
      height: 70px;
      flex: none;
    }
    main{
      flex: 1;
      /* background: brown; */
      display: flex; 
    }
    
    /* 헤더영역 */
    header img{
      width: 50px;
      height: 50px;
    }
    header{
      display: flex;
      justify-content: space-between;
      align-items: center; 
    }
    header > nav > ul{
      display: flex;
      gap: 3rem;
      list-style: none;
      margin-right: 2rem;
    }
    a{
      text-decoration: none;
      color: #333;
      font-weight: bold;
    }
    header > a{
      display: flex;
      align-items: center;
      transition: .3s;
    }
    header > a:hover{
      color: brown;
    }
    header > nav > ul > li{
      position: relative;
      display: flex; 
      flex-direction: column; 
    }
    header > nav > ul > li::before{
      position: absolute; bottom: -5px; 
      content: '';
      width: 0; height: 5px;
      border-radius: 10px; 
      background: brown;
      transition: .3s;
    }
    header > nav > ul > li:hover::before{
      width: 100%;
    }
    header > nav > ul > li > ul{
      display: none;
    }
    header > nav > ul > li:hover > ul{
      display: block;
      margin: 0; padding: 0; 
      list-style: none; 
      position: absolute; 
      top: 250%; width: auto; 
      background: brown; padding: .5rem .5rem; 
    }
    header > nav > ul > li > ul > li > a{
      color: #fff;
    }
    
    /* 메인영역 */
    main aside{
      width: 300px;
      flex: none;
      border: 1px solid red;
    }
    main section{
      flex: 1;
      border: 1px solid green;
    }
    main section .slider .slide{
      width: 100%;
      height: 100%;
      flex: none; 
      scroll-snap-align: center; /* 추가 */
    }
    main section .slider img{
      width: 100%;
      height: 100%;
      object-fit: cover;
      object-position: center;
    }
    main section .slider{
      width: 50%; height: 300px;
      margin: 2rem auto;
      border: 3px solid brown;
      display: flex; 
      overflow-x: auto; /* 추가 */
      overflow-y: hidden; /* 추가 */
      scroll-snap-type: x mandatory; /* 추가 */ 
    }

    css 의 scroll snap 을 사용하여 슬라이드 이미지가 특정 지점에서 멈추도록 한다. 수평방향 overflow 를 auto 로 설정하여 수평방향으로 스크롤이 되도록 한다. 

    scroll snap 을 적용한 슬라이드

    html, body{
      margin: 0; padding: 0;
      box-sizing: border-box;
    }
    body{
      height: 100vh;
      display: flex;
      flex-direction: column;
    }
    header, footer{
      height: 70px;
      flex: none;
    }
    main{
      flex: 1;
      /* background: brown; */
      display: flex; 
    }
    
    /* 헤더영역 */
    header img{
      width: 50px;
      height: 50px;
    }
    header{
      display: flex;
      justify-content: space-between;
      align-items: center; 
    }
    header > nav > ul{
      display: flex;
      gap: 3rem;
      list-style: none;
      margin-right: 2rem;
    }
    a{
      text-decoration: none;
      color: #333;
      font-weight: bold;
    }
    header > a{
      display: flex;
      align-items: center;
      transition: .3s;
    }
    header > a:hover{
      color: brown;
    }
    header > nav > ul > li{
      position: relative;
      display: flex; 
      flex-direction: column; 
    }
    header > nav > ul > li::before{
      position: absolute; bottom: -5px; 
      content: '';
      width: 0; height: 5px;
      border-radius: 10px; 
      background: brown;
      transition: .3s;
    }
    header > nav > ul > li:hover::before{
      width: 100%;
    }
    header > nav > ul > li > ul{
      display: none;
    }
    header > nav > ul > li:hover > ul{
      display: block;
      margin: 0; padding: 0; 
      list-style: none; 
      position: absolute; 
      top: 250%; width: auto; 
      background: brown; padding: .5rem .5rem; 
    }
    header > nav > ul > li > ul > li > a{
      color: #fff;
    }
    
    /* 메인영역 */
    main aside{
      width: 300px;
      flex: none;
      border: 1px solid red;
    }
    main section{
      flex: 1;
      border: 1px solid green;
    }
    main section .slider .slide{
      width: 100%;
      height: 100%;
      flex: none; 
      scroll-snap-align: center; 
    }
    main section .slider img{
      width: 100%;
      height: 100%;
      object-fit: cover;
      object-position: center;
    }
    main section .slider{
      width: 90%; height: 700px; /* 수정 */
      margin: 2rem auto;
      /* border: 3px solid brown; */ /* 주석처리 */
      display: flex; 
      overflow-x: auto; 
      overflow-y: hidden; 
      scroll-snap-type: x mandatory;  
    } 
    main section .slider::-webkit-scrollbar {
      height: 8px;  /* 스크롤바의 너비 */
    }
    
    main section .slider::-webkit-scrollbar-thumb {
      height: 30%; /* 스크롤바의 길이 */
      background: #d8792b; /* 스크롤바의 색상 */
      border-radius: 20px;
    }
    
    main section .slider::-webkit-scrollbar-track {
      background: rgba(235, 185, 93, 0.3);  /*스크롤바 뒷 배경 색상*/
    }

    슬라이드 컨테이너의 크기를 키우고, 보더는 주석처리한다. 스크롤바를 디자인한다.

    슬라이드의 수평 스크롤바 디자인

     

    * 사이드바 영역 디자인하기

    <aside>
      <nav>
        <ul>
          <li><a href="#">sidemenu1</a></li>
          <li><a href="#">sidemenu2</a></li>
          <li><a href="#">sidemenu3</a></li>
        </ul>
      </nav>
    </aside>

    사이드 메뉴를 추가한다.

    html, body{
      margin: 0; padding: 0;
      box-sizing: border-box;
    }
    body{
      height: 100vh;
      display: flex;
      flex-direction: column;
    }
    header, footer{
      height: 70px;
      flex: none;
    }
    main{
      flex: 1;
      /* background: brown; */
      display: flex; 
    }
    
    /* 헤더영역 */
    header img{
      width: 50px;
      height: 50px;
    }
    header{
      display: flex;
      justify-content: space-between;
      align-items: center; 
    }
    header > nav > ul{
      display: flex;
      gap: 3rem;
      list-style: none;
      margin-right: 2rem;
    }
    a{
      text-decoration: none;
      color: #333;
      font-weight: bold;
    }
    header > a{
      display: flex;
      align-items: center;
      transition: .3s;
    }
    header > a:hover{
      color: brown;
    }
    header > nav > ul > li{
      position: relative;
      display: flex; 
      flex-direction: column; 
    }
    header > nav > ul > li::before{
      position: absolute; bottom: -5px; 
      content: '';
      width: 0; height: 5px;
      border-radius: 10px; 
      background: brown;
      transition: .3s;
    }
    header > nav > ul > li:hover::before{
      width: 100%;
    }
    header > nav > ul > li > ul{
      display: none;
    }
    header > nav > ul > li:hover > ul{
      display: block;
      margin: 0; padding: 0; 
      list-style: none; 
      position: absolute; 
      top: 250%; width: auto; 
      background: brown; padding: .5rem .5rem; 
    }
    header > nav > ul > li > ul > li > a{
      color: #fff;
    }
    
    /* 메인영역 */
    main aside{
      width: 300px;
      flex: none;
      border: 1px solid red;
    }
    main section{
      flex: 1;
      border: 1px solid green;
    }
    main section .slider .slide{
      width: 100%;
      height: 100%;
      flex: none; 
      scroll-snap-align: center; 
    }
    main section .slider img{
      width: 100%;
      height: 100%;
      object-fit: cover;
      object-position: center;
    }
    main section .slider{
      width: 90%; height: 700px; /* 수정 */
      margin: 2rem auto;
      /* border: 3px solid brown; */ /* 주석처리 */
      display: flex; 
      overflow-x: auto; 
      overflow-y: hidden; 
      scroll-snap-type: x mandatory;  
    } 
    main section .slider::-webkit-scrollbar {
      height: 8px;  /* 스크롤바의 너비 */
    }
    
    main section .slider::-webkit-scrollbar-thumb {
      height: 30%; /* 스크롤바의 길이 */
      background: #d8792b; /* 스크롤바의 색상 */
      border-radius: 20px;
    }
    
    main section .slider::-webkit-scrollbar-track {
      background: rgba(235, 185, 93, 0.3);  /*스크롤바 뒷 배경 색상*/
    }
    
    /* 사이드바 영역 */
    main aside nav ul{
      list-style: none;
      padding: .5rem; margin: 2rem;
    }
    main aside nav{
      background-color: #d8792b;
    }
    main aside nav ul li a{
      color: #fff;
    }

    사이드바 영역을 디자인한다. 

    사이드바 영역 디자인

    html, body{
      margin: 0; padding: 0;
      box-sizing: border-box;
    }
    body{
      height: 200vh; /* 수정 */
      display: flex;
      flex-direction: column;
    }
    header, footer{
      height: 70px;
      flex: none;
    }
    main{
      flex: 1;
      /* background: brown; */
      display: flex; 
    }
    
    /* 헤더영역 */
    header img{
      width: 50px;
      height: 50px;
    }
    header{
      display: flex;
      justify-content: space-between;
      align-items: center; 
    }
    header > nav > ul{
      display: flex;
      gap: 3rem;
      list-style: none;
      margin-right: 2rem;
    }
    a{
      text-decoration: none;
      color: #333;
      font-weight: bold;
    }
    header > a{
      display: flex;
      align-items: center;
      transition: .3s;
    }
    header > a:hover{
      color: brown;
    }
    header > nav > ul > li{
      position: relative;
      display: flex; 
      flex-direction: column; 
    }
    header > nav > ul > li::before{
      position: absolute; bottom: -5px; 
      content: '';
      width: 0; height: 5px;
      border-radius: 10px; 
      background: brown;
      transition: .3s;
    }
    header > nav > ul > li:hover::before{
      width: 100%;
    }
    header > nav > ul > li > ul{
      display: none;
    }
    header > nav > ul > li:hover > ul{
      display: block;
      margin: 0; padding: 0; 
      list-style: none; 
      position: absolute; 
      top: 250%; width: auto; 
      background: brown; padding: .5rem .5rem; 
    }
    header > nav > ul > li > ul > li > a{
      color: #fff;
    }
    
    /* 메인영역 */
    main aside{
      width: 300px;
      flex: none;
      border: 1px solid red;
    }
    main section{
      flex: 1;
      border: 1px solid green;
    }
    main section .slider .slide{
      width: 100%;
      height: 100%;
      flex: none; 
      scroll-snap-align: center; 
    }
    main section .slider img{
      width: 100%;
      height: 100%;
      object-fit: cover;
      object-position: center;
    }
    main section .slider{
      width: 90%; height: 700px; 
      margin: 2rem auto;
      /* border: 3px solid brown; */ 
      display: flex; 
      overflow-x: auto; 
      overflow-y: hidden; 
      scroll-snap-type: x mandatory;  
    } 
    main section .slider::-webkit-scrollbar {
      height: 8px;  
    }
    
    main section .slider::-webkit-scrollbar-thumb {
      height: 30%; 
      background: #d8792b; 
      border-radius: 20px;
    }
    
    main section .slider::-webkit-scrollbar-track {
      background: rgba(235, 185, 93, 0.3);  
    }
    
    /* 사이드바 영역 */
    main aside nav ul{
      list-style: none;
      padding: .5rem; margin: 2rem;
    }
    main aside nav{
      background-color: #d8792b;
    }
    main aside nav ul li a{
      color: #fff;
    }

    웹 화면이 스크롤될 수 있도록 body 높이를 200vh 로 수정한다.

    html, body{
      margin: 0; padding: 0;
      box-sizing: border-box;
    }
    body{
      height: 200vh; 
      display: flex;
      flex-direction: column;
    }
    header, footer{
      height: 70px;
      flex: none;
    }
    main{
      flex: 1;
      /* background: brown; */
      display: flex; 
    }
    
    /* 헤더영역 */
    header img{
      width: 50px;
      height: 50px;
    }
    header{
      display: flex;
      justify-content: space-between;
      align-items: center; 
      position: fixed; /* 추가 */
      top: 0; left: 0; right: 0; /* 추가 */
      z-index: 1; /* 추가 */
      background-color: #fff; /* 추가 */
    }
    header > nav > ul{
      display: flex;
      gap: 3rem;
      list-style: none;
      margin-right: 2rem;
    }
    a{
      text-decoration: none;
      color: #333;
      font-weight: bold;
    }
    header > a{
      display: flex;
      align-items: center;
      transition: .3s;
    }
    header > a:hover{
      color: brown;
    }
    header > nav > ul > li{
      position: relative;
      display: flex; 
      flex-direction: column; 
    }
    header > nav > ul > li::before{
      position: absolute; bottom: -5px; 
      content: '';
      width: 0; height: 5px;
      border-radius: 10px; 
      background: brown;
      transition: .3s;
    }
    header > nav > ul > li:hover::before{
      width: 100%;
    }
    header > nav > ul > li > ul{
      display: none;
    }
    header > nav > ul > li:hover > ul{
      display: block;
      margin: 0; padding: 0; 
      list-style: none; 
      position: absolute; 
      top: 250%; width: auto; 
      background: brown; padding: .5rem .5rem; 
    }
    header > nav > ul > li > ul > li > a{
      color: #fff;
    }
    
    /* 메인영역 */
    main aside{
      width: 300px;
      flex: none;
      border: 1px solid red;
    }
    main section{
      flex: 1;
      border: 1px solid green;
    }
    main section .slider .slide{
      width: 100%;
      height: 100%;
      flex: none; 
      scroll-snap-align: center; 
    }
    main section .slider img{
      width: 100%;
      height: 100%;
      object-fit: cover;
      object-position: center;
    }
    main section .slider{
      width: 90%; height: 700px; 
      margin: 2rem auto;
      /* border: 3px solid brown; */ 
      display: flex; 
      overflow-x: auto; 
      overflow-y: hidden; 
      scroll-snap-type: x mandatory;  
    } 
    main section .slider::-webkit-scrollbar {
      height: 8px;  
    }
    
    main section .slider::-webkit-scrollbar-thumb {
      height: 30%; 
      background: #d8792b; 
      border-radius: 20px;
    }
    
    main section .slider::-webkit-scrollbar-track {
      background: rgba(235, 185, 93, 0.3);  
    }
    
    /* 사이드바 영역 */
    main aside nav ul{
      list-style: none;
      padding: .5rem; margin: 2rem;
    }
    main aside nav{
      background-color: #d8792b;
    }
    main aside nav ul li a{
      color: #fff;
    }

    웹 화면 스크롤시 헤더는 브라우저 상단에 고정되도록 한다. 헤더를 고정하기 위하여 position: fixed 를 설정하면 헤더 아래쪽에 위치한 main 영역이 헤더를 무시하고 브라우저 상단으로 끌려 올라온다. 그래서 헤더높이만큼 main 영역 상단에 마진을 추가한다.

    html, body{
      margin: 0; padding: 0;
      box-sizing: border-box;
    }
    body{
      height: 200vh; 
      display: flex;
      flex-direction: column;
    }
    header, footer{
      height: 70px;
      flex: none;
    }
    main{
      flex: 1;
      /* background: brown; */
      display: flex; 
      margin-top: 70px; /* 추가 */
    }
    
    /* 헤더영역 */
    header img{
      width: 50px;
      height: 50px;
    }
    header{
      display: flex;
      justify-content: space-between;
      align-items: center; 
      position: fixed; 
      top: 0; left: 0; right: 0; 
      z-index: 1; 
      background-color: #fff; 
    }
    header > nav > ul{
      display: flex;
      gap: 3rem;
      list-style: none;
      margin-right: 2rem;
    }
    a{
      text-decoration: none;
      color: #333;
      font-weight: bold;
    }
    header > a{
      display: flex;
      align-items: center;
      transition: .3s;
    }
    header > a:hover{
      color: brown;
    }
    header > nav > ul > li{
      position: relative;
      display: flex; 
      flex-direction: column; 
    }
    header > nav > ul > li::before{
      position: absolute; bottom: -5px; 
      content: '';
      width: 0; height: 5px;
      border-radius: 10px; 
      background: brown;
      transition: .3s;
    }
    header > nav > ul > li:hover::before{
      width: 100%;
    }
    header > nav > ul > li > ul{
      display: none;
    }
    header > nav > ul > li:hover > ul{
      display: block;
      margin: 0; padding: 0; 
      list-style: none; 
      position: absolute; 
      top: 250%; width: auto; 
      background: brown; padding: .5rem .5rem; 
    }
    header > nav > ul > li > ul > li > a{
      color: #fff;
    }
    
    /* 메인영역 */
    main aside{
      width: 300px;
      flex: none;
      border: 1px solid red;
    }
    main section{
      flex: 1;
      border: 1px solid green;
    }
    main section .slider .slide{
      width: 100%;
      height: 100%;
      flex: none; 
      scroll-snap-align: center; 
    }
    main section .slider img{
      width: 100%;
      height: 100%;
      object-fit: cover;
      object-position: center;
    }
    main section .slider{
      width: 90%; height: 700px; 
      margin: 2rem auto;
      /* border: 3px solid brown; */ 
      display: flex; 
      overflow-x: auto; 
      overflow-y: hidden; 
      scroll-snap-type: x mandatory;  
    } 
    main section .slider::-webkit-scrollbar {
      height: 8px;  
    }
    
    main section .slider::-webkit-scrollbar-thumb {
      height: 30%; 
      background: #d8792b; 
      border-radius: 20px;
    }
    
    main section .slider::-webkit-scrollbar-track {
      background: rgba(235, 185, 93, 0.3);  
    }
    
    /* 사이드바 영역 */
    main aside nav ul{
      list-style: none;
      padding: .5rem; margin: 2rem;
    }
    main aside nav{
      background-color: #d8792b;
    }
    main aside nav ul li a{
      color: #fff;
    }

    헤더를 브라우저 상단에 고정

    html, body{
      margin: 0; padding: 0;
      box-sizing: border-box;
    }
    body{
      height: 200vh; 
      display: flex;
      flex-direction: column;
    }
    header, footer{
      height: 70px;
      flex: none;
    }
    main{
      flex: 1;
      /* background: brown; */
      display: flex; 
      margin-top: 70px; 
    }
    
    /* 헤더영역 */
    header img{
      width: 50px;
      height: 50px;
    }
    header{
      display: flex;
      justify-content: space-between;
      align-items: center; 
      position: fixed; 
      top: 0; left: 0; right: 0; 
      z-index: 1; 
      background-color: #fff; 
    }
    header > nav > ul{
      display: flex;
      gap: 3rem;
      list-style: none;
      margin-right: 2rem;
    }
    a{
      text-decoration: none;
      color: #333;
      font-weight: bold;
    }
    header > a{
      display: flex;
      align-items: center;
      transition: .3s;
    }
    header > a:hover{
      color: brown;
    }
    header > nav > ul > li{
      position: relative;
      display: flex; 
      flex-direction: column; 
    }
    header > nav > ul > li::before{
      position: absolute; bottom: -5px; 
      content: '';
      width: 0; height: 5px;
      border-radius: 10px; 
      background: brown;
      transition: .3s;
    }
    header > nav > ul > li:hover::before{
      width: 100%;
    }
    header > nav > ul > li > ul{
      display: none;
    }
    header > nav > ul > li:hover > ul{
      display: block;
      margin: 0; padding: 0; 
      list-style: none; 
      position: absolute; 
      top: 250%; width: auto; 
      background: brown; padding: .5rem .5rem; 
    }
    header > nav > ul > li > ul > li > a{
      color: #fff;
    }
    
    /* 메인영역 */
    main aside{
      width: 300px;
      flex: none;
      /* border: 1px solid red; */
    }
    main section{
      flex: 1;
      /* border: 1px solid green; */
    }
    main section .slider .slide{
      width: 100%;
      height: 100%;
      flex: none; 
      scroll-snap-align: center; 
    }
    main section .slider img{
      width: 100%;
      height: 100%;
      object-fit: cover;
      object-position: center;
    }
    main section .slider{
      width: 90%; height: 700px; 
      margin: 2rem auto;
      /* border: 3px solid brown; */ 
      display: flex; 
      overflow-x: auto; 
      overflow-y: hidden; 
      scroll-snap-type: x mandatory;  
    } 
    main section .slider::-webkit-scrollbar {
      height: 8px;  
    }
    
    main section .slider::-webkit-scrollbar-thumb {
      height: 30%; 
      background: #d8792b; 
      border-radius: 20px;
    }
    
    main section .slider::-webkit-scrollbar-track {
      background: rgba(235, 185, 93, 0.3);  
    }
    
    /* 사이드바 영역 */
    main aside nav ul{
      list-style: none;
      padding: .5rem; margin: 2rem;
    }
    main aside nav{
      background-color: #d8792b;
      position: sticky; top: 70px; /* 추가 */
    }
    main aside nav ul li a{
      color: #fff;
    }

    화면 스크롤시 사이드바 영역도 함께 스크롤되다가 헤더에 닿으면 화면에 고정되도록 position: sticky 로 설정하고 고정되는 위치는 헤더높이로 지정한다.

    헤더 하단에 고정되는 사이드바 메뉴

     

    * 푸터 디자인하기

    <!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>플럭스박스</title>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <a href="#">
                <img src="logo.avif" alt="logo">
                sunblocks
            </a>
            <nav>
                <ul>
                    <li>
                        <a href="#">home</a>
                        <ul>
                            <li><a href="#">sub1sub1sub1</a></li>
                            <li><a href="#">sub2</a></li>
                            <li><a href="#">sub3</a></li>
                        </ul>
                    </li>
                    <li>
                        <a href="#">about</a>
                        <ul>
                            <li><a href="#">sub1</a></li>
                            <li><a href="#">sub2</a></li>
                            <li><a href="#">sub3</a></li>
                            <li><a href="#">sub4</a></li>
                            <li><a href="#">sub5</a></li>
                            <li><a href="#">sub6</a></li>
                        </ul>
                    </li>
                    <li><a href="#">contact</a></li>
                </ul>
            </nav>
        </header>
        <main>
            <section>
                <div class="slider">
                    <div class="slide">
                        <img src="slide-1.jpg" alt="slide-1">
                    </div>
                    <div class="slide">
                        <img src="slide-2.jpg" alt="slide-2">
                    </div>
                    <div class="slide">
                        <img src="slide-3.jpg" alt="slide-3">
                    </div>
                </div>
            </section>
            <aside>
              <nav>
                <ul>
                  <li><a href="#">sidemenu1</a></li>
                  <li><a href="#">sidemenu2</a></li>
                  <li><a href="#">sidemenu3</a></li>
                </ul>
              </nav>
            </aside>
        </main>
        <footer>
          <div class="icons">
            <i class="fa-brands fa-instagram"></i>
            <i class="fa-brands fa-facebook"></i>
            <i class="fa-brands fa-twitter"></i>
            <i class="fa-brands fa-youtube"></i>
          </div>
          <div class="rights">All Rights Reserved By Sunblocks.</div>
        </footer>
    </body>
    </html>

    푸터 영역에 컨텐츠를 채운다. 소셜 아이콘과 저작권 관련 내용이다. 또한, 폰트아우썸 아이콘을 사용하기 위한 CND 링크도 추가한다.

    html, body{
      margin: 0; padding: 0;
      box-sizing: border-box;
    }
    body{
      height: 200vh; 
      display: flex;
      flex-direction: column;
    }
    header, footer{
      height: 70px;
      flex: none;
    }
    main{
      flex: 1;
      /* background: brown; */
      display: flex; 
      margin-top: 70px; 
    }
    
    /* 헤더영역 */
    header img{
      width: 50px;
      height: 50px;
    }
    header{
      display: flex;
      justify-content: space-between;
      align-items: center; 
      position: fixed; 
      top: 0; left: 0; right: 0; 
      z-index: 1; 
      background-color: #fff; 
    }
    header > nav > ul{
      display: flex;
      gap: 3rem;
      list-style: none;
      margin-right: 2rem;
    }
    a{
      text-decoration: none;
      color: #333;
      font-weight: bold;
    }
    header > a{
      display: flex;
      align-items: center;
      transition: .3s;
    }
    header > a:hover{
      color: brown;
    }
    header > nav > ul > li{
      position: relative;
      display: flex; 
      flex-direction: column; 
    }
    header > nav > ul > li::before{
      position: absolute; bottom: -5px; 
      content: '';
      width: 0; height: 5px;
      border-radius: 10px; 
      background: brown;
      transition: .3s;
    }
    header > nav > ul > li:hover::before{
      width: 100%;
    }
    header > nav > ul > li > ul{
      display: none;
    }
    header > nav > ul > li:hover > ul{
      display: block;
      margin: 0; padding: 0; 
      list-style: none; 
      position: absolute; 
      top: 250%; width: auto; 
      background: brown; padding: .5rem .5rem; 
    }
    header > nav > ul > li > ul > li > a{
      color: #fff;
    }
    
    /* 메인영역 */
    main aside{
      width: 300px;
      flex: none;
      /* border: 1px solid red; */
    }
    main section{
      flex: 1;
      /* border: 1px solid green; */
    }
    main section .slider .slide{
      width: 100%;
      height: 100%;
      flex: none; 
      scroll-snap-align: center; 
    }
    main section .slider img{
      width: 100%;
      height: 100%;
      object-fit: cover;
      object-position: center;
    }
    main section .slider{
      width: 90%; height: 700px; 
      margin: 2rem auto;
      /* border: 3px solid brown; */ 
      display: flex; 
      overflow-x: auto; 
      overflow-y: hidden; 
      scroll-snap-type: x mandatory;  
    } 
    main section .slider::-webkit-scrollbar {
      height: 8px;  
    }
    
    main section .slider::-webkit-scrollbar-thumb {
      height: 30%; 
      background: #d8792b; 
      border-radius: 20px;
    }
    
    main section .slider::-webkit-scrollbar-track {
      background: rgba(235, 185, 93, 0.3);  
    }
    
    /* 사이드바 영역 */
    main aside nav ul{
      list-style: none;
      padding: .5rem; margin: 2rem;
    }
    main aside nav{
      background-color: #d8792b;
      position: sticky; top: 70px; /* 추가 */
    }
    main aside nav ul li a{
      color: #fff;
    }
    
    /* 푸터 영역 */
    footer{
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      width: 90%;
      border-top: 1px solid #777;
      margin: 0 auto;
      padding: .5rem 0;
    }
    footer .rights{
      font-weight: 400;
    }
    footer .icons{
      font-size: 1.5rem;
    }
    footer .icons i{
      margin-right: .5rem;
      transition: .3s;
    }
    footer .icons i:hover{
      color: brown;
      transform: scale(1.2);
    }

    푸터 영역의 소셜 아이콘과 저작권 텍스트를 디자인한다. 

    푸터영역 디자인

    <!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>플럭스박스</title>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <a href="#">
                <img src="logo.avif" alt="logo">
                sunblocks
            </a>
            <nav>
                <ul>
                    <li>
                        <a href="#">home</a>
                        <ul>
                            <li><a href="#">sub1sub1sub1</a></li>
                            <li><a href="#">sub2</a></li>
                            <li><a href="#">sub3</a></li>
                        </ul>
                    </li>
                    <li>
                        <a href="#">about</a>
                        <ul>
                            <li><a href="#">sub1</a></li>
                            <li><a href="#">sub2</a></li>
                            <li><a href="#">sub3</a></li>
                            <li><a href="#">sub4</a></li>
                            <li><a href="#">sub5</a></li>
                            <li><a href="#">sub6</a></li>
                        </ul>
                    </li>
                    <li><a href="#">contact</a></li>
                </ul>
            </nav>
        </header>
        <main>
            <section>
                <div class="slider">
                    <div class="slide">
                        <img src="slide-1.jpg" alt="slide-1">
                    </div>
                    <div class="slide">
                        <img src="slide-2.jpg" alt="slide-2">
                    </div>
                    <div class="slide">
                        <img src="slide-3.jpg" alt="slide-3">
                    </div>
                </div>
            </section>
            <aside>
              <nav>
                <ul>
                  <li><a href="#">sidemenu1</a></li>
                  <li><a href="#">sidemenu2</a></li>
                  <li><a href="#">sidemenu3</a></li>
                </ul>
              </nav>
            </aside>
        </main>
        <footer>
          <div class="icons">
            <i class="fa-brands fa-instagram"></i>
            <i class="fa-brands fa-facebook"></i>
            <i class="fa-brands fa-twitter"></i>
            <i class="fa-brands fa-youtube"></i>
          </div>
          <div class="rights">All Rights Reserved By Sunblocks.</div>
        </footer>
        <span>
          <i class="fa-solid fa-circle-arrow-up"></i>
        </span>
    </body>
    </html>

    푸터 하단에 scroll to top 버튼을 추가한다.

    html, body{
      margin: 0; padding: 0;
      box-sizing: border-box;
    }
    body{
      height: 200vh; 
      display: flex;
      flex-direction: column;
    }
    header, footer{
      height: 70px;
      flex: none;
    }
    main{
      flex: 1;
      /* background: brown; */
      display: flex; 
      margin-top: 70px; 
    }
    
    /* 헤더영역 */
    header img{
      width: 50px;
      height: 50px;
    }
    header{
      display: flex;
      justify-content: space-between;
      align-items: center; 
      position: fixed; 
      top: 0; left: 0; right: 0; 
      z-index: 1; 
      background-color: #fff; 
    }
    header > nav > ul{
      display: flex;
      gap: 3rem;
      list-style: none;
      margin-right: 2rem;
    }
    a{
      text-decoration: none;
      color: #333;
      font-weight: bold;
    }
    header > a{
      display: flex;
      align-items: center;
      transition: .3s;
    }
    header > a:hover{
      color: brown;
    }
    header > nav > ul > li{
      position: relative;
      display: flex; 
      flex-direction: column; 
    }
    header > nav > ul > li::before{
      position: absolute; bottom: -5px; 
      content: '';
      width: 0; height: 5px;
      border-radius: 10px; 
      background: brown;
      transition: .3s;
    }
    header > nav > ul > li:hover::before{
      width: 100%;
    }
    header > nav > ul > li > ul{
      display: none;
    }
    header > nav > ul > li:hover > ul{
      display: block;
      margin: 0; padding: 0; 
      list-style: none; 
      position: absolute; 
      top: 250%; width: auto; 
      background: brown; padding: .5rem .5rem; 
    }
    header > nav > ul > li > ul > li > a{
      color: #fff;
    }
    
    /* 메인영역 */
    main aside{
      width: 300px;
      flex: none;
      /* border: 1px solid red; */
    }
    main section{
      flex: 1;
      /* border: 1px solid green; */
    }
    main section .slider .slide{
      width: 100%;
      height: 100%;
      flex: none; 
      scroll-snap-align: center; 
    }
    main section .slider img{
      width: 100%;
      height: 100%;
      object-fit: cover;
      object-position: center;
    }
    main section .slider{
      width: 90%; height: 700px; 
      margin: 2rem auto;
      /* border: 3px solid brown; */ 
      display: flex; 
      overflow-x: auto; 
      overflow-y: hidden; 
      scroll-snap-type: x mandatory;  
    } 
    main section .slider::-webkit-scrollbar {
      height: 8px;  
    }
    
    main section .slider::-webkit-scrollbar-thumb {
      height: 30%; 
      background: #d8792b; 
      border-radius: 20px;
    }
    
    main section .slider::-webkit-scrollbar-track {
      background: rgba(235, 185, 93, 0.3);  
    }
    
    /* 사이드바 영역 */
    main aside nav ul{
      list-style: none;
      padding: .5rem; margin: 2rem;
    }
    main aside nav{
      background-color: #d8792b;
      position: sticky; top: 70px; /* 추가 */
    }
    main aside nav ul li a{
      color: #fff;
    }
    
    /* 푸터 영역 */
    footer{
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      width: 90%;
      border-top: 1px solid #777;
      margin: 0 auto;
      padding: .5rem 0;
    }
    footer .rights{
      font-weight: 400;
    }
    footer .icons{
      font-size: 1.5rem;
    }
    footer .icons i{
      margin-right: .5rem;
      transition: .3s;
    }
    footer .icons i:hover{
      color: brown;
      transform: scale(1.2);
    }
    body > span{
      position: fixed;
      bottom: 2rem; right: 1rem;
      z-index: 1;  
      font-size: 2.5rem;
      cursor: pointer;
      transition: .3s;
    }
    body > span:hover{
      transform: translateY(-10px);
    }

    scroll to top 버튼을 디자인한다. 

    scroll to top 버튼 디자인

     

    728x90

    '프론트엔드 > HTML & CSS 강의' 카테고리의 다른 글

    시맨틱 태그 심화과제  (0) 2024.02.04
    테이블 연습 심화과제  (0) 2024.02.04
    CSS 변수와 함수  (0) 2023.06.26
    플럭스박스(flexbox) 활용  (0) 2023.06.24
    4. 박스모델 (Box Model)  (0) 2023.06.15
Designed by Tistory.