๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Javascript Effect

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ€ด์ฆˆ ํšจ๊ณผ : ๊ฐ๊ด€์‹(์—ฌ๋Ÿฌ ๋ฌธ์ œ) ์œ ํ˜• : ์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ 2013๋…„ 2ํšŒ ๊ธฐ์ถœ 60๋ฌธ์ œ

by ์ฝ”ํŒŒ์นด 2022. 8. 24.
728x90

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ : ํ€ด์ฆˆ ํšจ๊ณผ : ์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ 2015๋…„ 2ํšŒ ๊ธฐ์ถœ ๋ฌธ์ œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋‹ค์–‘ํ•œ ํšจ๊ณผ๋“ค ์ค‘, ํ€ด์ฆˆ๋ฅผ ๋งžํž ์ˆ˜ ์žˆ๋Š” ํ€ด์ฆˆ ํšจ๊ณผ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ค‘์—์„œ๋„, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌธ์ œ์˜ ๊ฐ๊ด€์‹ ์ •๋‹ต์„ ์„ ํƒํ•˜๋Š” ํ€ด์ฆˆ ์œ ํ˜•์„ ์ž‘์—…ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๊ฐ๊ด€์‹(์—ฌ๋Ÿฌ ๋ฌธ์ œ) ์œ ํ˜•

์˜ˆ์‹œ๋Š” ์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ์˜ ํ•„๊ธฐ ์‹œํ—˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ๋งžํžˆ๋ฉด ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉฐ ๊ฐ•์•„์ง€ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๊ธฐ๋ปํ•˜๊ณ , ์ •๋‹ต์„ ๋งžํžˆ์ง€ ๋ชปํ•˜๋ฉด ์Šฌํผํ•˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ์ž…๋ ฅ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ๋‹ค ํ‘ผ ๋’ค '์ •๋‹ต ํ™•์ธํ•˜๊ธฐ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋งžํžŒ ๋ฌธ์ œ์˜ ๊ฐฏ์ˆ˜์™€ ์ ์ˆ˜, ํ•ฉ/๋ถˆํ•ฉ๊ฒฉ ์—ฌ๋ถ€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

