Giant Danio Fish
본문 바로가기
Javascript_Effect

퀴즈 만들기 - 객관식(여러문제)유형

by 코딩왕자 2022. 8. 23.

퀴즈 효과

객관식(여러문제 유형)

오늘은 화면에 여러문제를 표현한뒤 마지막에 결과확인 버튼을 누르면 점수가 나오는 유형을 만들어보겠습니다. 또한 quizScore라는 변수를 0으로 설정하고 맞을때마다 quizScore++를 사용해 마지막 정답버튼을 눌렀을 때 총 맞은 개수가 나오게 출력하였습니다.


결과


HTML 작성

기존에 body태그에 있던 코드들은 script로 넣어줄것이므로 quiz__wrap만 빼고 전부 지워줍니다.

<main id="main">
    <div class="quiz__wrap">
    </div>
</main>            

CSS 작성

기존과 딱히 변화 없습니다.

JS 작성

퀴즈 번호와 문제, 보기는 공통이므로 (``)템플릿 리터럴을 사용해 넣어줍니다. question(element)값을 입력해서 배열의 순서대로 값이 출력되게 만들었습니다.

펼쳐 보기
const quizInfo = [
{
    answerType: "웹디자인기능사 2010년 02회",
    answerNum: "1",
    answerAsk: "통일성을 주는 방법과 거리가 먼 것은?",
    answerChoice: {
        1: "각 요소들을 근접시킨다.",
        2: "각 요소들을 반복시킨다.",
        3: "각 요소들을 연속시킨다.",
        4: "각 요소들을 분리시킨다."
    },
    answerResult: "4",
    answerEx: "통일감을 갖기 위해서는 각 요소들이 근접, 반복, 연속되어야하므로 답은 4번입니다."
},
{
    answerType: "웹디자인기능사 2010년 02회",
    answerNum: "2",
    answerAsk: "디자인의 원리 중 율동(Rhythm)의 요소와 거리가 먼 것은?",
    answerChoice: {
        1: "대칭",
        2: "점증",
        3: "반복",
        4: "변칙"
    },
    answerResult: "1",
    answerEx: "율동에는 반복, 교차, 방사, 점이(점증)=그라데이션 등이 있으므로 답은 1번입니다."
},...
]
const quiz__wrap = document.querySelector(".quiz__wrap");
let quizScore = 0;

const updateQuiz = () => {
    const exam = [];

    quizInfo.forEach((question, number) => {
        exam.push(`
            <div class="quiz">
                <span class="quiz__type">${question.answerType}</span>
                <h2 class="quiz__question">
                    <span class="number">${question.answerNum + ". "}</span>
                    <div class="ask">${question.answerAsk}</div>
                </h2>
                <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 type="radio" id="select1${number}" class="select" name="select${number}" value="1">
                            <span class="choice">${question.answerChoice[1]}</span>
                        </label>
                        <label for="select2${number}">
                            <input type="radio" id="select2${number}" class="select" name="select${number}" value="2">
                            <span class="choice">${question.answerChoice[2]}</span>
                        </label>
                        <label for="select3${number}">
                            <input type="radio" id="select3${number}" class="select" name="select${number}" value="3">
                            <span class="choice">${question.answerChoice[3]}</span>
                        </label>
                        <label for="select4${number}">
                            <input type="radio" id="select4${number}" class="select" name="select${number}" value="4">
                            <span class="choice">${question.answerChoice[4]}</span>
                        </label>
                    </div>
                </div>
            </div>`
        );

        

    })

    exam.push(`
            <div class= "quiz__confirm">
                <button class="check">정답 확인하기</button>
                <div class="ex"></div>
            </div>
        `)
    quiz__wrap.innerHTML = exam.join('');
}
updateQuiz();

//정답 확인
const answerQuiz = () => {
    const quizSelects = document.querySelectorAll(".quiz__selects");      //객관식 보기
    
    //사용자가 체크한 보기 == 문제 정답
    quizInfo.forEach((question, number) => {
        const userSelector = `input[name=select${number}]:checked`;      //사용자가 체크한 것
        const quizSelectsWrap = quizSelects[number];
        const userAnswer = (quizSelectsWrap.querySelector(userSelector) || {}).value;     //정답 체크 안했을때도 있으니 or을 이용해서 빈 공백도 추가한다. 
        const quizView = document.querySelectorAll(".quiz__view");

        if(userAnswer == question.answerResult){
            console.log("정답")
            quizView[number].classList.add("like");
            quizScore++;

        } else {
            console.log("오답")
            quizView[number].classList.add("dislike");
            const divBox = document.createElement("div");
            quizSelectsWrap.appendChild(divBox).innerHTML = `<p class="result">${question.answerEx}</p>`
        }
        
    });
    // 전체 문제수
    console.log(quizInfo.length) 
    // 내가 맞힌 수
    console.log(quizScore)


    document.querySelector(".quiz__confirm .ex").innerHTML = `${quizScore} / ${quizInfo.length} 맞았습니다 공부좀 하세요..`;

}

//정답 클릭
document.querySelector(".quiz__confirm .check").addEventListener("click", answerQuiz);

'Javascript_Effect' 카테고리의 다른 글

슬라이더 이펙트 - 트랜지션 효과  (10) 2022.08.29
퀴즈만들기 - 객관식(여러문제)슬라이드 유형  (11) 2022.08.24
Search Effect 03  (15) 2022.08.22
Search Effect02  (9) 2022.08.17
Search Effect01  (7) 2022.08.16

댓글


광고 준비중입니다