디자인 자격증/웹디자인기능사

A-2 웹디자인기능사 실기시험 공개문제 풀이(자바스크립트)

saejun 2023. 11. 11. 13:28
반응형

지난번에 풀어본 A1 문제(풀이 링크)에 이은 두 번째 문제 풀이.


A-2: Green복지재단 와이어프레임 살펴보기

기본 와이어프레임 구조는 A1과 동일하고, 아래와 같은 4가지 차이점이 있다:

  1. 메인메뉴에 마우스를 오버하면 전체배경이 서브메뉴와 함께 내려온다.
  2. B영역의 슬라이드가 세로가 아닌 가로방향으로 전환된다.
  3. C영역의 공지사항과 갤러리가 탭메뉴가 아닌 별도 메뉴로 구성되어 있다.
  4. D영역 오른쪽 하단에 SNS 아이콘 대신 패밀리사이트 메뉴가 들어간다.

A-2: Green복지재단 와이어프레임 구성하기

 

A1과 마찬가지고 Visual Studio Code를 실행한 뒤, 아래와 같은 폴더 구조로 파일을 생성해 준다:

 

 

먼저 아래와 같은 HTML 구조를 작성해서 와이프레임의 기본 구조를 만든다:

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Green복지재단</title>
</head>

<!-- css -->
<link rel="stylesheet" href="css/style.css">

<!-- script -->
<script src="script/script.js"></script>
<body>
    <div id="wrap">
        <header id="header"></header>
        <article id="slider"></article>
        <main id="contents"></section>
        <footer id="footer"></footer>
    </div>
</body>
</html>

 

그런 다음 HTML 파일과 연결된 style.css 파일로 넘어가 CSS코드를 이어서 작성한다.

 

맨 상단에 시험에서 요구하는 캐릭터 셋을 적용하고 텍스트 기본색상을 포함한 초기화(reset)를 진행해 준다:

* {
    margin: 0;
    padding: 0;
    color: #333;
}

a {
    text-decoration: none;
    color: #333;
}

li {
    list-style: none;
}

img {
    vertical-align: top;
    width: 100%;
}

 

초기화 설정이 끝나면 아래와 같이 CSS코드를 작성하여 기본 와이어프레임 구조의 기본영역(A-D)을 잡아준다:

/* wrap */
#wrap {
    width: 1200px;
    height: 700px;
    margin: 0 auto;
}

/* header */
#header {
    width: 100%;
    height: 100px;
    background-color: #898989;
}

/* slider */
#slider {
    width: 100%;
    height: 300px;
    background-color: #d8d8d8;
}

/* contents */
#contents {
    width: 100%;
    height: 200px;
    background-color: #b1b1b1;
}

/* footer */
#footer {
    width: 100%;
    height: 100px;
    background-color: #e2e2e2;
}

 

Index.html을 선택한 상태로 마우스 오른쪽 버튼을 눌러 Open with Live Server 메뉴를 선택한다.

*시험장에서는 Open with Live Server가 작동하지 않으므로, 작업폴더의 index.html 파일을 더블클릭하여 실행한다.

 

웹브라우저에 아래와 같은 구조가 정상적으로 표시되는지 확인하고 이어서 코드를 작성한다.

위와 같이 와이어프레임의 기본영역(A-D)이 설정되었다면 아래와 같은 html을 추가로 작성한다:

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Green복지재단</title>
</head>

<!-- css -->
<link rel="stylesheet" href="css/style.css">

<!-- script -->
<script src="script/script.js"></script>
<body>
    <div id="wrap">
        <header id="header">
            <h1 class="logo"></h1>
            <nav class="nav"></nav>
        </header>
        <!-- header -->

        <article id="slider">
        </article>
        <!-- slider -->

        <main id="contents">
            <section class="notice"></section>
            <section class="gallery"></section>
            <section class="banner"></section>  
        </main>
        <!-- contents -->

        <footer id="footer">
            <div class="footer1"></div>
            <div class="footer2"></div>
            <div class="footer3"></div>
        </footer>
        <!-- footer -->
    </div>
    <!-- wrap -->
