λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Javascript Effect

μžλ°”μŠ€ν¬λ¦½νŠΈ 검색 효과 : includes()

by μ½”νŒŒμΉ΄ 2022. 8. 17.
728x90

μžλ°”μŠ€ν¬λ¦½νŠΈ : 검색 효과 : includes()

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ‹€μ–‘ν•œ νš¨κ³Όλ“€ 쀑, ν•΄λ‹Ήν•˜λŠ” λ¬Έμžμ—΄μ„ 찾을 수 μžˆλŠ” 검색 νš¨κ³Όμž…λ‹ˆλ‹€. μ΄λ²ˆμ—λŠ” includes() λ©”μ„œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ CSS의 λ‹€μ–‘ν•œ 속성을 검색할 수 μžˆλŠ” μ›Ήμ‚¬μ΄νŠΈλ₯Ό μž‘μ—…ν•΄ 보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.


HTML μ†ŒμŠ€

HTML둜 λΌˆλŒ€λ₯Ό λ¨Όμ € μž‘μ•„μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. 헀더 μ˜μ—­μ—λŠ” λ‚΄λΉ„κ²Œμ΄μ…˜ 메뉴λ₯Ό, 메인 μ˜μ—­μ—λŠ” 검색창, ν•˜μœ„ λͺ©λ‘λ“€μ„ μž‘μ„±ν•΄ μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. 각각의 ν•˜μœ„ λͺ©λ‘μ—λŠ” data-type을 μΆ”κ°€ν•΄ μ£Όμ–΄, μ• λ‹ˆλ©”μ΄μ…˜, 보더 λ“±μ˜ μœ ν˜• 이름을 검색해도 결과값이 λ‚˜νƒ€λ‚˜λ„λ‘ μž‘μ—…ν•΄ μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. μ•„λž˜ μ†ŒμŠ€λŠ” 메인 μ˜μ—­μ˜ HTML μ†ŒμŠ€λ‘œ, λ‚˜λ¨Έμ§€ μ˜μ—­μ˜ μ†ŒμŠ€λŠ” ν•˜λ‹¨μ˜ '원본 μ†ŒμŠ€ 보기' λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