// ๋ฌธ์ œ ์ •๋ณด : ๋ฐฐ์—ด ์•ˆ์— ๊ฐ์ฒด๋ฅผ ๋„ฃ์€ ํ˜•ํƒœ๋กœ ๊ฐ ๋ฌธ์ œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
const quizInfo = [
    {
        answerType: "์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ 2015๋…„ 2ํšŒ",
        answerNum: "1",
        answerAsk: "์ผ๋ฐ˜์ ์œผ๋กœ ํ™˜๊ฒฝ ๋””์ž์ธ์˜ ์ข…๋ฅ˜์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์€?",
        answerChoice: {
            1: "๊ฐ€์ „์ œํ’ˆ ๋””์ž์ธ",
            2: "์ŠคํŠธ๋ฆฌํŠธ ํผ๋‹ˆ์ฒ˜ ๋””์ž์ธ",
            3: "๊ธฐ์—…์ด๋ฏธ์ง€ ๋””์ž์ธ",
            4: "์บ˜๋ฆฐ๋” ๋””์ž์ธ"
        },
        answerResult: "2",
        answerEx: "ํ™˜๊ฒฝ ๋””์ž์ธ์˜ ์ข…๋ฅ˜์—๋Š” ์ธํ…Œ๋ฆฌ์–ด ๋””์ž์ธ, ๋””์Šคํ”Œ๋ ˆ์ด ๋””์ž์ธ, ์ŠคํŠธ๋ฆฌํŠธ ํผ๋‹ˆ์ณ ๋””์ž์ธ, ๋ฌด๋Œ€ ๋””์ž์ธ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค."
    },
    {
        answerType: "์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ 2015๋…„ 2ํšŒ",
        answerNum: "2",
        answerAsk: "๋””์ž์ธ์˜ ์›๋ฆฌ์—์„œ ์œจ๋™์— ํ•ด๋‹น๋˜๋Š” ๊ฒƒ์€?",
        answerChoice: {
            1: "์œ ์‚ฌ, ๋Œ€๋น„",
            2: "๋Œ€์นญ, ๋น„๋ก€",
            3: "ํ†ต์ผ, ๋ณ€ํ™”",
            4: "์ ์ด, ๋ฐ˜๋ณต"
        },
        answerResult: "4",
        answerEx: "์œจ๋™์˜ ์›๋ฆฌ๋Š” ๋ฐ˜๋ณต๊ณผ ๊ต์ฐจ, ์ ์ด(์ ์ฆ), ๋ฐฉ์‚ฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค."
    },
    {
        answerType: "์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ 2015๋…„ 2ํšŒ",
        answerNum: "3",
        answerAsk: "๋ถˆํˆฌ๋ช…ํ•œ ๋ฌผ์ฒด๊ฐ€ ๋น›์„ ๋ฐ˜์‚ฌ์‹œํ‚ด์œผ๋กœ์จ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌผ์ฒด์˜ ์ƒ‰์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€?",
        answerChoice: {
            1: "๊ด‘์›์ƒ‰",
            2: "์กฐ๋ช…์ƒ‰",
            3: "๊ฒฝ์˜์ƒ‰",
            4: "ํ‘œ๋ฉด์ƒ‰"
        },
        answerResult: "4",
        answerEx: "๋ถˆํˆฌ๋ช…ํ•œ ๋ฌผ์ฒด๊ฐ€ ๋น›์„ ๋ฐ˜์‚ฌ์‹œํ‚ด์œผ๋กœ์จ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌผ์ฒด์˜ ์ƒ‰์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ํ‘œ๋ฉด์ƒ‰์ž…๋‹ˆ๋‹ค."
    },
    {
        answerType: "์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ 2015๋…„ 2ํšŒ",
        answerNum: "4",
        answerAsk: "๋ถ€๋ถ„๊ณผ ๋ถ€๋ถ„ ๋˜๋Š” ๋ถ€๋ถ„๊ณผ ์ „์ฒด ์‚ฌ์ด์— ์•ˆ์ •๋œ ๊ด€๋ จ์„ฑ์„ ์ง€๋‹ˆ๋ฉฐ ์„œ๋กœ ํ•จ๊ป˜ ์†ํ•ด์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋””์ž์ธ ์›๋ฆฌ๋Š”?",
        answerChoice: {
            1: "๋น„๋ก€",
            2: "์กฐํ™”",
            3: "๊ท ํ˜•",
            4: "๊ฐ•์กฐ"
        },
        answerResult: "2",
        answerEx: "๋ถ€๋ถ„๊ณผ ๋ถ€๋ถ„ ๋˜๋Š” ๋ถ€๋ถ„๊ณผ ์ „์ฒด ์‚ฌ์ด์— ์•ˆ์ •๋œ ๊ด€๋ จ์„ฑ์„ ์ง€๋‹ˆ๋ฉฐ ์„œ๋กœ ํ•จ๊ป˜ ์†ํ•ด์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋””์ž์ธ ์›๋ฆฌ๋Š” ์กฐํ™”์ž…๋‹ˆ๋‹ค."
    },
    {
        answerType: "์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ 2015๋…„ 2ํšŒ",
        answerNum: "5",
        answerAsk: "์ €์šธ ์œ„์— ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ์›์ด ๋‘ ๊ฐœ ์žˆ๊ณ , ํฌ๊ธฐ๊ฐ€ ํฐ ์› ์ชฝ์œผ๋กœ ์ €์šธ์ด ๊ธฐ์šธ์–ด์ ธ ์žˆ๋Š” ํ˜•์ƒ๊ณผ ๊ด€๋ จ๋œ ๋””์ž์ธ ์›๋ฆฌ๋Š”?",
        answerChoice: {
            1: "์กฐํ™”",
            2: "๊ฐ•์กฐ",
            3: "์œจ๋™",
            4: "๋น„๋Œ€์นญ"
        },
        answerResult: "4",
        answerEx: "๋‘ ๊ฐœ์˜ ๊ณต์ด ๋Œ€์นญ์„ ์ด๋ฃจ์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋Š” ํ˜•์ƒ์ž…๋‹ˆ๋‹ค."
    }
    // ๋ธ”๋กœ๊ทธ์—๋Š” ์Šคํฌ๋กค ์••๋ฐ•์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์„ฏ ๋ฌธ์ œ์˜ ์Šคํฌ๋ฆฝํŠธ๋งŒ ์ฒจ๋ถ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
]

