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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ : ๊ฒ€์ƒ‰ ํšจ๊ณผ : ๊ฒ€์ƒ‰ ๊ฒŒ์ž„

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ : ๊ฒ€์ƒ‰ ํšจ๊ณผ : ๊ฒ€์ƒ‰ ๊ฒŒ์ž„

์ง€๊ธˆ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ ํšจ๊ณผ๋ฅผ ์ž‘์—…ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” CSS ์†์„ฑ์„ ์ง์ ‘ ํƒ€์ดํ•‘ํ•˜์—ฌ ์ œํ•œ ์‹œ๊ฐ„ ์•ˆ์— ๋งžํžˆ๋Š” ๊ฒ€์ƒ‰ ๊ฒŒ์ž„์„ ๋งŒ๋“ค์–ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


1. ์„ ํƒ์ž ์ž‘์—…ํ•˜๊ธฐ

const searchTime = document.querySelector(".time span");
const searchList = document.querySelector(".search__list");
const searchAnswers = document.querySelector(".search__answers");
const searchMissAnswers = document.querySelector(".search__missAnswers");
const searchStart = document.querySelector(".search__box .start");
const searchInput = document.querySelector("#search");
const searchAudio = document.querySelector("#audio");
const musicPlay = document.querySelector(".search__audio .play");
const musicStop = document.querySelector(".search__audio .stop");
const searchScoreNow = document.querySelector(".search__info .now");
const searchResult = document.querySelector(".search__result .result");
const searchResultWrap = document.querySelector(".search__result");
const searchRestart = document.querySelector(".search__result .restart");

let timeReamining = 120,    // ์ œํ•œ ์‹œ๊ฐ„
    timeInterval = "",  // ๋‚จ์€ ์‹œ๊ฐ„
    score = 0,  // ์ ์ˆ˜
    answers = {};   // ์ƒˆ๋กœ์šด ์ •๋‹ต

๋Š˜ ๊ทธ๋ž˜์™”๋“ฏ์ด... ์„ ํƒ์ž๋ฅผ ๋จผ์ € ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ๊ฒŒ์ž„๊ณผ ๊ด€๋ จ๋œ ๋ณ€์ˆ˜๋“ค๋„ ํ•จ๊ป˜ ์„ ์–ธํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

2. ์†์„ฑ ์ถœ๋ ฅํ•˜๊ธฐ