</body>
</html>

 

이어서 CSS를 아래와 같이 작성하여 추가된 HTML 구조를 정의해 준다:

*부모한테서 heightbackground-color 속성을 자식으로 이동시켜 주고, display: flex를 영역별로 적용해 준다.

/* wrap */
#wrap {
    width: 1200px;
    height: 700px;
    margin: 0 auto;
    background-color: #c3c3c3;
}

/* header */
#header {
    width: 100%;
    display: flex;
}
#header .logo {
    width: 200px;
    height: 100px;
    background-color: #dedede;
}
#header .nav {
    width: 1000px;
    height: 100px;
    background-color: #c9c9c9;
}

/* slider */
#slider {
    width: 100%;
    height: 300px;
    background-color: #727272;
}

/* contents */
#contents {
    width: 100%;
    display: flex;
}
#contents .notice {
    width: 400px;
    height: 200px;
    background-color: #a8a8a8;
}
#contents .gallery {
    width: 400px;
    height: 200px;
    background-color: #888888;
}
#contents .banner {
    width: 400px;
    height: 200px;
    background-color: #6d6d6d;
}

/* footer */
#footer {
    width: 100%;
    display: flex;
}
#footer .footer1 {
    width: 200px;
    height: 100px;
    background-color: #666666;
}
#footer .footer2 {
    width: 700px;
    height: 100px;
    background-color: #818181;
}
#footer .footer3 {
    width: 300px;
    height: 100px;
    background-color: #3e3e3e;
}

 

웹 브라우저 화면

CSS 작성을 완료화면 아래와 같이 표시된다:

 


A영역(헤더) 로고 코딩

헤더 영역 코딩을 진행하기에 앞서 토포샵을 사용해 로고를 제작한다. 심벌 없는 워드타입으로 가로(200px) x 세로(40px) 크기의 PNG 포맷으로 저장한다. 무채색(grayscale)으로 변경한 푸터용 로고도 함께 제작한다.

 

HTML 코딩

*상호작용이 필요한 모든 콘텐츠(로고, 메뉴, 버튼, 바로가기 등)는 임시링크(#)를 적용하여 '탭(Tab)'키로 이동 선택할 수 있어야 한다.

     <header id="header">
            <h1 class="logo">
                <a href="#"><img src="/A2/images/logo.png" alt="Green복지재단 로고"></a>
            </h1>
            <nav class="nav"></nav>
        </header>
        <!-- header -->

 

CSS 코딩

/* header */
#header {
    width: 100%;
    display: flex;
}
#header .logo {
    width: 200px;
    height: 100px;
    background-color: #fff;
}
#header .logo a{
    display: block;
    margin-top: 30px;
}

 

웹 브라우저 화면


A영역(헤더) 메인메뉴 코딩

시험문제에서 제공되는 사이트맵을 참고하여 HTML 코딩을 진행한다.

<nav class="nav">
                <ul>
                    <li><a href="#">재단소개</a>
                        <ul>
                            <li><a href="#">설립취지</a></li>
                            <li><a href="#">연혁</a></li>
                            <li><a href="#">찾아오시는길</a></li>
                        </ul>
                    </li>
                    <li><a href="#">후원하기</a>
                        <ul>
                            <li><a href="#">국내후원</a></li>
                            <li><a href="#">국외후원</a></li>
                            <li><a href="#">맞춤후원</a></li>
                        </ul>
                    </li>
                    <li><a href="#">자료실</a>
                        <ul>
                            <li><a href="#">서식자료실</a></li>
                            <li><a href="#">사진자료실</a></li>
                            <li><a href="#">후원양식</a></li>
                        </ul>
                    </li>
                    <li><a href="#">스토리</a>
                        <ul>
                            <li><a href="#">웹진</a></li>
                            <li><a href="#">보고서</a></li>
                            <li><a href="#">나의 후원</a></li>
                        </ul>
                    </li>
                </ul>
            </nav>

 

CSS 코딩

*메인메뉴와 서브메뉴에 마우스 호버시 하이라이트가 될 수 있도록 작업한다.

 

