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

[Search Effect] ๊ฒ€์ƒ‰ ์ดํŽ™ํŠธ 06

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

๊ฒ€์ƒ‰ ์ดํŽ™ํŠธ ๋งŒ๋“ค๊ธฐ 06

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ๊ทธ ๋™์•ˆ ๋ฐฐ์› ๋˜ JavaScript๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ ์ดํŽ™ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด๋ฒˆ ํ•™์Šต ๋‚ด์šฉ์„ ์ž˜ ํ™œ์šฉํ•˜์—ฌ ๊ทธ๋™์•ˆ ๋ฐฐ์› ๋˜ CSS ์†์„ฑ๋“ค์„ ๊ฒ€์ƒ‰์ฐฝ ํ˜•์‹์œผ๋กœ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋„๋ก ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค. ๋‚˜์ค‘์— ๋ชจ๋ฅด๋Š” ๊ฒŒ ์ƒ๊ฒผ์„ ๋•Œ ๊ณต๋ถ€ํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ ๋ง์ด์ฃ !

์ž, ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”?


HTML ์†Œ์Šค ๋ณด๊ธฐ

๊ฒ€์ƒ‰ ์ดํŽ™ํŠธ 06์˜ HTML ์†Œ์Šค์™€ ๋ถ€์—ฐ ์„ค๋ช…(์ฃผ์„ ์ฒ˜๋ฆฌ๋จ)์ด๋‹ค.
CSS ์†Œ์Šค๋ฅผ ํ•จ๊ป˜ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ๋งจ ์•„๋ž˜์˜ 'CSS ์†Œ์Šค ๋ณด๊ธฐ' ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๊ฒƒ.

<body>
    <header id="header">
        <h1>Search</h1>
        <nav>
            <ul>
                <li><a href="searchEffect01.html">01</a></li>
                <li><a href="searchEffect02.html">02</a></li>
                <li><a href="searchEffect03.html">03</a></li>
                <li><a href="searchEffect04.html">04</a></li>
                <li><a href="searchEffect05.html">05</a></li>
                <li class="active"><a href="searchEffect06.html">06</a></li>
            </ul>
        </nav>
    </header>
    <!-- // header -->

    <main id="main">
        <div class="search__wrap">
            <span>sort(), reverse()๋ฅผ ์ด์šฉํ•˜์—ฌ ์ •๋ ฌํ•˜๊ธฐ</span>
            <h1>CSS ์†์„ฑ ์ •๋ ฌํ•˜๊ธฐ</h1>

            <div class="search__click">
                <ul>
                    <li><a href="#c" class="btn1">๋ฐ˜๋Œ€๋กœ ์ •๋ ฌ</a></li>
                    <li><a href="#c" class="btn2">๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ</a></li>
                    <li><a href="#c" class="btn3">์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ</a></li>
                    <li><a href="#c" class="btn4">์•ŒํŒŒ๋ฒณ์ˆœ(a~z)</a></li>
                    <li><a href="#c" class="btn5">์•ŒํŒŒ๋ฒณ์ˆœ(z~a)</a></li>
                    <li><a href="#c" class="btn6">๋žœ๋ค ์ •๋ ฌ</a></li>
                </ul>
            </div>

            <div class="search__info">
                <div>์ „์ฒด ์†์„ฑ ๊ฐœ์ˆ˜ : <span class="num">0</span></div>
            </div>

            <div class="search__list">
                <ul class="line">

                </ul>
            </div>
        </div>
    </main>
    <!-- // main -->

    <footer id="footer">
        <a href="mailto:kde66034@gmail.com">kde66034@gmail.com</a>
    </footer> 
    <!-- //footer -->
</body>

JavaScript ์†Œ์Šค ๋ณด๊ธฐ

๊ฒ€์ƒ‰ ์ดํŽ™ํŠธ 06์˜ JavaScript ์†Œ์Šค์™€ ๋ถ€์—ฐ ์„ค๋ช…(์ฃผ์„ ์ฒ˜๋ฆฌ๋จ)์ด๋‹ค. ์ƒ์ˆ˜ cssList์— CSS์˜ ์†์„ฑ๋“ค์„ ์ถœ๋ ฅํ•  ๊ณต๊ฐ„์„ ์ €์žฅํ•˜๊ณ , cssProp์—๋Š” ๋นˆ ๋ฐฐ์—ด์„ ์ €์žฅ์‹œํ‚จ ๋‹ค์Œ ์žฌ๋ฐฐ์น˜๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ๋ฐ˜๋Œ€ยท๋‚ด๋ฆผ์ฐจ์ˆœยท์˜ค๋ฆ„์ฐจ์ˆœยท์•ŒํŒŒ๋ฒณ(a-z/z-a)์ˆœ ์ •๋ ฌ ์Šคํฌ๋ฆฝํŠธ์™€ ๋ฒ„ํŠผ ํด๋ฆญ์‹œ ํ•ด๋‹น ์ •๋ ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก addEventListener๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋žœ๋ค ์ •๋ ฌ์˜ ๊ฒฝ์šฐ ํ”ผ์…” ์˜ˆ์ด์ธ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งœ๋„๋ก ํ•œ๋‹ค.

