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

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

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

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

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

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


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

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

<body>
    <header id="header">
        <h1>Search</h1>
        <nav>
            <ul>
                <li class="active"><a href="searchEffect01.html">01</a>
                    <ul class="sub">
                        <li class="active"><a href="searchEffect01.html">HTML</a></li>
                        <li><a href="searchEffect01_css.html">CSS</a></li>
                        <li><a href="searchEffect01_js.html">JavaScript</a></li>
                    </ul>
                </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><a href="searchEffect06.html">06</a></li>
            </ul>
        </nav>
    </header>
    <!-- // header -->

    <main id="main">
        <div class="search__wrap">
            <span>indexOf()๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•˜๊ธฐ</span>
            <h1>HTML ํƒœ๊ทธ ๊ฒ€์ƒ‰ํ•˜๊ธฐ</h1>
            <div class="search__box">     <!-- ๊ฒ€์ƒ‰์ƒ์ž -->
                <label for="search">๊ฒ€์ƒ‰ํ•˜๊ธฐ</label>        <!-- ์Šคํฌ๋ฆฐ๋ฆฌ๋”๊ธฐ์— ์ฝํžˆ์ง€๋งŒ ๊ฒ‰์œผ๋กœ๋Š” ์•ˆ๋ณด์ด๊ฒŒ CSS ์†์„ฑ์œผ๋กœ ์ฒ˜๋ฆฌ -->
                <input type="text" id="search" placeholder="HTML ํƒœ๊ทธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.">       <!-- ์•„๋ฌด๊ฒƒ๋„ ์ž…๋ ฅ ์•ˆํ–ˆ์„๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ๊ตฌ -->
            </div>
            <div class="search__list">
                <div class="html">
                    <ul>
                        <li data-name="a"><strong>a</strong> : ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ์˜ ์ด๋™์„ ์„ค์ •ํ•จ</li>
                        <li data-name="abbr"><strong>abbr</strong> : ์ค„์ž„๋ง์ด๋‚˜ ๋จธ๋ฆฌ๊ธ€์ž๋ฅผ ํ‘œํ˜„ ํ•  ๋•Œ ์‚ฌ์šฉ</li>
                        <li data-name="acronym"><strong>acronym</strong> : ์ค„์ž„๋ง์ด๋‚˜ ๋จธ๋ฆฌ๊ธ€์ž๋ฅผ ํ‘œํ˜„ ํ•  ๋•Œ ์‚ฌ์šฉ</li>
                        <li data-name="address"><strong>address</strong> : ๊ฐ€๊นŒ์šด HTML ์š”์†Œ์˜ ์‚ฌ๋žŒ, ๋‹จ์ฒด, ์กฐ์ง ๋“ฑ์— ๋Œ€ํ•œ ์—ฐ๋ฝ์ฒ˜ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.</li>
                        <li data-name="applet"><strong>applet</strong> : ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ</li>
                        <li data-name="area"><strong>area</strong> : ์ด๋ฏธ์ง€์˜ ํ•ซ์ŠคํŒŸ ์˜์—ญ์„ ์ •์˜ํ•˜๊ณ  ํ•˜์ดํผ๋งํฌ (en-US)๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. map ์š”์†Œ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</li>
                        <li data-name="article"><strong>article</strong> : ๋ฌธ์„œ, ํŽ˜์ด์ง€, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋˜๋Š” ์‚ฌ์ดํŠธ ์•ˆ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌํš์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.</li>
                        <li data-name="aside"><strong>aside</strong> : ๋ฌธ์„œ์˜ ์ฃผ์š” ๋‚ด์šฉ๊ณผ ๊ฐ„์ ‘์ ์œผ๋กœ๋งŒ ์—ฐ๊ด€๋œ ๋ถ€๋ถ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.</li>
                        <li data-name="audio"><strong>audio</strong> : ๋ฌธ์„œ์— ์†Œ๋ฆฌ ์ฝ˜ํ…์ธ ๋ฅผ ํฌํ•จํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.</li>
                        <li data-name="b"><strong>b</strong> : ๋…์ž์˜ ์ฃผ์˜๋ฅผ ์š”์†Œ์˜ ์ฝ˜ํ…์ธ ๋กœ ๋Œ๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.</li>
                        <li data-name="base"><strong>base</strong> : ๋ฌธ์„œ ์•ˆ์˜ ๋ชจ๋“  ์ƒ๋Œ€ URL์ด ์‚ฌ์šฉํ•  ๊ธฐ์ค€ URL์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.</li>
                        <li data-name="bdi"><strong>bdi</strong> : bdi ํƒœ๊ทธ๋Š”</li>
                        <li data-name="bdo"><strong>bdo</strong> : ํ˜„์žฌ ํ…์ŠคํŠธ์˜ ์“ฐ๊ธฐ ๋ฐฉํ–ฅ์„ ๋ฎ์–ด์“ฐ๊ณ  ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋ Œ๋”๋ง ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.</li>
                        <li data-name="bgsound"><strong>bgsound</strong> : ๋ฐฐ๊ฒฝ ์‚ฌ์šด๋“œ ์„ค์ •. ํ˜„์žฌ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ.</li>
                        <li data-name="big"><strong>big</strong> : big. ํ˜„์žฌ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ.</li>
                    </ul>
                </div>            
            </div>
        </div>
    </main>
    <!-- // main -->

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

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

๊ฒ€์ƒ‰ ์ดํŽ™ํŠธ 01์˜ JavaScript ์†Œ์Šค์™€ ๋ถ€์—ฐ ์„ค๋ช…(์ฃผ์„ ์ฒ˜๋ฆฌ๋จ)์ด๋‹ค.

// ์„ ํƒ์ž : ์ƒ์ˆ˜ const๋ฅผ ํ•„์š”ํ•œ ๋งŒํผ ์„ ์–ธ ํ›„ HTML ์˜์—ญ์˜ div, ์‹œ๋งจํ‹ฑํƒœ๊ทธ ๋“ฑ์˜ class๋ช…๊ณผ ์—ฐ๊ฒฐ
const searchBox = document.querySelector(".search__box input");   // ๊ฒ€์ƒ‰ ์˜์—ญ
const searchList = document.querySelectorAll(".search__list ul li");    // ๋ชฉ๋ก ๋ฆฌ์ŠคํŠธ

// ๊ฒ€์ƒ‰ ์˜์—ญ ์ด๋ฒคํŠธ
searchBox.addEventListener("keyup", () => { // ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰ ์˜์—ญ์— keyup ํ–ˆ์„ ๋•Œ(ํ‚ค๋ฅผ ๋ˆŒ๋ €๋‹ค๊ฐ€ ๋–ผ์—ˆ์„ ๋•Œ)
    const searchWord = searchBox.value;     // ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ‚ค์›Œ๋“œ ๊ฐ’
            
    searchList.forEach(el => {
        const htmlName = el.dataset.name;   // ๋ฐ์ดํ„ฐ ์…‹ํŒ…

        if(htmlName.indexOf(searchWord)){
            el.classList.add("hide");       // ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ‚ค์›Œ๋“œ์˜ ์•ŒํŒŒ๋ฒณ์ด ํฌํ•จ๋œ ๋‚ด์šฉ ์ถœ๋ ฅ
        } else {
            el.classList.remove("hide");    // indexOf๊ฐ’์ด 0์ด ๋˜๋Š” ๊ฐ’๋งŒ hide๋ฅผ ์ง€์›Œ์คŒ
        }
    });
});
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


Reference Book

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