먼저 아래와 같이 메인과 서브메뉴 구조를 정의해 준다:

/* header */
#header {
    width: 100%;
    display: flex;
}
#header .logo {
    width: 200px;
    height: 100px;
    background-color: #fff;
}
#header .logo a{
    display: block;
    margin-top: 30px;
}
#header .nav {
    width: 1000px;
    height: 100px;
}
#header .nav > ul {
    display: flex;
    justify-content: right;
    margin-top: 61px;
}
#header .nav > ul > li {
    position: relative;
}
#header .nav > ul > li > a {
    display: inline-block;
    padding: 10px 50px;
    background-color: #35b752
    ;
}
#header .nav > ul > li > a:hover {
    background-color: #91e7a3;
}
#header .nav > ul > li > ul {
    position: absolute;
    left: 0;
    top: 39px;
    width: 100%;
    text-align: center;
    background-color: #1d632c;
}
#header .nav > ul > li > ul > li > a {
    display: inline-block; 
    padding: 10px;
    width: 100%;
    box-sizing: border-box;
    color: #fff;
}
#header .nav > ul > li > ul > li > a:hover {
    background-color: #91e7a3;
}

 

웹 브라우저

그리고 이어서 서브메뉴와 함께 펼쳐지는 배경화면을 CSS를 이용해 아래와 같이 header의 가상요소(#header::after)로 만들어주고, #header. nav에 z-index 값 1000을 준다:

/* header */
#header {
    width: 100%;
    display: flex;
    position: relative;
}
#header::after {
    content: '';
    width: 100%;
    height: 118px;
    background-color: #000000;
    position: absolute;
    left: 0;
    top: 100px;
    z-index: 1;
    transition: all 600ms;
}
#header .logo {
    width: 200px;
    height: 100px;
    background-color: #fff;
}
#header .logo a{
    display: block;
    margin-top: 30px;
}
#header .nav {
    width: 1000px;
    height: 100px;
    z-index: 1000;
}

  

추가로 #header nav > ul > li > ul 라인에서 background-color를 제거한다:

#header .nav > ul > li > ul {
    position: absolute;
    left: 0;
    top: 39px;
    width: 100%;
    text-align: center;
}

 

이렇게 코딩하면 아래와 같은 화면이 웹 브라우저에 표시된다:

추후 스크립트로 메뉴를 제어할 수 있도록 아래와 같이 CSS 코드를 변경 및 작성한다:

#header::after {
    content: '';
    width: 100%;
    height: 0px;
    background-color: #000000;
    position: absolute;
    left: 0;
    top: 100px;
    z-index: 1;
    transition: all 600;
}
#header.on::after {
    height: 118px;
}

 

그리고 아래의 CSS 코드도 display:none 처리한다:

#header .nav > ul > li > ul {
    position: absolute;
    left: 0;
    top: 39px;
    width: 100%;
    text-align: center;
    display: none;
}

 

이렇게 코드를 변경하면 웹브라우저에는 아래와 같은 화면이 나타나고, 추후 스트립트를 사용해 header 태그에 class = "on"을 추가해 주면 서브메뉴가 배경과 함께 나타나는 효과를 줄 수 있다.


B영역(슬라이드) 코딩

header 영역에 이어서 슬라이드 영역의 코딩을 진행한다. HTML과 CSS 코드는 이전의 A1과 동일하다:

 

HTML

  <article id="slider">
            <div class="sliderWrap">
                <div class="slider">
                    <a href="#"><img src="images/slider01.jpg" alt="Green 복지재단1"></a>
                        <div class="text">
                            <h2>Green 복지재단1</h2>
                        </div>                
                    </div>
                <div class="slider">
                    <a href="#"><img src="images/slider02.jpg" alt="Green 복지재단2"></a>
                    <div class="text">
                        <h2>Green 복지재단2</h2>
                    </div>
                </div>
                <div class="slider">
                    <a href="#"><img src="images/slider03.jpg" alt="Green 복지재단1"></a>
                    <div class="text">
                        <h2>Green 복지재단3</h2>
                    </div>
                </div>
            </div>
        </article>
        <!-- slider -->

 

