Quiz

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
HTMLCSSJavascript
<div class="quiz__wrap">
    <!-- javascript -->
</div>
/* quiz__wrap */
    .quiz__wrap {
        display: flex;
        align-items: center;
        justify-content: center;
        margin-top: 150px;
    }
    .quiz {
        max-width: 500px;
        width: 100%;
        background: #fff;
        border: 8px ridge #cacaca;
        flex-wrap: wrap;
        margin: 10px;
    }
    .quiz__Type {
        background: #cacaca;
        text-align: center;
        font-size: 14px;
        color: #3b3b3b;
        border: 3px ridge #cacaca;
        padding: 3px 0;
        position: relative;
    }
    .quiz__question {
        border-top: 6px ridge #cacaca;
        border-bottom: 6px ridge #cacaca;
        padding: 13px 30px;
        font-size: 24px;
        line-height: 1.4
    }
    .quiz__Type::before {
        content: '';
        position: absolute;
        left: 2px;
        top: 2px;
        width: 5px;
        height: 5px;
        border: 6px ridge #cacaca;
    }
    .quiz__Type::after {
        content: '';
        position: absolute;
        right: 2px;
        top: 2px;
        width: 5px;
        height: 5px;
        border: 6px ridge #cacaca;
    }
    .quiz__number {
        font-family: 'Cafe24Dangdanghae';
        color: #bababa;
    }
    .quiz__ask {
        font-family: 'Cafe24Dangdanghae';
    }
    .quiz__view {
        background-color: #f5f5f5;
        position: relative;
    }
    .quiz__view .true {
        position: absolute;
        left: 70%;
        top: 100px;
        width: 100px;
        height: 100px;
        background: #f5534f;
        border-radius: 50%;
        z-index: 100;
        line-height: 100px;
        text-align: center;
        color: #fff;
        opacity: 0;
    }
    .quiz__view .false {
        position: absolute;
        right: 70%;
        top: 100px;
        width: 100px;
        height: 100px;
        background: #fff;
        border-radius: 50%;
        z-index: 100;
        line-height: 100px;
        text-align: center;
        color: #f5534f;
        opacity: 0;
    }
    .quiz__view.like .true {
        opacity: 1;
        animation: wobble 0.6s;
    }
    .quiz__view.dislike .false {
        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 {
        background-color: #f5f5f5;
        border-top: 6px ridge #cacaca;
        padding: 10px;
    }
    .quiz__confirm {
        border: 6px ridge #cacaca;
        width: 100%;
        font-size: 22px;
        padding: 13px 20px;
        background: #d6d6d6;
        text-shadow: 1px 1px 1px #fff;
        transition: all 0.3s;
        cursor: pointer;
    }
    .quiz__confirm:hover {
        background: #b3b3b3;
    }
    .quiz__result {
        border: 6px ridge #cacaca;
        width: 100%;
        font-size: 22px;
        padding: 13px 20px;
        background: #fff;
        text-align: center;
        text-shadow: 1px 1px 1px #fff;
        font-family: 'Cafe24Dangdanghae';
        line-height: 1.4;
    }
    .quiz__ex {
        border: 6px ridge #cacaca;
        width: 100%;
        font-size: 22px;
        padding: 13px 20px;
        background: #fff;
        text-align: center;
        text-shadow: 1px 1px 1px #fff;
        font-family: 'Cafe24Dangdanghae';
        line-height: 1.4;
    }
    .quiz__input {
        border: 6px ridge #cacaca;
        width: 100%;
        font-size: 22px;
        padding: 13px 20px;
        background: #fff;
        text-align: left;
        text-shadow: 1px 1px 1px #fff;
        font-family: 'Cafe24Dangdanghae';
        margin-bottom: 10px;
    }        
    .quiz__selects {
        margin-top: 20px;
        margin-bottom: 15px;
    }
    .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;
        margin: 3px 0;
        border-radius: 5px;
        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: #f5ffe7;
    }
    .quiz__selects label input:checked + span::before {
        box-shadow: inset 0 0 0 10px #64a30b;
    }
<script>
    const quizWrap = document.querySelector(".quiz__wrap")
        
    //문제 정보
    const quizInfo = [
        {
            answerType : "javascript",
            answerNum : 1,
            answerAsk : "객체 기반의 스크립트 프로그래밍 언어는 무엇입니까?",
            answerChoice : {
                1: "html",
                2: "css",
                3: "javascript",
                4: "jquery"
            },
            answerResult : "3",
            answerEx : "객체 기반의 스크립트 프로그래밍 언어는 자바스크립트입니다."
        },
        {
            answerType : "html",
            answerNum : 2,
            answerAsk : "웹 페이지를 표현하기 위한 마크업 언어는 무엇입니까?",
            answerChoice : {
                1: "html",
                2: "css",
                3: "javascript",
                4: "jquery"
            },
            answerResult : "1",
            answerEx : "웹 페이지를 표현하기 위한 마크업 언어는 HTML입니다."
        },
        {
            answerType : "css",
            answerNum : 3,
            answerAsk : "웹 페이지를 꾸미기 위해서 사용하는 언어는 무엇입니까?",
            answerChoice : {
                1: "html",
                2: "css",
                3: "javascript",
                4: "jquery"
            },
            answerResult : "2",
            answerEx : "웹 페이지를 꾸미기 위해서 사용하는 언어는 CSS입니다."
        }
    ];

    //문제 출력
    function updateQuiz(){
        const html = [];

        quizInfo.forEach((question, number) => {                        //html로 작업 하던것을 javascript로 출력
            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('');                             //push메서드를 이용해서 중간에 , 있는것을 join메서드로 지워줌
    }
    updateQuiz();

    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){                                        //사용자가 클릭한 것과 정답이 맞는지 비교
                quizView[number].classList.add("like");                                     
                scoreCurrent++;
            } else {
                quizView[number].classList.add("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)
</script>
apdlvmf8044@gmail.com