๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Effect/Quiz Effect

[Quiz Effect] ํ€ด์ฆˆ ์ดํŽ™ํŠธ 06 - ์Šฌ๋ผ์ด๋“œ ํ˜•์‹

by ์ฝ”๋”ฉ๊ณต์ฑ… 2022. 8. 24.
๋ฐ˜์‘ํ˜•

ํ€ด์ฆˆ ๋งŒ๋“ค๊ธฐ 06 : ๊ฐ๊ด€์‹(์—ฌ๋Ÿฌ ๋ฌธ์ œ) ์œ ํ˜• : ์Šฌ๋ผ์ด๋“œ

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ๊ทธ ๋™์•ˆ ๋ฐฐ์› ๋˜ JavaScript๋ฅผ ์ด์šฉํ•˜์—ฌ ํ€ด์ฆˆ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด๋ฒˆ ํ•™์Šต ๋‚ด์šฉ์„ ์ž˜ ํ™œ์šฉํ•˜์—ฌ ์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ ์‹œํ—˜ ๊ณต๋ถ€ ์—ด์‹ฌํžˆ ํ•ด ๋ด…์‹œ๋‹ค!
๋ณ€์ˆ˜(let)์™€ ์ƒ์ˆ˜(const)์— ์ฟผ๋ฆฌ ์…€๋ ‰ํ„ฐ ๊ฐ’์„ ์ €์žฅ์‹œํ‚ค๊ณ , ๊ทธ ๋™์•ˆ ๋ฐฐ์šด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ ์ •๋ณด๋ฅผ HTML ํƒœ๊ทธ์— ์ถœ๋ ฅ์‹œํ‚ค๊ณ , ์ •๋‹ต์„ ์ˆจ๊ฒผ๋‹ค๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ํšจ๊ณผ๋“ค์„ ๊ตฌํ˜„์‹œ์ผœ๋ด…์‹œ๋‹ค!


๋ฌธ์ œ ์ •๋ณดยท์„ ํƒ์ž ์ƒ์„ฑ

๋ฌธ์ œ ์ •๋ณด๋ฅผ ๋ฐฐ์—ด ์•ˆ์˜ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•ด์ค€๋‹ค. ๋‹ค๋ฅธ ํ€ด์ฆˆ ํšจ๊ณผ์™€๋Š” ๋‹ฌ๋ฆฌ answerResult์— ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ answerChoice์— ์žˆ๋Š” ์ •๋‹ต ๊ทธ ์ž์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ๋˜‘๊ฐ™์ด ์ž…๋ ฅํ•ด์ค€๋‹ค. ํ•„์š”ํ•œ const ์ƒ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด์ค€ ๋‹ค์Œ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ž‘์—…๊นŒ์ง€ ๋งˆ์น˜๋ฉด ๋งˆ์ง€๋ง‰์œผ๋กœ๋Š” let ๋ณ€์ˆ˜์— ๋ฌธ์ œ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜์™€ ๋งž์ถ˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜์ž.