HTML 코드가 완성되면 아래와 같이 CSS 코드를 작성한다:

/* slider */
#slider {
    height: 300px;    
    overflow: hidden;
}
#slider .sliderWrap {
    width: 400%;
    display: flex;
}
#slider .sliderWrap .slider {
    position: relative;
}
#slider .sliderWrap .slider .text {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50% ,-50%);
    text-align: center;
    background-color:rgba(0, 0, 0, 0.4);
    padding: 20px 30px;

}
#slider .sliderWrap .slider .text h2 {
    color: #fff;
    font-size: 30px;
}

 

완료되면 아래와 같은 화면이 웹 브라우저에 나타난다(이미지가 가로로 정렬된다):

여기까지 코딩이 완료되었다면 아래와 같이 overflow:hidden을 적용해서 첫 번째 슬라이드 이미지만 표시되도록 한다:

/* slider */
#slider {
    height: 300px;    
    overflow: hidden;


C영역(공지사항) 코딩

이어서 C영역의 공지사항을 코딩한다. 아래와 같이 HTML 구조를 잡는다:

<main id="contents">
            <section class="notice">
                <h2>공지사항</h2>
                <ul>
                    <li><a href="#">Green 복지재단 공지사항1</a><span>2020.11.23</span></li>
                    <li><a href="#">Green 복지재단 공지사항2</a><span>2020.11.23</span></li>
                    <li><a href="#">Green 복지재단 공지사항3</a><span>2020.11.23</span></li>
                    <li><a href="#">Green 복지재단 공지사항4</a><span>2020.11.23</span></li>
                </ul>
            </section>

 

이어서 CSS 작업을 해준다:

/* contents: notice */
#contents .notice {
    width: 400px;
    height: 200px;
    background-color: #91e7a3;
    padding: 20px;
    box-sizing: border-box;
}
#contents .notice h2 {
    font-size: 24px;
    margin-bottom: 10px;
}
#contents .notice li {
    display: flex;
}
#contents .notice li a {
    width: 75%;
    font-size: 16px;
    line-height: 1.8;
}
#contents .notice li a:hover {
    text-decoration: underline;
}
#contents .notice ul li span{
    width: 25%;
    font-size: 16px;
    line-height: 1.8;
    text-align: right;
}

 

그럼 아래와 같은 화면이 나타난다:


C영역(갤러리) 코딩

이어서 갤러리 영역도 코딩을 해준다. 아래처럼 HTML 구조를 짜고:

<section class="gallery">
                <h2>갤러리</h2>
                <ul>
                    <li><a href="#"><img src="/A2/images/gallery01.png" alt="갤러리 사진1"></a></li>
                    <li><a href="#"><img src="/A2/images/gallery02.png" alt="갤러리 사진2"></a></li>
                    <li><a href="#"><img src="/A2/images/gallery03.png" alt="갤러리 사진3"></a></li>
                </ul>
            </section>

 

CSS도 아래와 같이 작성한다:

/* contents: gallery */
#contents .gallery {
    width: 400px;
    height: 200px;
    background-color: #6cbc7d;
    padding: 20px;
    box-sizing: border-box;
}
#contents .gallery h2 {
    font-size: 24px;
    margin-bottom: 14px;
}
#contents .gallery ul {
    display: flex;
    justify-content: space-between;
}
#contents .gallery ul li a {
    border: 5px solid transparent;
    display: block;
}
#contents .gallery ul li a:hover {
    border-color: #19692a;
}
#contents .gallery ul li img {
    width: 100px;
    height: 100px;
}

 

그럼 아래와 같이 화면이 구성된다:


C영역(배너) 코딩

마지막으로 배너 영역을 코딩한다. 아래와 같이 HTML 구조를 잡고:

<section class="banner">
                <h2>배너</h2>
                <a href="#">후원하러 가기</a>
            </section>

 

CSS를 아래와 같이 작성한다:

