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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ€ด์ฆˆ ํšจ๊ณผ : ๊ฐ๊ด€์‹(์—ฌ๋Ÿฌ ๋ฌธ์ œ ์œ ํ˜•) : ์Šฌ๋ผ์ด๋“œ ํ˜•์‹

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ : ํ€ด์ฆˆ ํšจ๊ณผ : ์Šฌ๋ผ์ด๋“œ ํ˜•์‹

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


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

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

// ๋ฌธ์ œ ์ •๋ณด
const quizInfo = [
    {
        answerType: "์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ 2013๋…„ 01ํšŒ",
        answerNum: "6",
        answerAsk: "์„œ๋กœ ๋‹ค๋ฅธ ์ƒ‰๋ผ๋ฆฌ์˜ ์˜ํ–ฅ์œผ๋กœ ์ธํ•˜์—ฌ ๋ฐ์€ ์ƒ‰์€ ๋” ๋ฐ๊ฒŒ ์–ด๋‘์šด ์ƒ‰์€ ๋” ์–ด๋‘ก๊ฒŒ ๋ณด์ด๋Š” ๋Œ€๋น„๋Š”?",
        answerChoice: [
            "์ƒ‰์ƒ๋Œ€๋น„",
            "๋ช…๋„๋Œ€๋น„",
            "์ฑ„๋„๋Œ€๋น„",
            "๊ณ„์‹œ๋Œ€๋น„"
        ],
        answerResult: "๋ช…๋„๋Œ€๋น„",
        answerEx: "์–ด๋‘ก๊ณ  ๋ฐ๋‹ค๋ผ๋Š” ์–ธ๊ธ‰์€ ๋ช…๋„๋ฅผ ์˜์‹ฌํ•˜์…”์•ผ ๋ฉ๋‹ˆ๋‹ค."
    },
    {
        answerType: "์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ 2013๋…„ 01ํšŒ",
        answerNum: "7",
        answerAsk: "๋””์ž์ธ ์›๋ฆฌ ์ค‘ ์œจ๋™(Rhythm)์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€?",
        answerChoice: [
            "๋น„๋ก€",
            "๋ฐ˜๋ณต",
            "๊ฐ•์กฐ",
            "์ ์ด"
        ],
        answerResult: "๋น„๋ก€",
        answerEx: "์œจ๋™์˜ ํšจ๊ณผ๋Š” ๊ฐ•ํ•œ ํž˜๊ณผ ์•ฝํ•œ ํž˜์ด '๊ทœ์น™์ '์œผ๋กœ ์ƒ๊ฒจ๋‚˜๋Š” '์›€์ง์ž„' ์ž…๋‹ˆ๋‹ค. ๋น„๋ก€๋ž‘์€ ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค."
    },
    {
        answerType: "์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ 2013๋…„ 01ํšŒ",
        answerNum: "8",
        answerAsk: "์–ด๋‘ ์ด ์‹œ์ž‘๋  ๋•Œ ๋ฌผ์ฒด์˜ ์ƒ์ด ํ๋ฆฌ๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ํ˜„์ƒ๊ณผ ๊ฐ€์žฅ ๊ด€๊ณ„๊ฐ€ ๊นŠ์€ ๊ฒƒ์€?",
        answerChoice: [
            "์ƒ‰์ˆœ์‘",
            "ํ‘ธ๋ฅดํ‚จ์˜ˆ ํ˜„์ƒ",
            "๋ฐ•๋ช…์‹œ",
            "์กฐ๊ฑด๋“ฑ์ƒ‰"
        ],
        answerResult: "๋ฐ•๋ช…์‹œ",
        answerEx: "๋ช…์ˆœ์‘์€ ์–ด๋‘์šด -> ๋ฐ์€๊ณณ ๊ฐˆ ๋•Œ ๋ˆˆ์˜ ์ ์‘ ์•”์ˆœ์‘์€ ๋ฐ์€ -> ์–ด๋‘์šด ๊ณณ ๊ฐˆ ๋•Œ ๋ˆˆ์˜ ์ ์‘์ž…๋‹ˆ๋‹ค. ๋ฐ•๋ช…์‹œ๋ž€ ๊ทธ ์ค‘๊ฐ„์— ๋ˆˆ์˜ ์ ์‘์ž…๋‹ˆ๋‹ค. ๊ทธ ์ƒํƒœ์—์„  ๋ฌผ์ฒด๊ฐ€ ํ๋ฆฌ๊ฒŒ ๋ณด์—ฌ์š”"
    },
    {
        answerType: "์›น๋””์ž์ธ ๊ธฐ๋Šฅ์‚ฌ 2013๋…„ 01ํšŒ",
        answerNum: 11,
        answerAsk: "์ŠคํŒŒํŠธ(spot) ๊ด‘๊ณ ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์˜ณ์€ ๊ฒƒ์€?",
        answerChoice: [
            "์ „๊ตญ ๋ฐฉ์†ก๋ง์œผ๋กœ ๋ฐฉ์†ก๊ตญ์—์„œ ์ „๊ตญ์— ์‹ค์‹œํ•˜๋Š” ๊ด‘๊ณ ",
            "์ผ์ •์‹œ๊ฐ„์„ ์ •ํ•ด 30์ดˆ CM 10๊ฐœ๋ฅผ ๊ณ„์† ๋ฐฉ์†กํ•˜๋Š” ํ˜•ํƒœ",
            "์ง€์—ญ ๋ฐฉ์†ก๊ตญ์— ์ œํ•œ๋˜์–ด ๋ฐฉ์†กํ•˜๋Š” ๊ฒƒ",
            "ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์ด์— ๊ด‘๊ณ ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ",
        ],
        answerResult: "ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์ด์— ๊ด‘๊ณ ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ",
        answerEx: "๊ธฐ์–ตํ•ด์ฃผ์„ธ์š” spot ๊ด‘๊ณ ๋ž€ '๋ผ๋””์˜ค๋‚˜ ํ…”๋ ˆ๋น„์ „ ๋ฐฉ์†ก์—์„œ, ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์ด ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ง„ํ–‰ ์ค‘์— ์•„์ฃผ ์งง๊ฒŒ ๋‚˜๊ฐ€๋Š” ๊ด‘๊ณ ' ์ž…๋‹ˆ๋‹ค.",
    },
    {
        answerType: "์›น๋””์ž์ธ ๊ธฐ๋Šฅ์‚ฌ 2013๋…„ 01ํšŒ",
        answerNum: 15,
        answerAsk: "๋‹ค์Œ ์ค‘ ๊ตฟ ๋””์ž์ธ(Good Design)์˜ ์กฐ๊ฑด์ด ์•„๋‹Œ ๊ฒƒ์€?",
        answerChoice: [
            "์‹ฌ๋ฏธ์„ฑ",
            "๋…์ฐฝ์„ฑ",
            "๋Œ€์ค‘์„ฑ",
            "๊ฒฝ์ œ์„ฑ",
        ],
        answerResult: "๋Œ€์ค‘์„ฑ",
        answerEx: "๊ตฟ๋””์ž์ธ 4๊ฐ€์ง€ ์™ธ์šฐ์„ธ์š” : ์‹ฌ๋ฏธ์„ฑ, ๋…์ฐฝ์„ฑ, ํ•ฉ๋ชฉ์ ์„ฑ, ๊ฒฝ์ œ์„ฑ ์ž…๋‹ˆ๋‹ค.",
    }
]

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;  // ๋งžํžŒ ๋ฌธ์ œ ๊ฐฏ์ˆ˜