// ๋ฌธ์ œ ์ •๋ณด
const quizInfo = [
    {
        answerType: "2013๋…„ 4ํšŒ ์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ - ๋””์ž์ธ์ผ๋ฐ˜",
        answerNum: "1",
        answerAsk: "์›น ๋””์ž์ธ์— ๊ด€ํ•œ ์„ค๋ช…์œผ๋กœ ๊ฑฐ๋ฆฌ๊ฐ€ ๋จผ ๊ฒƒ์€?",
        answerChoice: [
            "๊ฐ€. ์›น ํŽ˜์ด์ง€๋ฅผ ๋””์ž์ธํ•˜๊ณ  ์ œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.",
            "๋‚˜. ์›น ๋””์ž์ธ์€ ๊ฐœ์ธ์šฉ ํ™ˆํŽ˜์ด์ง€ ์™ธ ๊ธฐ์—…์šฉ, ์ƒ์—…์šฉ ๋“ฑ ๋งค์šฐ ๋‹ค์–‘ํ•˜๋‹ค.",
            "๋‹ค. ์›น ๋””์ž์ธ์€ ์›น๊ณผ ๋””์ž์ธ์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐœ๋…์ด ๊ฒฐํ•ฉ๋œ ๊ฒƒ์ด๋‹ค.",
            "๋ผ. ๊ธฐ์—…, ๋‹จ์ฒด, ํ–‰์‚ฌ์˜ ํŠน์ง•๊ณผ ์„ฑ๊ฒฉ์— ๋งž๋Š” ์‹œ๊ฐ์  ์ƒ์ง•๋ฌผ์„ ๋งํ•œ๋‹ค.",
        ],
        answerResult: "๋ผ. ๊ธฐ์—…, ๋‹จ์ฒด, ํ–‰์‚ฌ์˜ ํŠน์ง•๊ณผ ์„ฑ๊ฒฉ์— ๋งž๋Š” ์‹œ๊ฐ์  ์ƒ์ง•๋ฌผ์„ ๋งํ•œ๋‹ค.",
        answerEx: "์ •๋‹ต : 4 
๊ธฐ์—…, ๋‹จ์ฒด, ํ–‰์‚ฌ์˜ ํŠน์ง•๊ณผ ์„ฑ๊ฒฉ์— ๋งž๋Š” ์‹œ๊ฐ์  ์ƒ์ง•๋ฌผ์€ ์บ๋ฆญํ„ฐ์— ๊ด€ํ•œ ์„ค๋ช…์ด๋‹ค." }, { answerType: "2013๋…„ 4ํšŒ ์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ - ๋””์ž์ธ์ผ๋ฐ˜", answerNum: "2", answerAsk: "๋‹ค์Œ ์ค‘ ์‹œ๊ฐ ๋””์ž์ธ์— ์†ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€?", answerChoice: [ "๊ฐ€. ํ…์Šคํƒ€์ผ ๋””์ž์ธ", "๋‚˜. ํŒจํ‚ค์ง€ ๋””์ž์ธ", "๋‹ค. POP ๋””์ž์ธ", "๋ผ. ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ", ], answerResult: "๊ฐ€. ํ…์Šคํƒ€์ผ ๋””์ž์ธ", answerEx: "์ •๋‹ต : 1
ํ…์Šคํƒ€์ผ ๋””์ž์ธ์€ ์งˆ๊ฐ์„ ํฌ์ธํŠธ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ ๋””์ž์ธ์ด๋ผ ๋ณด๊ธฐ ํž˜๋“ค๋‹ค." }, { answerType: "2013๋…„ 4ํšŒ ์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ - ๋””์ž์ธ์ผ๋ฐ˜", answerNum: "3", answerAsk: "ํ™˜๊ฒฝ ๋””์ž์ธ์— ์†ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€?", answerChoice: [ "๊ฐ€. ์ธํ…Œ๋ฆฌ์–ด ๋””์ž์ธ", "๋‚˜. ๋ฌด๋Œ€ ๋””์ž์ธ", "๋‹ค. ๊ฐ€๊ตฌ ๋””์ž์ธ", "๋ผ. ์กฐ๊ฒฝ ๋””์ž์ธ", ], answerResult: "๋‹ค. ๊ฐ€๊ตฌ ๋””์ž์ธ", answerEx: "์ •๋‹ต : 3
์ธํ…Œ๋ฆฌ์–ด, ๋ฌด๋Œ€, ์กฐ๊ฒฝ ๋””์ž์ธ์€ ํ™˜๊ฒฝ ๋””์ž์ธ์ด์ง€๋งŒ ๊ฐ€๊ตฌ ๋””์ž์ธ์€ ํ™˜๊ฒฝ๋ณด๋‹ค๋Š” ์ธํ…Œ๋ฆฌ์–ด์—๋งŒ ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ™˜๊ฒฝ ๋””์ž์ธ์ด๋ผ ๋ณด๊ธฐ ํž˜๋“ค๋‹ค." }, { answerType: "2013๋…„ 4ํšŒ ์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ - ๋””์ž์ธ์ผ๋ฐ˜", answerNum: "4", answerAsk: "์ƒ‰์ฑ„์— ๋Œ€ํ•œ ์„ค๋ช…์œผ๋กœ ๋งž๋Š” ๊ฒƒ์€?", answerChoice: [ "๊ฐ€. ์ƒ‰์ฑ„๋Š” ์‹ฌ๋ฆฌ์  ์„ฑ์งˆ์„ ๊ฐ–์ง€ ๋ชปํ•œ๋‹ค.", "๋‚˜. ๋ฌผ์ฒด๊ฐ€ ๋ฐœ๊ด‘ํ•˜์ง€ ์•Š๊ณ  ๋น›์„ ๋ฐ›์•„์„œ ํก์ˆ˜๋˜๋Š” ์ƒ‰์ด๋‹ค.", "๋‹ค. ์ƒ‰์ฑ„์˜ ๋ถ„๋ฅ˜๋Š” ๋ฌด์ฑ„์ƒ‰, ์œ ์ฑ„์ƒ‰ ์ค‘์„ฑ์ƒ‰ 3๊ฐ€์ง€๋Š” ์žˆ๋‹ค.", "๋ผ. ์ƒ‰์ฑ„๋ฅผ ๋Š๋ผ๋Š” ๊ฒฝ์šฐ ์œ ์ฑ„์ƒ‰, ๋Š๋‚„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฌด์ฑ„์ƒ‰์ด๋ผ ํ•œ๋‹ค.", ], answerResult: "๋ผ. ์ƒ‰์ฑ„๋ฅผ ๋Š๋ผ๋Š” ๊ฒฝ์šฐ ์œ ์ฑ„์ƒ‰, ๋Š๋‚„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฌด์ฑ„์ƒ‰์ด๋ผ ํ•œ๋‹ค.", answerEx: "์ •๋‹ต : 4
์ƒ‰์ฑ„๋ฅผ ๋Š๋ผ๋Š” ๊ฒฝ์šฐ ์œ ์ฑ„์ƒ‰, ๋Š๋‚„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฌด์ฑ„์ƒ‰์ด๋ผ ํ•œ๋‹ค." }, { answerType: "2013๋…„ 4ํšŒ ์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ - ๋””์ž์ธ์ผ๋ฐ˜", answerNum: "5", answerAsk: "๋‹ค์Œ ์ค‘ โ€œํ•ฉ๋ชฉ์ •์„ฑโ€๊ณผ โ€œ์‹ฌ๋ฏธ์„ฑโ€ ์—์„œ๋„ ์กด์žฌํ•˜๋Š” ์ฐฝ์˜์  ๋””์ž์ธ ์กฐ๊ฑด์€?", answerChoice: [ "๊ฐ€. ๋…์ฐฝ์„ฑ", "๋‚˜. ์งˆ์„œ์„ฑ", "๋‹ค. ๊ฒฝ์ œ์„ฑ", "๋ผ. ์ตœ์†Œ์„ฑ", ], answerResult: "๊ฐ€. ๋…์ฐฝ์„ฑ", answerEx: "์ •๋‹ต : 1
์ฐฝ์˜์  ๋””์ž์ธ ์กฐ๊ฑด์€ ๋…์ฐฝ์„ฑ์ด๋‹ค." }, ]; const quizType = document.querySelector(".quiz__type"); // ๋ฌธ์ œ ์œ ํ˜• const quizQuestion = document.querySelector(".quiz__question"); // ๋ฌธ์ œ ๋ฒˆํ˜ธ, ์งˆ๋ฌธ const quizSelects = document.querySelector(".quiz__selects"); // ๊ฐ๊ด€์‹ ๋ณด๊ธฐ const quizResult = document.querySelector(".quiz__answer .result"); // ๋ฌธ์ œ ํ•ด์„ค const quizConfirm = document.querySelector(".quiz__answer .confirm"); // ์ •๋‹ต ํ™•์ธ ๋ฒ„ํŠผ const quizView = document.querySelector(".quiz__view"); // ๊ฐ•์•„์ง€ let quizCount = 0; // ๋ฌธ์ œ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜ ์ƒ์„ฑ let quizScore = 0; // ๋งž์ถ˜ ๋ฌธ์ œ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜ ์ƒ์„ฑ

๋ฌธ์ œ ์ถœ๋ ฅ

HTML ์š”์†Œ ์ค‘ ๋ณ€๊ฒฝ๋  ์‚ฌํ•ญ๋งŒ์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•˜์ž.
๊ทธ๋Ÿฐ ๋‹ค์Œ, ๋ฌธ์ œ๋ฅผ ์ถœ๋ ฅ์‹œ์ผœ์ฃผ๊ณ  ์ •๋‹ต ํ™•์ธ ๋ฒ„ํŠผ๊ณผ ํ•ด์„ค์„ ์ž ์‹œ ์ˆจ๊ฒจ์ฃผ๋„๋ก ํ•œ๋‹ค.

const updateQuiz = (index) => {
    const questionTag = `
        <span class="number">${quizInfo[index].answerNum}. </span>
        <div class="ask">${quizInfo[index].answerAsk}</div>
    `;
    const choiceTag = `
        <label for="select1">
            <input type="radio" id="select1" class="select" name="select" value="1">
            <span class="choice">${quizInfo[index].answerChoice[0]}</span>
        </label>
        <label for="select2">
            <input type="radio" id="select2" class="select" name="select" value="2">
            <span class="choice">${quizInfo[index].answerChoice[1]}</span>
        </label>
        <label for="select3">
            <input type="radio" id="select3" class="select" name="select" value="3">
            <span class="choice">${quizInfo[index].answerChoice[2]}</span>
        </label>
        <label for="select4">
            <input type="radio" id="select4" class="select" name="select" value="4">
            <span class="choice">${quizInfo[index].answerChoice[3]}</span>
        </label>
    `;
    // ๋ฌธ์ œ ์ถœ๋ ฅ
    quizType.innerHTML = quizInfo[index].answerType;    // ๋ฌธ์ œ ์œ ํ˜•
    quizQuestion.innerHTML = questionTag;           // ๋ฒˆํ˜ธ, ์งˆ๋ฌธ
    quizSelects.innerHTML = choiceTag;              // ๊ฐ๊ด€์‹ ๋ณด๊ธฐ
    quizResult.innerHTML = quizInfo[index].answerEx;    // ํ•ด์„ค

    const quizChoice = quizSelects.querySelectorAll(".choice");     // ๋ณด๊ธฐ ์„ ํƒํ•˜๋Š” ์„ ํƒ์ž ์ƒ์„ฑ

    for(let i = 0; i < quizChoice.length; i++) {
        quizChoice[i].setAttribute("onclick", "choiceSelected(this)");  // ํด๋ฆญํ•œ๊ฐ’ ์ €์žฅ
    }

    // ๋ฌธ์ œ, ํ•ด์„ค ์ˆจ๊ธฐ๊ธฐ
    quizResult.style.display ="none";
    quizConfirm.style.display ="none";
}
updateQuiz(quizCount);

์ •๋‹ต ํ™•์ธยท์ •๋‹ต ํ™•์ธ ๋ฒ„ํŠผยท๋งˆ์ง€๋ง‰ ๋ฌธ์ œ

์‚ฌ์šฉ์ž๊ฐ€ ์ฒดํฌํ•œ ์ •๋‹ต๊ณผ ์ง„์งœ ๋ฌธ์ œ์˜ ์ •๋‹ต ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  if(else)๋ฌธ์„ ํ†ตํ•ด ์ •๋‹ต์ผ ๊ฒฝ์šฐ์—๋Š” ๊ฐ•์•„์ง€๋ฅผ ๋ฏธ์†Œ์ง“๊ฒŒ, ์˜ค๋‹ต์ผ ๊ฒฝ์šฐ ๊ฐ•์•„์ง€๋ฅผ ์Šฌํ”„๊ฒŒ ๋งŒ๋“ค์ž. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ •๋‹ต ํ™•์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋‹ค์Œ ๋ฌธ์ œ๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๊ณ , ๋งˆ์ง€๋ง‰ ๋ฌธ์ œ์—์„œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด '์ด $๋ฌธ์ œ ์ค‘์— $ ๋ฌธ์ œ๋ฅผ ๋งž์ถค'์ด๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅ์‹œํ‚ค๋„๋ก ํ•œ๋‹ค.

const choiceSelected = (answer) => {
    let userAnswer = answer.textContent;    // ์‚ฌ์šฉ์ž๊ฐ€ ์ฒดํฌํ•œ ์ •๋‹ต
    let currentAnswer = quizInfo[quizCount].answerResult;   // ๋ฌธ์ œ ์ •๋‹ต

    // ์‚ฌ์šฉ์ž ์ฒดํฌํ•œ ๋‹ต๊ณผ ์ง„์งœ ๋ฌธ์ œ ์ •๋‹ต์ด ๊ฐ™๋‹ค๋ฉด...
    if(userAnswer == currentAnswer) {
        console.log("์ •๋‹ต");
        quizView.classList.add("like");
        quizScore++;    // ์ •๋‹ต ๊ฐœ์ˆ˜ ํ™•์ธ ํ›„ ๋ณ€์ˆ˜์— 1์”ฉ ๋”ํ•ด์คŒ
    } else {
        console.log("์˜ค๋‹ต");
        quizView.classList.add("dislike");
        quizResult.style.display = "block";     // ํ•ด์„ค ๋ณด์ด๊ฒŒ ํ•จ 
    }
    quizConfirm.style.display = "block";        // ๋‹ค์Œ๋ฌธ์ œ ๋ฒ„ํŠผ ๋ณด์ด๊ฒŒ ํ•จ
}

// ์ •๋‹ต ํ™•์ธ ๋ฒ„ํŠผ
const answerQuiz = () => {
    // ๋งˆ์ง€๋ง‰ ๋ฌธ์ œ
    if(quizInfo.length -1 == quizCount) {
        quizConfirm.textContent = `์ด ${quizInfo.length} ๋ฌธ์ œ ์ค‘์— ${quizScore} ๋ฌธ์ œ๋ฅผ ๋งž์ถค`;
    }
    quizCount++;    // ๋ฌธ์ œ๋ฅผ ๋‹ค ํ’€๋ฉด ๋‹ค์Œ ๋ฌธ์ œ๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๋ฌธ์ œ ๋ฒˆํ˜ธ ๋”ํ•ด์คŒ
    updateQuiz(quizCount);  
    quizView.classList.remove("like", "dislike");   //๋‹ค์Œ๋ฌธ์ œ ๊ฐ”์„ ๋•Œ ๊ฐ•์•„์ง€ ํ‘œ์ • ๋ฆฌ์…‹   
}
quizConfirm.addEventListener("click", answerQuiz);
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


Reference Book

JavaScript
HTML
CSS
๊ด‘๊ณ  ์ค€๋น„์ค‘์ž…๋‹ˆ๋‹ค.