/* contents:banner */
#contents .banner {
    width: 400px;
    height: 200px;
    background-image: url(/A2/images/banner.jpg);
    padding: 20px;
    box-sizing: border-box;
    position: relative;
}
#contents .banner h2{
    font-size: 24px;
    margin-bottom: 10px;
    display: block;
}
#contents .banner a{
    background-color: rgba(23, 177, 41, 0.536);
    padding: 10px 20px;
    color: #fff;
    border-radius: 50px;
    margin-top: 10px;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%,-50%);
}
#contents .banner a:hover {
    background-color: rgba(15, 125, 28, 0.536);
}

 

그럼 아래와 같이 화면에 배너가 완성된다:


D영역(로고) 코딩

A영역의 로고와 동일한 방식으로 코딩한다. 다만 무채색(grayscale)으로 작업한 파일을 사용한다:.

 

아래와 같이 HTML 구조를 잡고

<footer id="footer">
            <div class="footer1">
                <a href="#"><img src="/A2/images/logo_f.png" alt="Green복지재단 푸터 로고"></a>
            </div>

 

CSS 코드를 아래와 같이 작성한다:

/* footer1: logo */
#footer .footer1 {
    width: 200px;
    height: 100px;
}
#footer .footer1 a {
    display: block;
    margin-top: 30px;
}

 

아래와 같이 로고가 삽입된다:

 


D영역(Copyright) 코딩

아래와 같이 html로 텍스트를 입력하고:

<div class="footer2">
                    COPYRIGHTⓒ by WEBDESIGN. ALL RIGHTS RESERVED
            </div>

 

CSS로 위치를 잡아준다:

/* footer2 : Copyright */
#footer .footer2 {
    width: 700px;
    height: 100px;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 16px;
}

 

아래와 같이 완성된다:


D영역(패밀리사이트) 코딩

이제 마지막으로 패밀리사이트 영역을 코딩해 준다:

 

Select와 Option 태그를 사용해서 HTML을 작성하고:

<div class="footer3">
                <select name="#" id="#">
                    <option>패밀리 사이트</option>
                    <option value="1">패밀리 사이트1</option>
                    <option value="1">패밀리 사이트2</option>
                    <option value="1">패밀리 사이트3</option>
                </select>
            </div>

 

아래와 같이 CSS로 코딩해준다:

/* footer : Family site */
#footer .footer3 {
    width: 300px;
    height: 100px;
}
#footer .footer3 select {
    margin-top: 35px;
    width: 80%;
    height: 30px;
}

 

그럼 아래와 같이 패밀리사이트 부분이 완성된다:


모달 레이어 팝업 코딩

이제 마지막으로 모달 레이어 팝업을 코딩해 준다. 아래와 같이 HTML 구조를 짜고:

<div class="popup-view">
            <h3>복지재단 공지사항</h3>
            <p>
                동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세.
                무궁화 삼천리 화려강 대한 사람 대한으로 길이 보전하세.
                남산 위에 저 소나무, 철갑을 두른 듯 바람서리 불변함은 우리 기상일세.
            </p>
            <a href="#" class="popup-close">닫기</a>
        </div>
        <!-- pop-up -->

 

CSS도 아래와 같이 작성한다:

/* popup */
.popup-view {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    width: 300px;
    height: 300px;
    background-color: #6cbc7d;
    border: 4px solid #19692a;
    padding: 20px;
}
.popup-view h3 {
    font-size: 24px;
    margin-bottom: 15px;
    border-bottom: 3px solid #19692a;
    padding-bottom: 5px;
}
.popup-close {
    position: absolute;
    left: 50%;
    bottom: 20px;
    transform: translate(-50%);
    background-color: #19692a;
    color: #fff;
    padding: 8px 20px;
}

 

그럼 아래와 같이 팝업도 완성된다:

 

 

그럼 이제 HTML과 CSS 구조는 모두 완성되었다. 탭을 눌러서 영역 간 이동이 되는지 확인하고 A1과 동일하게 크롬의 Web Developer 플러그인 사용해서 유효성 검사를 진행해 코드상의 오류가 없는지 확인한다:

 

 

오류가 없다면 이제 자바스크립트로 넘어간다.


자바스크립트 (Javascript) 코딩

