Quiz

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
HTML CSS JavaScript

    <main id="main">
        <div class="quiz__wrap">            
            <!--javascript-->                                 
        </div>
    </main>  

    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box; 
        font-family: 'DungGeunMo';                
    }
    *::after, *::before {
        box-sizing: border-box;
    }
    a{
        text-decoration: none;
    }
    body {
       
        background-color: #f6f6f6;
        background-image:
            linear-gradient(90deg, #cdcccc 0px, #cdcccc 1px, transparent 1px, transparent 99px,  transparent 100px),
            linear-gradient(#cdcccc 0px, #cdcccc 1px, transparent 1px, transparent 99px,  transparent 100px),
            linear-gradient(#e0e0e0 0px, #e0e0e0 1px, transparent 1px, transparent 99px,  transparent 100px),
            linear-gradient(90deg, #e0e0e0 0px, #e0e0e0 1px, transparent 1px, transparent 99px,  transparent 100px),
            linear-gradient(transparent 0px, transparent 5px, #f6f6f6 5px, #f6f6f6 95px, transparent 95px, transparent 100px),
            linear-gradient(90deg, #e0e0e0 0px, #e0e0e0 1px, transparent 1px, transparent 99px, #e0e0e0 99px, #e0e0e0 100px),
            linear-gradient(90deg, transparent 0px, transparent 5px, #f6f6f6 5px, #f6f6f6 95px, transparent 95px, transparent 100px),
            linear-gradient(transparent 0px, transparent 1px, #f6f6f6 1px, #f6f6f6 99px, transparent 99px, transparent 100px),
            linear-gradient(#cdcccc, #cdcccc);
        background-size:100px 100%, 100% 100px, 100% 10px, 10px 100%, 100% 100px, 100px 100%, 100px 100%, 100px 100px, 100px 100px;            
    }
    #header {
        position: absolute;
        left: 0;
        top: 0;
        width: 100%;
        background: #262626;
        color: #fff;
        display: flex;
        padding: 10px;
        justify-content: space-between;
        align-items: center;
        z-index: 10;
    }
    #header::before {
        content: '';
        border: 4px ridge #a3a3a3;
        position: absolute;
        left: 5px;
        top: 5px;
        width: calc(100% - 10px);
        height: calc(100% - 10px);
        z-index: -1;
    }
    #header h1 {
        padding: 3px 0 6px 10px;
    }
    #header h1 a {
        text-decoration: none;
        color: #fff;
    }
    #header nav {
        padding-right: 10px;
    }
    #header nav li {
        list-style: none;
        display: inline;
    }
    #header nav li a {
        color: #fff;
        display: inline-block;
        padding: 0 10px;
        transition: all 0.2s;
        border: 1px dashed #fff;
    }
    #header nav li.active a {
        background: #fff;
        color: #262626;
    }
    #header nav li a:hover {
        opacity: 0.5;
    }
    #footer {
        margin-top: 100px;                                                 
        width: 100%;
        background: #fff;
        text-align: center;
        padding: 20px;
    }
    #footer a {
        color: #262626;
        font-size: 16px;
    }
    /*quiz__wrap*/
    .quiz__wrap {
       display: flex;
       align-items: center;
       justify-content: center;
       margin-top: 150px;
       flex-wrap: wrap;        
       height: 100vh;
    }
    .quiz {
        max-width: 500px;
        width: 100%;
        background: #fff;
        border: 8px ridge #cacaca;
        margin: 10px;
    }
    .quiz__type {
        background: #cacaca;
        text-align: center;
        font-size: 14px;
        color: #3b3b3b;
        border: 3px ridge #cacaca;
        padding: 3px 0;
        position: relative;
    }
    .quiz__type::before {
        content: '';
        position: absolute;
        left: 2px;
        top: 2px;
        width: 5px;
        height: 5px;
        border: 6px ridge #648a30; 
    }
    .quiz__type::after {
        content: '';
        position: absolute;
        right: 2px;
        top: 2px;
        width: 5px;
        height: 5px;
        border: 6px ridge #648a30; 
    }
    .quiz__question {            
        border-bottom: 6px ridge #cacaca;
        border-top: 6px ridge #cacaca;
        padding: 13px 30px;
        font-size: 24px;
        line-height: 1.6;
    }
    .quiz__number {
        font-family: 'Cafe24Dangdanghae';
        color: #648a30;
    }
    .quiz__ask {
        font-family: 'Cafe24Dangdanghae';
        color: #262626;
    }
    .quiz__view {
        background: #f5f5f5;
        position: relative;
    }
    .quiz__view .true {
        position: absolute;
        left: 70%;
        top: 100px;
        width: 120px;
        height: 120px;
        color: #fff;
        border-radius: 50%;
        z-index: 100;
        line-height: 120px;
        text-align: center;
        background: #f5534f;
        opacity: 0;
    }
  
    .quiz__view .false {
        position: absolute;
        right: 70%;
        top: 100px;
        width: 120px;
        height: 120px;
        background: #fff;
        border-radius: 50%;
        z-index: 100;
        line-height: 120px;
        text-align: center;
        color: #f5534f;
        opacity: 0;
            
    }
    .quiz__view.dislike .false {
        opacity: 1;
        animation: wobble 0.6s;
    }
    .quiz__view.like .true {
        opacity: 1;
        animation: wobble 0.6s;
    }
    @keyframes wobble {
        0% {      
            transform: translateZ(0)
        }
        15% {       
            transform: translate3d(-25%, 0, 0) rotate(-5deg)
        }
        30% {       
            transform: translate3d(20%, 0, 0) rotate(3deg)
        }
        45% {        
            transform: translate3d(-15%, 0, 0) rotate(-3deg)
        }
        60% {       
            transform: translate3d(10%, 0, 0) rotate(2deg)
        }
        75% {       
            transform: translate3d(-5%, 0, 0) rotate(-1deg)
        }
        100% {    
            transform: translateZ(0)
        }
    }
    .quiz__answer {
        border-top: 6px ridge #cacaca;
        background: #f5f5f5;
        padding: 10px;        
    }
    .quiz__confirm {
        padding: 10px;
        border: 6px ridge #cacaca;
        width: 100%;
        font-size: 22px;
        padding: 13px 20px;
        background: #d6d6d6;
        font-family: 'Cafe24Dangdanghae';
        text-shadow: 1px 1px 1px #fff;
        transition: all 0.3s;
    }
    .quiz__confirm:hover {
        background: #b3b3b3;
    }
    .quiz__result {
        text-align: center;
        padding: 10px;
        border: 6px ridge #cacaca;
        width: 100%;
        font-size: 22px;
        padding: 13px 20px;
        background: #fff;
        font-family: 'Cafe24Dangdanghae';
        text-shadow: 1px 1px 1px #fff;
        line-height: 1.4;
        color: #262626;
        
    }
    .quiz__ex {
        text-align: center;
        padding: 10px;
        border: 6px ridge #cacaca;
        width: 100%;
        font-size: 22px;
        padding: 13px 20px;
        background: #fff;
        font-family: 'Cafe24Dangdanghae';
        text-shadow: 1px 1px 1px #fff;
        line-height: 1.4;
        color: #262626;
        
    }
    .quiz__input {
        width: 100%;
        padding: 13px 20px;
        border: 6px ridge #cacaca;
        font-size: 22px;
        padding: 13px 20px;
        background: #fff;
        font-family: 'Cafe24Dangdanghae';
        text-shadow: 1px 1px 1px #fff;
        margin-bottom: 10px;

    }

    .quiz__selects {
        color: #262626;
        margin-bottom: 15px;
        margin-top: 20px;
    }
    .quiz__selects label {
        display: flex;
    }
    .quiz__selects label input {
        position: absolute;
        left: -9999px;
    }        
    .quiz__selects label span {
        font-size: 20px;
        line-height: 1.3;
        padding: 10px 30px 10px 20px;          
        border-radius: 5px;
        margin: 3px 0;
        font-family: 'Cafe24Dangdanghae';
        display: flex;
        align-items: center;
        cursor: pointer;
        transition: all 0.25s;
    }
    .quiz__selects label span::before {
        content: '';
        width: 30px;
        height: 30px;
        border-radius: 50%;
        margin-right: 15px;
        background: #fff;
        display: flex;
        flex-shrink: 0;
        box-shadow: inset 0 0 0 4px #64a30b;
        transition: all 0.25s;            
    }
    .quiz__selects label input:checked + span {
        background-color: #e3fbc0;       
    }
    .quiz__selects label input:checked + span::before {    
        box-shadow: inset 0 0 0 10px #64a30b;
    }
    /* .quiz__btn {
        width: 100%;
    }
    .quiz__confirm {
        width: auto;
    }
    .quiz__result {

    } */                 
  
    const quizWrap = document.querySelector(".quiz__wrap");

        //문제 정보
        const quizInfo = [
            {
                answerType : "html",
                answerNum : 1,                                                   
                answerAsk : "컨텐츠의 구조를 정의하는 마크업 언어는 무엇인가요?",
                answerChoice : {
                    1: "html",
                    2: "css",
                    3: "javascript",
                    4: "react"
                },
                answerResult : "1",
                answerEx : "컨텐츠의 구조를 정의하는 마크업 언어는 HTML 입니다."
            },
            {
                answerType : "css",
                answerNum : 2,                                                   
                answerAsk : "웹 페이지를 꾸미기위해서 사용하는 언어는 무엇입니까?",
                answerChoice : {
                    1: "html",
                    2: "css",
                    3: "javascript",
                    4: "react"
                },
                answerResult : "2",
                answerEx : "웹 페이지를 꾸미기위해서 사용하는 언어는 CSS 입니다."
            },
            {
                answerType : "javascript",
                answerNum : 3,                                                   
                answerAsk : "객체 기반의 스크립트 프로그래밍 언어는 무엇입니까?",
                answerChoice : {
                    1: "html",
                    2: "css",
                    3: "javascript",
                    4: "react"
                },
                answerResult : "3",
                answerEx : "객체 기반의 스크립트 프로그래밍 언어는 자바스크립트입니다."
            },
                              
        ];

        //문제 출력
        function updataQuiz(){
            const html = [];
            quizInfo.forEach((question, number)=>{          //객체화 된 문제 데이터에 push기능을 써서 html 태그(뼈대)를 추가.
                html.push(`
           <div class="quiz">
                <h2 class="quiz__type">${question.answerType}</h2>
                <h3 class="quiz__question">
                    <span class="quiz__number">${question.answerNum}.</span>
                    <span class="quiz__ask">${question.answerAsk}</span>
                </h3>
                <div class="quiz__view">
                    <div class="true">정답입니다!</div>
                    <div class="false">틀렸습니다!</div>
                    <div class="dog">
                        <div class="head">
                            <div class="ears"></div>
                            <div class="face"></div>
                            <div class="eyes">
                                    <div class="teardrop"></div>
                            </div>
                            <div class="nose"></div>
                            <div class="mouth">
                                    <div class="tongue"></div>
                            </div>
                            <div class="chin"></div>
                        </div>
                        <div class="body">
                            <div class="tail"></div>
                            <div class="legs"></div>
                        </div>
                      </div>
                </div>
                <div class="quiz__answer">
                    <div class="quiz__selects">
                        <label for="select1${number}">
                            <input class="select" type="radio" id="select1${number}" name="select${number}" value="1">
                            <span class="choice">${question.answerChoice[1]}</span>
                        </label>
                        <label for="select2${number}">
                            <input class="select" type="radio" id="select2${number}" name="select${number}" value="2">
                            <span class="choice">${question.answerChoice[2]}</span>
                        </label>
                        <label for="select3${number}">
                            <input class="select" type="radio" id="select3${number}" name="select${number}" value="3">
                            <span class="choice">${question.answerChoice[3]}</span>
                        </label>
                        <label for="select4${number}">
                            <input class="select" type="radio" id="select4${number}" name="select${number}" value="4">
                            <span class="choice">${question.answerChoice[4]}</span>
                        </label>                       
                    </div>                                
                </div>
            </div>
           `)
            });

            html.push(`                                
                <div class="quiz_btn">
                <button class="quiz__confirm">정답 확인하기</button>
                <div class="quiz__result"></div>
                </div>
            `)                  
           quizWrap.innerHTML = html.join(''); //배열화 된 데이터의 나열 중에 있는 쉼표,공백을 join으로 제거.
        }
        updataQuiz();

        function answerQuiz(){
            const quizSelects = document.querySelectorAll(".quiz__selects");    //보기 선택 박스
            const quizView = document.querySelectorAll(".quiz__view");          //보기 선택 박스
            const quizResult = document.querySelector(".quiz__result");         //퀴즈 정답 박스

            let scoreCurrent = 0;
            
            quizInfo.forEach((question, number) => {
                const quizSelectsWrap = quizSelects[number];                                  //전체 보기 박스 
                const userSelector = `input[name=select${number}]:checked`;                   //사용자가 클릭한것
                const userAnswer = (quizSelectsWrap.querySelector(userSelector) || {}).value  //클릭한 값의 속성 값을 가져옮

                if(userAnswer == question.answerResult){                                    //클릭한 값의 속성과 문제의 답 번호가 같으면
                    //console.log("정답입니다.")
                    quizView[number].classList.add("like");                                 //quizView에 like 클래스 추가
                    scoreCurrent++;                                                         //현재 정답 갯수에 ++;
                } else {
                    //console.log("오답입니다.")
                    quizView[number].classList.add("dislike");                      //속성과 문제의 답이 다르면 dislike 추가
                    const div = document.createElement("div");                      //div 박스 생성 변수화.
                    quizSelectsWrap.appendChild(div).innerHTML = `<p class="quiz__ex">${question.answerEx}</p>`;    //문제 박스에 div 박스를 추가, 설명을 출력.
                }
            });
            quizResult.innerHTML = `${quizInfo.length} 문제 중에 ${scoreCurrent} 문제를 맞추었습니다.`;     //맞춘 정답의 갯수도 출력.
        }

        document.querySelector(".quiz__confirm").addEventListener("click", answerQuiz);     //정답 확인 버튼을 클릭하는 함수 실행.
sbxjs6999@naver.com