const cssProperty = [
    { num: 1, name: "accent-color", desc: " ์š”์†Œ์˜ ๊ฐ•์กฐ ์ƒ‰์ƒ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. " },
    { num: 2, name: "align-content", desc: " ์ฝ˜ํ…์ธ  ์‚ฌ์ด์™€ ์ฝ˜ํ…์ธ  ์ฃผ์œ„ ๋นˆ ๊ณต๊ฐ„์„ ํ”Œ๋ ‰์Šค ๋ฐ•์Šค์˜ ๊ต์ฐจ์ถ• ๋˜๋Š” ๊ทธ๋ฆฌ๋“œ์˜ ๋ธ”๋ก ์ถ•์„ ๋”ฐ๋ผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { num: 3, name: "align-items", desc: " ๊ต์ฐจ์ถ•์—์„œ ์•„์ดํ…œ ์ •๋ ฌ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ flex์—์„œ item๋“ค์„ ์ •๋ ฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค." },
    { num: 4, name: "align-self", desc: " ํŠน์ • item์˜ ์ •๋ ฌ์„ ๋”ฐ๋กœ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค." },
    { num: 5, name: "all", desc: " CSS ์‚ฌ์šฉ์ž ์ง€์ • ์†์„ฑ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์†์„ฑ์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊นƒ๊ฐ’, ์ƒ์†๊ฐ’, ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ์Šคํƒ€์ผ์‹œํŠธ ์ถœ์ฒ˜์˜ ๊ฐ’๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค." },
    { num: 6, name: "animation", desc: " ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๊ด€๋ จ๋œ ์†์„ฑ์„ ์ผ๊ด„์ ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค." },
    { num: 7, name: "animation-delay", desc: " ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { num: 8, name: "animation-direction", desc: " ์• ๋‹ˆ๋ฉ”์ด์…˜ ์›€์ง์ž„ ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { num: 9, name: "animation-duration", desc: " ์• ๋‹ˆ๋ฉ”์ด์…˜ ์›€์ง์ธ ์‹œ๊ฐ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { num: 10, name: "animation-fill-mode", desc: " ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋๋‚œ ํ›„์˜ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { num: 11, name: "animation-iteration-count", desc: " ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { num: 12, name: "animation-name", desc: " ์• ๋‹ˆ๋ฉ”์ด์…˜ keyframe ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { num: 13, name: "animation-play-state", desc: " ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ง„ํ–‰์ƒํƒœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { num: 14, name: "animation-timeline", desc: " ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ํƒ€์ž„๋ผ์ธ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { num: 15, name: "animation-timing-function", desc: " ์• ๋‹ˆ๋ฉ”์ด์…˜ ์›€์ง์ž„์˜ ์†๋„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { num: 16, name: "appearance", desc: " ์šด์˜์ฒด์ œ ๋ฐ ๋ธŒ๋ผ์šฐ์ €์— ๊ธฐ๋ณธ์ ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ํ…Œ๋งˆ๋ฅผ ๊ธฐ๋ฐ˜๋กœ ์š”์†Œ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค." },
    { num: 17, name: "aspect-ratio", desc: " ์š”์†Œ์˜ ํฌ๊ธฐ๋ฅผ ๋น„์œจ๋Œ€๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค." },
    { num: 18, name: "backdrop-filter", desc: " ์š”์†Œ ๋’ค ์˜์—ญ์— ํ๋ฆผ์ด๋‚˜ ์ƒ‰์ƒ ์‹œํ”„ํŠธ ๋“ฑ ๊ทธ๋ž˜ํ”ฝ ํšจ๊ณผ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค." },
    { num: 19, name: "backface-visibility", desc: " ์š”์†Œ์˜ ๋’ท์ชฝ์—์„œ ์•ž๋ฉด์ด ๋ณด์ด๊ฒŒ ํ• ์ง€ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค." },
    { num: 20, name: "background", desc: " ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์†์„ฑ์„ ์ผ๊ด„์ ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. " }
    <-- ์ƒ๋žต -->
]
document.querySelector(".search__info span").innerHTML = cssProperty.length;
function updateList(){
    cssProperty.forEach(data => {
        searchList.innerHTML += `${data.name}`;
    })
}
updateList();

์†์„ฑ์„ ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด๋กœ ์ž‘์„ฑํ•ด ์ฃผ๊ณ , ์ถœ๋ ฅํ•ด ์ค๋‹ˆ๋‹ค. ์ „์ฒด ์†์„ฑ์˜ ๊ฐœ์ˆ˜๋„ ํ•จ๊ป˜ ์ถœ๋ ฅํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

3. BGM ์ž‘์—…ํ•˜๊ธฐ

function music(){
    musicStop.addEventListener("click", () => {
        musicStop.style.display = "none";
        musicPlay.style.display = "block";
        searchAudio.pause();
    })
    musicPlay.addEventListener("click", () => {
        musicPlay.style.display = "none";
        musicStop.style.display = "block";
        searchAudio.play();
    })
    searchAudio.play();
}

์Œ์•…์— ์‚ฌ์šฉํ•  BGM์„ ์ž‘์—…ํ•ด ์ค๋‹ˆ๋‹ค. ์˜ค๋””์˜ค ๊ด€๋ จ ๋ฒ„ํŠผ์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์Œ์•…์ด ์žฌ์ƒ๋˜๊ณ  ์žˆ์„ ๋•Œ์—๋Š” ์Œ์•… ์ •์ง€ ๋ฒ„ํŠผ๋งŒ์ด ๋‚˜ํƒ€๋‚˜๋ฉฐ, ์ •์ง€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์Œ์•…์ด ์ •์ง€๋˜๊ณ , ๋‹ค์‹œ ์žฌ์ƒ ๋ฒ„ํŠผ๋งŒ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

4. ์ •๋‹ต ์ฒดํฌํ•˜๊ธฐ

function checkInput(){
    let input = event.currentTarget.value.trim().toLowerCase();
    if(answers.hasOwnProperty(input) && !answers[input]){
        answers[input] = true;
        // ์ •๋‹ต ํ‘œ์‹œ
        searchAnswers.style.display = "block";
        searchAnswers.innerHTML += `<span>${input}</span>`;
        // ์ ์ˆ˜ ๋ฐ˜์˜
        score++;
        searchScoreNow.innerText = score;
        // ์ •๋‹ต ์ดˆ๊ธฐํ™”
        searchInput.value = "";
    }
}
function checkAnswers() {
    cssProperty.forEach(item => {
        let answer = item.name.trim().toLocaleLowerCase();
        answers[answer] = false;
    });
}
searchInput.addEventListener("input", checkInput);

์ •๋‹ต์„ ์ฒดํฌํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ input์— ์ž…๋ ฅํ•œ ๊ฐ’์„ value๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. checkInput ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ CSS ์†์„ฑ๋“ค๊ณผ ๋น„๊ตํ•˜๊ณ , ์ผ์น˜ํ•  ๊ฒฝ์šฐ(์ •๋‹ต์ผ ๊ฒฝ์šฐ) ์•„๋ž˜์— ํ•ด๋‹น ์†์„ฑ์„ ํ‘œ์‹œํ•ด ์ฃผ๊ณ , ์ ์ˆ˜๋ฅผ 1์  ์˜ฌ๋ฆฌ๋ฉฐ, input์„ ๋น„์›Œ์ค๋‹ˆ๋‹ค.
๋˜, input์— ๊ฐ’์ด ์ž…๋ ฅ๋˜์—ˆ์„ ๋•Œ, checkInput() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์ด๋ฒคํŠธ ์ž‘์—…์„ ํ•ด ์ค๋‹ˆ๋‹ค.

5. ์ œํ•œ ์‹œ๊ฐ„ ์„ค์ •ํ•˜๊ธฐ

function reduceTime(){
    timeReamining--;
    if(timeReamining == 0) endQuiz();
    searchTime.innerText = displayTime();
}
function displayTime(){
    if(timeReamining <= 0){
        return "0:00";
    } else {
        let minutes = Math.floor(timeReamining / 60);
        let seconds = timeReamining % 60;
        if(seconds < 10) seconds = "0" + seconds;
        return minutes + ":" + seconds;
    }
}

๊ฒŒ์ž„์ด๋‹ˆ ์ œํ•œ ์‹œ๊ฐ„๋„ ์žˆ์–ด์•ผ๊ฒ ์ฃ ? reduceTime() ํ•จ์ˆ˜๋Š” ์ดํ›„ setInterval์„ ์ด์šฉํ•˜์—ฌ 1์ดˆ์— ํ•œ ๋ฒˆ์”ฉ ์‹คํ–‰์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. timeReamining์˜ ๊ฐ’์€ 120์œผ๋กœ, ์ฒ˜์Œ์— ์„ ํƒ์ž ์ž‘์—…์„ ํ•  ๋•Œ ์„ค์ •ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. 1์ดˆ์— ํ•œ ๋ฒˆ์”ฉ ๊ฐ’์„ 1์”ฉ ์ค„์—ฌ์ฃผ๊ณ , 0์ด ๋˜์—ˆ์„ ๋•Œ ๊ฒŒ์ž„์ด ๋๋‚˜๋„๋ก ํ•˜๊ณ , ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•ด ์ฃผ๋„๋ก ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
displayTime() ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ, 120, 119 ๋“ฑ์˜ ์ˆซ์ž๋ฅผ 2:00, 1:59 ๋“ฑ์œผ๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

6. ๊ฒŒ์ž„ ์‹œ์ž‘ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

function startQuiz(){
    searchStart.style.display = "none";  // ์‹œ์ž‘ ๋ฒ„ํŠผ ์ˆจ๊ธฐ๊ธฐ
    searchList.style.display = "none";   // ์ •๋‹ต๋“ค ์ˆจ๊ธฐ๊ธฐ

    searchAnswers.innerHTML = "";  // ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”
    searchMissAnswers.innerHTML = "";

    timeInterval = setInterval(reduceTime, 1000);  // ์ œํ•œ ์‹œ๊ฐ„ ์„ค์ •
    music();  // ์Œ์•…
    let score = 0;  // ์ ์ˆ˜ ๊ณ„์‚ฐ
    checkAnswers();  // ์ •๋‹ต ์ฒดํฌ
}
searchStart.addEventListener("click", startQuiz);

์ด์ œ, ๊ฒŒ์ž„ ์‹œ์ž‘ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด, ์ง€๊ธˆ๊นŒ์ง€ ์ž‘์—…ํ•œ ํ•จ์ˆ˜๋“ค์ด ์‹คํ–‰๋˜๋„๋ก ์ž‘์—…ํ•ด ์ค๋‹ˆ๋‹ค.

7. ์˜ค๋‹ต ๋ณด์—ฌ์ฃผ๊ธฐ

function missAnswers(){
    searchMissAnswers.style.display = "block";

    cssProperty.forEach(item => {
        let answer = item.name.trim().toLocaleLowerCase();
        if(answers[answer] == false){
            searchMissAnswers.innerHTML += `<span>${item.name}</span>`
        }
    })
}

๊ฒŒ์ž„์ด ๋๋‚ฌ์„ ๋•Œ, ์˜ค๋‹ต๋“ค์„ ๋ชจ๋‘ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ์ž‘์—…ํ•ด ์ค๋‹ˆ๋‹ค.

8. ๊ฒŒ์ž„ ์˜ค๋ฒ„ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

function endQuiz(){
    searchStart.style.display = "block";  // ์‹œ์ž‘ ๋ฒ„ํŠผ
    searchStart.style.pointerEvents = "none";
    missAnswers();  // ์˜ค๋‹ต ๋ณด์—ฌ์ฃผ๊ธฐ
    searchAudio.pause();  // ์Œ์•… ์ •์ง€
    clearInterval(timeInterval);  // ์‹œ๊ฐ„ ์ •์ง€
    searchResultWrap.classList.add("show");  // ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
    let point = Math.round(score / cssProperty.length * 100);
    searchResult.innerHTML = `๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.<br>${cssProperty.length}๊ฐœ ์ค‘ ${score}๊ฐœ๋ฅผ ๋งžํ˜”์Šต๋‹ˆ๋‹ค.<br>์ ์ˆ˜๋Š” ${point}์ ์ž…๋‹ˆ๋‹ค.`;
}

์•ž์„œ, reduceTime() ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ œํ•œ ์‹œ๊ฐ„์ด ๋๋‚ฌ์„ ๋•Œ, endQuiz() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„์ด ๋๋‚˜๋ฉด ๋‹ค์‹œ ์‹œ์ž‘ ๋ฒ„ํŠผ์„ ๋ณด์—ฌ์ฃผ๊ณ , ๋ชจ๋“  ๊ฒƒ์ด ์ •์ง€๋˜๋ฉฐ, ์ ์ˆ˜์™€ ํ•จ๊ป˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

9. ๋‹ค์‹œ ์‹œ์ž‘ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

function restart(){
    searchResultWrap.classList.remove("show");
    searchAudio.play();
    startQuiz();
    timeReamining = 120;
    score = 0;
    searchScoreNow.innerText = 0;
}
searchRestart.addEventListener("click", restart);

๊ฒŒ์ž„์ด ๋๋‚œ ์ดํ›„, ๋‹ค์‹œ ์‹œ์ž‘ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ์˜ ํ•จ์ˆ˜๋ฅผ ์ž‘์—…ํ•ด ์ฃผ๋ฉด ๋์ž…๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์‹œ์ž‘ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ์™€ ๊ฐ™์ด, ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด ์ค๋‹ˆ๋‹ค.


๊ฒฐ๊ณผ

728x90

๋Œ“๊ธ€

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

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