// ์„ ํƒ์ž
const quizWrap = document.querySelector(".quiz__wrap");
let quizScore = "";  // ์ •๋‹ต ์ˆ˜ (๊ฐ’์ด ๋ณ€ํ•˜๋ฏ€๋กœ let์œผ๋กœ ์„ ์–ธ)

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

    // ๋ฐฐ์—ด exam ์•ˆ์— push() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ€ด์ฆˆ ๋ฐ•์Šค 60๊ฐœ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
    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" class="select" id="select1${number}" name="select${number}" value="1">
                            <span class="choice">${question.answerChoice[1]}</span>
                        </label>
                        <label for="select2${number}">
                            <input type="radio" class="select" id="select2${number}" name="select${number}" value="2">
                            <span class="choice">${question.answerChoice[2]}</span>
                        </label>
                        <label for="select3${number}">
                            <input type="radio" class="select" id="select3${number}" name="select${number}" value="3">
                            <span class="choice">${question.answerChoice[3]}</span>
                        </label>
                        <label for="select4${number}">
                            <input type="radio" class="select" id="select4${number}" 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>
    `)
    quizWrap.innerHTML = exam.join('');  // 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;
        const quizView = document.querySelectorAll(".quiz__view");  // ๊ฐ•์•„์ง€

        if(userAnswer == question.answerResult){
            quizView[number].classList.add("like");
            quizScore++;  // ๋ฌธ์ œ๋ฅผ ๋งžํžŒ ๊ฐฏ์ˆ˜
        } else {
            quizView[number].classList.add("dislike");
            const divBox = document.createElement("div")  // ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ํƒœ๊ทธ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
            quizSelectsWrap.appendChild(divBox).innerHTML = `<p class="result">${question.answerEx}</p>`
            // appendChild : divBox๋ฅผ ์ž์‹์œผ๋กœ ๋„ฃ์Œ
        }
    });

    let totalScore = quizScore / quizInfo.length * 100;  // ์ ์ˆ˜ ๊ณ„์‚ฐ

    if(totalScore >= 60){
        document.querySelector(".ex").innerHTML = `${quizInfo.length} ๋ฌธ์ œ ์ค‘ ${quizScore}๊ฐœ ๋งžํžˆ์…จ์Šต๋‹ˆ๋‹ค. ์ ์ˆ˜๋Š” ${totalScore}์ ์ž…๋‹ˆ๋‹ค. ํ•ฉ๊ฒฉ์ž…๋‹ˆ๋‹ค!`
    } else {
        document.querySelector(".ex").innerHTML = `${quizInfo.length} ๋ฌธ์ œ ์ค‘ ${quizScore}๊ฐœ ๋งžํžˆ์…จ์Šต๋‹ˆ๋‹ค. ์ ์ˆ˜๋Š”${totalScore}์ ์ž…๋‹ˆ๋‹ค. ๋ถˆํ•ฉ๊ฒฉ์ž…๋‹ˆ๋‹ค.`
    }
}

// ์ •๋‹ต ํด๋ฆญ
document.querySelector(".quiz__confirm .check").addEventListener("click", answerQuiz)  // ์ •๋‹ต์„ ํด๋ฆญํ•˜๋ฉด answerQuiz๋ฅผ ์‹คํ–‰
728x90

๋Œ“๊ธ€

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿฆ™

CSS
๊ด‘๊ณ  ์ค€๋น„์ค‘