A영역 메뉴 코딩

메인 메뉴에 마우스를 오버할때 전체 배경과 함께 서브메뉴가 내려와야 한다. 이를 구현하기 위한 자바스크립트 코드는 아래와 같다:

window.onload = function (){
    //메뉴
    let navList = document.querySelector(".nav > ul");

    // 자바스크립트용 CSS 구현
    let submenus = document.querySelectorAll("#header .nav > ul > li > ul")

    submenus.forEach(function (submenu){
        submenu.style.display = "block";
        submenu.style.height = "0";
        submenu.style.overflow = "hidden";
        submenu.style.transition = "all 600ms";
    });

    //마우스 오버 시 전체 배경 나오는 애니메이션 
    navList.addEventListener("mouseover",() => {
        navList.querySelectorAll(".submenu").forEach(sub => {
            sub.style.height = "118px";
        }); 
        document.getElementById("header").classList.add("on");
    });

    navList.addEventListener("mouseout",() => {
        navList.querySelectorAll(".submenu").forEach(sub => {
            sub.style.height = "0px";
        }); 
        document.getElementById("header").classList.remove("on");
    });
}

B영역(슬라이드) 코딩

먼저 슬라이드 영역을 코딩한다. 3초마다 메인배너 이미지가 가로 방향으로 전환되어야 한다. 이를 구현하기 위한 자바스크립트 코드는 아래와 같다:

    let currentIndex = 0; //현재 이미지
    const sliderWrap = document.querySelector(".sliderWrap"); //전체 이미지
    const slider = document.querySelectorAll(".slider"); //각각의 이미지
    const sliderClone = sliderWrap.firstElementChild.cloneNode(true); //첫번째 이미지 저장
    sliderWrap.appendChild(sliderClone); //복사한 이미지를 마지막에 추가

    setInterval(()=> {
        currentIndex++; //현재 이미지를 1씩 증가
        sliderWrap.style.marginLeft = -currentIndex * 100 + "%"; //애니메이션 추가
        sliderWrap.style.transition = "all 0.6s"; //이미지 이동

        if(currentIndex == slider.length){ //마지막 이미지
            setTimeout(() => {
                sliderWrap.style.transition = "0s"; //애니메이션 정지
                sliderWrap.style.marginLeft = "0"; // 이미지 위치 초기화
                currentIndex = 0; //현재 이미지 초기화
            }, 700);
        }
    },3000);

레이어 팝업 코딩

이제 마지막으로 레이어팝업 코딩을 진행한다. 공지사항의 첫 번째 콘텐츠를 클릭할 경우, 레이어 팝업창이 나타나고 팝업창의 닫기 버튼을 누르면 닫히도록 코딩을 해야한다.

 

먼저 HTML에서 공지사항 첫 번째 콘텐츠에 popup-btn 클래스를 삽입한다:

<main id="contents">
            <section class="notice">
                <h2>공지사항</h2>
                <ul>
                    <li class="popup-btn"><a href="#" >Green 복지재단 공지사항1</a><span>2020.11.23</span></li>
                    <li><a href="#">Green 복지재단 공지사항2</a><span>2020.11.23</span></li>
                    <li><a href="#">Green 복지재단 공지사항3</a><span>2020.11.23</span></li>
                    <li><a href="#">Green 복지재단 공지사항4</a><span>2020.11.23</span></li>
                </ul>
            </section>

 

이후 아래와 같이 자바스크립트 코드를 작성한다:

  //팝업
    document.querySelector(".popup-btn").addEventListener("click", function(){
        document.querySelector(".popup-view").style.display = "block";
    });
    document.querySelector(".popup-close").addEventListener("click", function(){
        document.querySelector(".popup-view").style.display = "none";
    });

 

여기까지 작업하면 모든 코딩이 완료된다:


최종완성 코드 & 화면

완성된 최종코드:

https://github.com/saejunahn/Craftsman-Web-Design/blob/main/A2/index.html

 

애니메이션까지 구현된 최종 웹페이지:

https://saejunahn.github.io/Craftsman-Web-Design/A2

반응형