const updateQuiz = (index) => {  // ํ€ด์ฆˆ ์œ ํ˜•, ๋ฌธ์ œ, ๋ณด๊ธฐ ์ˆœ์œผ๋กœ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด์„ ํ™œ์šฉํ•ด ๊ฐ๊ฐ์˜ ๋ฌธ์ œ๋ฅผ ์‚ฝ์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.
    const quizTag = `
        <div>${quizInfo[index].answerType}</div>
    `;
    const questionTag = `
        <span class="number">${quizInfo[index].answerNum}. </span>
        <div class="ask">${quizInfo[index].answerAsk}</div>
    `;
    const choiceTag = `
        <label for="select1">
            <input type="radio" class="select" id="select1" name="select" value="1">
            <span class="choice">${quizInfo[index].answerChoice[0]}</span>
        </label>
        <label for="select2">
            <input type="radio" class="select" id="select2" name="select" value="2">
            <span class="choice">${quizInfo[index].answerChoice[1]}</span>
        </label>
        <label for="select3">
            <input type="radio" class="select" id="select3" name="select" value="3">
            <span class="choice">${quizInfo[index].answerChoice[2]}</span>
        </label>
        <label for="select4">
            <input type="radio" class="select" id="select4" 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);

const choiceSelected = (answer) => {
    let userAnswer = answer.textContent;  // ์‚ฌ์šฉ์ž๊ฐ€ ์ฒดํฌํ•œ ์ •๋‹ต
    let currentAnswer = quizInfo[quizCount].answerResult;  // ๋ฌธ์ œ์˜ ์ •๋‹ต
    if(userAnswer == currentAnswer){
        quizView.classList.add("like");
        quizScore++;
    } else {
        quizView.classList.add("dislike");
        quizResult.style.display = "block";
    }
    quizConfirm.style.display = "block";
}

// ์ •๋‹ต ํ™•์ธ ๋ฒ„ํŠผ
const answerQuiz = () => {
    totalScore = quizScore * 100 / quizInfo.length;  // ์ ์ˆ˜ ๊ณ„์‚ฐํ•˜๊ธฐ
    if(quizInfo.length -1 == quizCount){
        if(totalScore >= 60){
            quizConfirm.textContent = `์ด ${quizInfo.length}๋ฌธ์ œ ์ค‘์— ${quizScore}๋ฌธ์ œ๋ฅผ ๋งžํ˜”์Šต๋‹ˆ๋‹ค. ${totalScore}์ ์ž…๋‹ˆ๋‹ค. ํ•ฉ๊ฒฉ์ž…๋‹ˆ๋‹ค!`
        } else {
            quizConfirm.textContent = `์ด ${quizInfo.length}๋ฌธ์ œ ์ค‘์— ${quizScore}๋ฌธ์ œ๋ฅผ ๋งžํ˜”์Šต๋‹ˆ๋‹ค. ${totalScore}์ ์ž…๋‹ˆ๋‹ค. ๋ถˆํ•ฉ๊ฒฉ์ž…๋‹ˆ๋‹ค.`
        }
    }
    
    quizCount++;
    updateQuiz(quizCount);
    quizView.classList.remove("like", "dislike");
    // ๋งˆ์ง€๋ง‰ ๋ฌธ์ œ
}

quizConfirm.addEventListener("click", answerQuiz);
728x90

๋Œ“๊ธ€

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

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