<main id="main">
    <div class="search__wrap">
        <span>includes()λ₯Ό μ΄μš©ν•˜μ—¬ κ²€μƒ‰ν•˜κΈ°</span>
        <h1>CSS 속성 κ²€μƒ‰ν•˜κΈ°</h1>
        <div class="search__box">
            <label for="search">κ²€μƒ‰ν•˜κΈ°</label> 
            <input type="text" id="search" placeholder="CSS 속성 및 μœ ν˜•μ„ μž…λ ₯ν•΄ μ£Όμ„Έμš”">
        </div>
        <div class="search__info">
            <div class="type">ν”Œλ ‰μŠ€, μ• λ‹ˆλ©”μ΄μ…˜, λ°±κ·ΈλΌμš΄λ“œ, 보더 λ“± μœ ν˜•λ³„λ‘œ 검색해 λ³΄μ„Έμš”!</div>
            <div>전체 속성 갯수 : <span class="num">0</span></div>
        </div>
        <div class="search__list">
            <div class="css">
                <ul>
                    <li data-name="align-content" data-type="ν”Œλ ‰μŠ€"><strong>align-content</strong> : μ½˜ν…μΈ  μ•„μ΄ν…œμ˜ μƒν•˜κ΄€κ³„ μ •λ ¬ μƒνƒœλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="align-items" data-type="ν”Œλ ‰μŠ€"><strong>align-items</strong> : μ½˜ν…μΈ  μ•„μ΄ν…œμ˜ λ‚΄λΆ€ μƒν•˜κ΄€κ³„ μ •λ ¬ μƒνƒœλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="align-self" data-type="ν”Œλ ‰μŠ€"><strong>align-self</strong> : κ°œλ³„μ μΈ μ½˜ν…μΈ  μ•„μ΄ν…œμ˜ μ •λ ¬ μƒνƒœλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="all" data-type="기타"><strong>all</strong> : μš”μ†Œμ˜ 속성을 μ΄ˆκΈ°ν™” λ˜λŠ” 상속을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="animation" data-type="μ• λ‹ˆλ©”μ΄μ…˜"><strong>animation</strong> : μ• λ‹ˆλ©”μ΄μ…˜κ³Ό κ΄€λ ¨λœ 속성을 μΌκ΄„μ μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="animation-delay" data-type="μ• λ‹ˆλ©”μ΄μ…˜"><strong>animation-delay</strong> : μ• λ‹ˆλ©”μ΄μ…˜ 지연 μ‹œκ°„μ„ μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="animation-direction" data-type="μ• λ‹ˆλ©”μ΄μ…˜"><strong>animation-direction</strong> : μ• λ‹ˆλ©”μ΄μ…˜ μ›€μ§μž„ λ°©ν–₯을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="animation-duration" data-type="μ• λ‹ˆλ©”μ΄μ…˜"><strong>animation-duration</strong> : μ• λ‹ˆλ©”μ΄μ…˜ μ›€μ§μž„ μ‹œκ°„μ„ μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="animation-fill-mode" data-type="μ• λ‹ˆλ©”μ΄μ…˜"><strong>animation-fill-mode</strong> : μ• λ‹ˆλ©”μ΄μ…˜μ΄ λλ‚œ ν›„μ˜ μƒνƒœλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="animation-iteration-count" data-type="μ• λ‹ˆλ©”μ΄μ…˜"><strong>animation-iteration-count</strong> : μ• λ‹ˆλ©”μ΄μ…˜μ˜ 반볡 횟수λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="animation-name" data-type="μ• λ‹ˆλ©”μ΄μ…˜"><strong>animation-name</strong> : μ• λ‹ˆλ©”μ΄μ…˜ keyframe 이름을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="animation-play-state" data-type="μ• λ‹ˆλ©”μ΄μ…˜"><strong>animation-play-state</strong> : μ• λ‹ˆλ©”μ΄μ…˜ 진행 μƒνƒœλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="animation-timing-function" data-type="μ• λ‹ˆλ©”μ΄μ…˜"><strong>animation-timing-function</strong> : μ• λ‹ˆλ©”μ΄μ…˜ μ›€μ§μž„μ˜ 속도λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="background" data-type="λ°±κ·ΈλΌμš΄λ“œ"><strong>background</strong> : λ°±κ·ΈλΌμš΄λ“œ 속성을 μΌκ΄„μ μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="background-attachment" data-type="λ°±κ·ΈλΌμš΄λ“œ"><strong>background-attachment</strong> : λ°°κ²½ μ΄λ―Έμ§€μ˜ κ³ μ • μ—¬λΆ€λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="background-blend-mode" data-type="λ°±κ·ΈλΌμš΄λ“œ"><strong>background-blend-mode</strong> : 배경을 ν˜Όν•©ν–ˆμ„ λ•Œ κ·Έλž˜ν”½ 효과λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="background-clip" data-type="λ°±κ·ΈλΌμš΄λ“œ"><strong>background-clip</strong> : λ°±κ·ΈλΌμš΄λ“œ μ΄λ―Έμ§€μ˜ μœ„μΉ˜ 기쀀점을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="background-color" data-type="λ°±κ·ΈλΌμš΄λ“œ"><strong>background-color</strong> : λ°±κ·ΈλΌμš΄λ“œ 색상을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="background-image" data-type="λ°±κ·ΈλΌμš΄λ“œ"><strong>background-image</strong> : λ°±κ·ΈλΌμš΄λ“œ 이미지 속성을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="background-origin" data-type="λ°±κ·ΈλΌμš΄λ“œ"><strong>background-origin</strong> : λ°±κ·ΈλΌμš΄λ“œ μ΄λ―Έμ§€μ˜ μœ„μΉ˜ 기쀀점을 μ„€μ •ν•˜κΈ° μœ„ν•œ μ†μ„±μž…λ‹ˆλ‹€.</li>
                    <li data-name="background-position" data-type="λ°±κ·ΈλΌμš΄λ“œ"><strong>background-position</strong> : λ°±κ·ΈλΌμš΄λ“œ μ΄λ―Έμ§€μ˜ μœ„μΉ˜ μ˜μ—­μ„ μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="background-position-x" data-type="λ°±κ·ΈλΌμš΄λ“œ"><strong>background-position-x</strong> : λ°±κ·ΈλΌμš΄λ“œ μ΄λ―Έμ§€μ˜ xμΆ• μœ„μΉ˜ μ˜μ—­μ„ μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="background-porsition-y" data-type="λ°±κ·ΈλΌμš΄λ“œ"><strong>background-porsition-y</strong> : λ°±κ·ΈλΌμš΄λ“œ μ΄λ―Έμ§€μ˜ yμΆ• μœ„μΉ˜ μ˜μ—­μ„ μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="background-repeat" data-type="λ°±κ·ΈλΌμš΄λ“œ"><strong>background-repeat</strong> : λ°±κ·ΈλΌμš΄λ“œ μ΄λ―Έμ§€μ˜ 반볡 μ—¬λΆ€λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="background-size" data-type="λ°±κ·ΈλΌμš΄λ“œ"><strong>background-size</strong> : λ°±κ·ΈλΌμš΄λ“œ 이미지 μ‚¬μ΄μ¦ˆλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="border" data-type="보더"><strong>border</strong> : ν…Œλ‘λ¦¬ 속성을 μΌκ΄„μ μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="border-bottom" data-type="보더"><strong>border-bottom</strong> : μ•„λž˜μͺ½ ν…Œλ‘λ¦¬ 속성을 μΌκ΄„μ μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="border-bottom-color" data-type="보더"><strong>border-bottom-color</strong> : μ•„λž˜μͺ½ ν…Œλ‘λ¦¬ 색상 속성을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="border-bottom-left-radius" data-type="보더"><strong>border-bottom-left-radius</strong> : μ•„λž˜ μ™Όμͺ½ λͺ¨μ„œλ¦¬ ꡴곑을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="border-bottom-right-radius" data-type="보더"><strong>border-bottom-right-radius</strong> : μ•„λž˜ 였λ₯Έμͺ½ λͺ¨μ„œλ¦¬ ꡴곑을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="border-bottom-style" data-type="보더"><strong>border-bottom-style</strong> : μ•„λž˜μͺ½ ν…Œλ‘λ¦¬ μŠ€νƒ€μΌ 속성을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="border-bottom-width" data-type="보더"><strong>border-bottom-width</strong> : μ•„λž˜μͺ½ ν…Œλ‘λ¦¬ λ‘κ»˜ 속성을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="border-collapse" data-type="보더"><strong>border-collapse</strong> : ν‘œ 및 μ…€μ˜ ν…Œλ‘λ¦¬μ„  ν‘œμ‹œλ°©λ²•μ„ μ§€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="border-color" data-type="보더"><strong>border-color</strong> : ν…Œλ‘λ¦¬ 색상을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="border-left" data-type="보더"><strong>border-left</strong> : μ™Όμͺ½ ν…Œλ‘λ¦¬ 속성을 μΌκ΄„μ μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="border-left-color" data-type="보더"><strong>border-left-color</strong> : μ™Όμͺ½ ν…Œλ‘λ¦¬ 색상을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="border-left-style" data-type="보더"><strong>border-left-style</strong> : μ™Όμͺ½ ν…Œλ‘λ¦¬ μŠ€νƒ€μΌ 속성을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="border-left-width" data-type="보더"><strong>border-left-width</strong> : μ™Όμͺ½ ν…Œλ‘λ¦¬ λ‘κ»˜ 속성을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                    <li data-name="border-radius" data-type="보더"><strong>border-radius</strong> : ν…Œλ‘λ¦¬μ˜ λ‘₯κΈ€κΈ° 속성을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                </ul>
            </div>
        </div>
    </div>