// CSS ์†์„ฑ ๋ฆฌ์ŠคํŠธ ์ €์žฅ
const cssProperty = [
    { num: 1, name: "accent-color", desc: "ํŠน์ • ์š”์†Œ์— ์ƒ‰์ƒ์„ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค." },
    { num: 2, name: "align-content", desc: "์ฝ˜ํ…์ธ  ์•„์ดํ…œ์˜ ์ƒํ•˜๊ด€๊ณ„ ์ •๋ ฌ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { num: 3, name: "align-items", desc: "์ฝ˜ํ…์ธ  ์•„์ดํ…œ์˜ ๋‚ด๋ถ€ ์ƒํ•˜๊ด€๊ณ„ ์ •๋ ฌ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
]

const cssList = document.querySelector(".search__list .line");      // css ์†์„ฑ๋“ค ์ถœ๋ ฅํ•  ๊ณต๊ฐ„
        
const cssProp = [];

// ๋ฐ์ดํ„ฐ ์ถœ๋ ฅํ•˜๊ธฐ
const updateList = () => {
    let listCSS = "";
    
    cssProperty.forEach((data, index) => {
        listCSS += `<li>${data.num}. <strong>${data.name}</strong> : ${data.desc}</li>`;
        cssProp.push(`<li>${data.num}. <strong>${data.name}</strong> : ${data.desc}</li>`);
    });
    cssList.innerHTML = listCSS;
}
updateList();

// ๋ฐ˜๋Œ€๋กœ ์ •๋ ฌ
function sortReverse(){
    cssProperty.reverse();
    updateList();
}

// ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
function sortDescending(){
    cssProperty.sort((a,b) => {
        return b.num - a.num;
    });
    updateList();
}

// ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
function sortAscending(){
    cssProperty.sort((a,b) => {
        return a.num - b.num;
    });
    updateList();
}

// ์•ŒํŒŒ๋ฒณ ์ •๋ ฌ(a~z)
function sortAlphabet(){
    cssProperty.sort((prev,cur) => {
        const [upperPrev, upperCur] = [prev.name.toUpperCase(), cur.name.toUpperCase()]
        if (upperPrev > upperCur) return 1;
        if (upperPrev < upperCur) return -1;
    });
    updateList();
}

// ์•ŒํŒŒ๋ฒณ ์ •๋ ฌ(z~a)
function sortAlphabetZ(){
    cssProperty.sort((prev, cur) => { 
        const [upperPrev, upperCur] = [prev.name.toUpperCase(), cur.name.toUpperCase()]
        if (upperPrev < upperCur) return 1;
        if (upperPrev > upperCur) return -1;
    });
    updateList();
}

// ๋ฐ˜๋Œ€๋กœ ์ •๋ ฌ ํด๋ฆญ
document.querySelector(".btn1").addEventListener("click", () => {
    sortReverse();
});

// ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ ํด๋ฆญ
document.querySelector(".btn2").addEventListener("click", () => {
   sortDescending(); 
});

// ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ํด๋ฆญ
document.querySelector(".btn3").addEventListener("click", () => {
    sortAscending();
});

// ์•ŒํŒŒ๋ฒณ ์ •๋ ฌ(a~z) ํด๋ฆญ
document.querySelector(".btn4").addEventListener("click", () => {
    sortAlphabet();
});

// ์•ŒํŒŒ๋ฒณ ์ •๋ ฌ(z~a) ํด๋ฆญ
document.querySelector(".btn5").addEventListener("click", () => {
    sortAlphabetZ();
});

// ํ”ผ์…” ์˜ˆ์ด์ธ  ์•Œ๊ณ ๋ฆฌ์ฆ˜
function shuffle(data) {
    for(let i=data.length-1; i>=0; i--){
        const randomIndex = Math.floor(Math.random() * (i + 1));
        // console.log(randomIndex);
        [data[i], data[randomIndex]] = [data[randomIndex], data[i]];
        cssList.innerHTML += data[i];
    }
}

document.querySelector(".btn6").addEventListener("click", () => {
    cssList.innerHTML = "";
    shuffle(cssProp);
});
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


Reference Book

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