</main>

CSS μ†ŒμŠ€

CSS둜 μŠ€νƒ€μΌ 속성을 μΆ”κ°€ν•΄ μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. ν°νŠΈλŠ” ν‹°λͺ¬, μ—μŠ€μ½”μ–΄ λ“œλ¦Όμ„ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ, 메인 μ˜μ—­μ˜ CSS μ†ŒμŠ€μž…λ‹ˆλ‹€.

:root {
    --htmlColor: #223547;
}

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    font-family: 'SCoreDream';
    color: var(--htmlColor);
}

*,
*:before,
*:after {
    box-sizing: border-box;
}

a {
    text-decoration: none;
    color: var(--htmlColor);
}

li {
    list-style: none;
}

/* main */
#main {
    margin: 50px 10px;
}

.search__wrap {
    max-width: 1400px;
    margin: 0 auto;
    border: 3px solid var(--htmlColor);
    border-radius: 20px;
    background-color: #f1f3f6;
    padding: 30px;
    text-align: center;
}

.search__wrap>span {
    font-size: 20px;
    margin-bottom: 20px;
    display: inline-block;
}

.search__wrap>h1 {
    font-family: 'Tmon';
    color: var(--htmlColor);
    font-size: 6vw;
    margin-bottom: 10px;
}

.search__box {
    margin-bottom: 20px;
}

.search__box label {
    position: absolute;
    clip: rect(0 0 0 0);
    width: 1px;
    height: 1px;
    margin: -1px;
    overflow: hidden;
}

.search__box input {
    border: 2px solid var(--htmlColor);
    padding: 15px 40px;
    width: 70%;
    border-radius: 50px;
    font-size: 20px;
}

.search__list li {
    text-align: left;
    line-height: 1.7;
}

.search__list li.hide {
    display: none;
}

.search__list li.show {
    display: block;
}

.search__info {
    text-align: right;
    margin-bottom: 20px;
    padding-bottom: 10px;
    border-bottom: 2px dashed var(--htmlColor);
}

.search__info .type {
    text-align: center;
    margin-bottom: 10px;
}

JAVASCRIPT μ†ŒμŠ€

λŒ€λ§μ˜ JAVASCIPRT μ†ŒμŠ€μž…λ‹ˆλ‹€. 검색 μ˜μ—­κ³Ό λͺ©λ‘ 리슀트 μ„ νƒμžλ₯Ό λ¨Όμ € λ§Œλ“€μ–΄ μ€€ λ’€, addEventListener둜 검색 μ˜μ—­μ— keyup 이벀트λ₯Ό μΆ”κ°€ν•΄ μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μžκ°€ μž…λ ₯ν•œ ν‚€μ›Œλ“œμ™€ ν•˜μœ„ λͺ©λ‘λ“€μ˜ 값을 λΉ„κ΅ν•˜μ—¬, indexOf의 값이 0이면 리슀트λ₯Ό 보여주고, 값이 λ‹€λ₯΄λ©΄ 리슀트λ₯Ό μˆ¨κΈ°λŠ” λ°©μ‹μœΌλ‘œ μž‘μ—…ν•΄ μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

// μ„ νƒμž
const searchBox = document.querySelector(".search__box input")  // 검색 μ˜μ—­
const searchList = document.querySelectorAll(".search__list ul li")  // λͺ©λ‘ 리슀트
const searchInfo = document.querySelector(".search__info .num")

// 속성 갯수 μ„€μ •ν•˜κΈ°
searchInfo.textContent = searchList.length;

// 검색 μ˜μ—­
searchBox.addEventListener("keyup", () => {
    const searchWord = searchBox.value;  // μ‚¬μš©μžκ°€ μž…λ ₯ν•œ ν‚€μ›Œλ“œ

    searchList.forEach((el) => {
        const cssName = el.dataset.name;  // CSS μ†μ„±μ˜ λͺ¨λ“  κ°’
        const cssType = el.dataset.type;  // CSS μ†μ„±μ˜ λ°μ΄ν„°νƒ€μž…μ˜ λͺ¨λ“  κ°’

        // 속성 이름, 데이터 μœ ν˜•λ³„λ‘œ κ²€μƒ‰ν•˜κΈ°
        if(cssName.includes(searchWord) | cssType.includes(searchWord)){
            el.classList.remove("hide");  // 값이 true이면 보여주고,
        } else {
            el.classList.add("hide");  // 값이 false이면 숨기기
        }
    })
})

κ²°κ³Ό

728x90

λŒ“κΈ€

κ°μ‚¬ν•©λ‹ˆλ‹€. πŸ¦™

CSS
κ΄‘κ³  쀀비쀑