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

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

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

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

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


HTML μ†ŒμŠ€

HTML둜 λΌˆλŒ€λ₯Ό λ¨Όμ € μž‘μ•„μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. 헀더 μ˜μ—­μ—λŠ” λ‚΄λΉ„κ²Œμ΄μ…˜ 메뉴λ₯Ό, 메인 μ˜μ—­μ—λŠ” μ•ŒνŒŒλ²³ 선택창, ν•˜μœ„ λͺ©λ‘λ“€μ„ μž‘μ„±ν•΄ μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. 각 μ•ŒνŒŒλ²³μ΄ 쓰인 λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄, ν•΄λ‹Ήν•˜λŠ” μ•ŒνŒŒλ²³μœΌλ‘œ μ‹œμž‘ν•˜λŠ” 속성듀이 λͺ©λ‘μ— λ‚˜νƒ€λ‚©λ‹ˆλ‹€. μ•„λž˜ μ†ŒμŠ€λŠ” 메인 μ˜μ—­μ˜ HTML μ†ŒμŠ€λ‘œ, λ‚˜λ¨Έμ§€ μ˜μ—­μ˜ μ†ŒμŠ€λŠ” ν•˜λ‹¨μ˜ '원본 μ†ŒμŠ€ 보기' λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

<div class="search__wrap">
    <span>charAt()λ₯Ό μ΄μš©ν•˜μ—¬ κ²€μƒ‰ν•˜κΈ°</span>
    <h1>CSS 속성 μ²«κΈ€μž κ²€μƒ‰ν•˜κΈ°</h1>
    <div class="search__info">
        <div class="keyword">
            <span>a</span>
            <span>b</span>
            <span>c</span>
            <span>d</span>
            <span>e</span>
            <span>f</span>
            <span>g</span>
            <span>h</span>
            <span>i</span>
            <span>j</span>
            <span>k</span>
            <span>l</span>
            <span>m</span>
            <span>n</span>
            <span>o</span>
            <span>p</span>
            <span>q</span>
            <span>r</span>
            <span>s</span>
            <span>t</span>
            <span>u</span>
            <span>v</span>
            <span>w</span>
            <span>x</span>
            <span>y</span>
            <span>z</span>
        </div>
        <div>전체 속성 갯수 : <span class="num">0</span></div>
    </div>
    <div class="search__list">
        <div class="css">
            <ul>
                <li><strong>accent-color</strong> : νŠΉμ • μš”μ†Œμ— 색상을 지정할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.</li>
                <li><strong>align-content</strong> : μ½˜ν…μΈ  μ•„μ΄ν…œμ˜ μƒν•˜κ΄€κ³„ μ •λ ¬ μƒνƒœλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                <li><strong>align-items</strong> : μ½˜ν…μΈ  μ•„μ΄ν…œμ˜ λ‚΄λΆ€ μƒν•˜κ΄€κ³„ μ •λ ¬ μƒνƒœλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                <li><strong>align-self</strong> : κ°œλ³„μ μΈ μ½˜ν…μΈ  μ•„μ΄ν…œμ˜ μ •λ ¬ μƒνƒœλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                <li><strong>all</strong> : μš”μ†Œμ˜ 속성을 μ΄ˆκΈ°ν™” λ˜λŠ” 상속을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                <li><strong>animation</strong> : μ• λ‹ˆλ©”μ΄μ…˜κ³Ό κ΄€λ ¨λœ 속성을 μΌκ΄„μ μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.</li>
                <li><strong>animation-delay</strong> : μ• λ‹ˆλ©”μ΄μ…˜ 지연 μ‹œκ°„μ„ μ„€μ •ν•©λ‹ˆλ‹€.</li>
                <li><strong>animation-direction</strong> : μ• λ‹ˆλ©”μ΄μ…˜ μ›€μ§μž„ λ°©ν–₯을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                <li><strong>animation-duration</strong> : μ• λ‹ˆλ©”μ΄μ…˜ μ›€μ§μž„ μ‹œκ°„μ„ μ„€μ •ν•©λ‹ˆλ‹€.</li>
                <li><strong>animation-fill-mode</strong> : μ• λ‹ˆλ©”μ΄μ…˜μ΄ λλ‚œ ν›„μ˜ μƒνƒœλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                <li><strong>animation-iteration-count</strong> : μ• λ‹ˆλ©”μ΄μ…˜μ˜ 반볡 횟수λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.</li>
                <li><strong>animation-name</strong> : μ• λ‹ˆλ©”μ΄μ…˜ keyframe 이름을 μ„€μ •ν•©λ‹ˆλ‹€.</li>
                <li><strong>animation-play-state</strong> : μ• λ‹ˆλ©”μ΄μ…˜ μ§„ν–‰μƒνƒœλ₯Ό μ„€μ • ν•©λ‹ˆλ‹€.</li>
                <li><strong>animation-timeline</strong> : x</li>
                <li><strong>animation-timing-function</strong> : μ• λ‹ˆλ©”μ΄μ…˜ μ›€μ§μž„μ˜ 속도λ₯Ό μ„€μ • ν•©λ‹ˆλ‹€.</li>
                <li><strong>appearance</strong> : 운영체제 및 λΈŒλΌμš°μ €μ— 기본적으둜 μ„€μ •λ˜μ–΄ μžˆλŠ” ν…Œλ§ˆλ₯Ό 기반으둜 μš”μ†Œλ₯Ό ν‘œν˜„ν•©λ‹ˆλ‹€.</li>
                <li><strong>aspect-ratio</strong> : μš”μ†Œμ˜ 크기λ₯Ό λΉ„μœ¨λŒ€λ‘œ μ‘°μ •ν•  수 있게 ν•©λ‹ˆλ‹€.</li>
                <li><strong>backdrop-filter</strong> : μš”μ†Œ λ’€ μ˜μ—­μ— νλ¦Όμ΄λ‚˜ 색상 μ‹œν”„νŠΈ λ“± κ·Έλž˜ν”½ 효과λ₯Ό μ μš©ν•  수 μžˆλŠ” μ†μ„±μž…λ‹ˆλ‹€.</li>
                <li><strong>backface-visibility</strong> : μž…μ²΄μ μΈ λͺ¨μŠ΅μ˜ λ’·λ©΄μ˜ κ°€μ‹œμ„±μ„ κ²°μ •ν•˜λŠ” 속성이닀.</li>
                <li><strong>background</strong> : λ°±κ·ΈλΌμš΄λ“œ 속성을 μΌκ΄„μ μœΌλ‘œ μ„€μ • ν•©λ‹ˆλ‹€.</li>
                <li><strong>background-attachment</strong> : λ°°κ²½ μ΄λ―Έμ§€μ˜ κ³ μ • μ—¬λΆ€λ₯Ό μ„€μ • ν•©λ‹ˆλ‹€.</li>
                <li><strong>background-blend-mode</strong> : 배경을 ν˜Όν•©ν–ˆμ„ λ•Œ κ·Έλž˜ν”½ 효과λ₯Ό μ„€μ • ν•©λ‹ˆλ‹€.</li>
                <li><strong>background-clip</strong> : λ°±κ·ΈλΌμš΄λ“œ μ΄λ―Έμ§€μ˜ μœ„μΉ˜ 기쀀점을 μ„€μ • ν•©λ‹ˆλ‹€.</li>
                <li><strong>background-color</strong> : λ°±κ·ΈλΌμš΄λ“œ 색을 μ„€μ • ν•©λ‹ˆλ‹€.</li>
                // μ΄ν•˜μƒλž΅...
            </ul>
        </div>
    </div>
</div>

CSS μ†ŒμŠ€

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

#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;
}

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

.search__info .keyword span {
    border-bottom: 2px solid var(--htmlColor);
    border-radius: 5px;
    padding: 10px;
    display: inline-block;
    margin-bottom: 4px;
    font-weight: 500;
}

.search__info .keyword span:hover {
    background-color: var(--htmlColor);
    color: #fff;
    cursor: pointer;
}

JAVASCRIPT μ†ŒμŠ€

λŒ€λ§μ˜ JAVASCIPRT μ†ŒμŠ€μž…λ‹ˆλ‹€. 각각의 μ•ŒνŒŒλ²³λ“€, 속성 λͺ©λ‘ 리슀트의 μ„ νƒμžλ₯Ό λ¨Όμ € λ§Œλ“€μ–΄ μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μžκ°€ ν΄λ¦­ν•œ μ•ŒνŒŒλ²³μ˜ κ°’(searchWord)κ³Ό μ†μ„±μ˜ 이름(cssName)을 λΉ„κ΅ν•˜μ—¬, 속성 μ΄λ¦„μ˜ 첫 κΈ€μžμ™€ μ•ŒνŒŒλ²³μ˜ 값이 κ°™μœΌλ©΄ hide 클래슀λ₯Ό 숨기고, λ‹€λ₯΄λ©΄ hide 클래슀λ₯Ό μΆ”κ°€μ‹œν‚€λŠ” λ°©λ²•μœΌλ‘œ μž‘μ—…ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

// μ„ νƒμž
const searchKeyword = document.querySelectorAll(".search__info .keyword span")  // μ•ŒνŒŒλ²³
const searchList = document.querySelectorAll(".search__list ul li")  // λͺ©λ‘ 리슀트
const searchInfo = document.querySelector(".search__info .num")

// 속성 갯수 κ΅¬ν•˜κΈ°
searchInfo.textContent = searchList.length;

searchKeyword.forEach( el => {
    el.addEventListener("click", () => {
        const searchWord = el.innerText;  // μ‚¬μš©μžκ°€ ν΄λ¦­ν•œ μ•ŒνŒŒλ²³
        // console.log(searchWord);

        searchList.forEach(el => {
            const cssName = el.querySelector("strong").innerText;  // CSS μ†μ„±μ˜ ν…μŠ€νŠΈ
            // console.log(cssName)

            // μ•ŒνŒŒλ²³ μ²«κΈ€μž == CSS μ†μ„±μ˜ μ²«κΈ€μž
            if(searchWord.charAt(0) === cssName.charAt(0)){
                el.classList.remove("hide");
            } else {
                el.classList.add("hide");
            }
        });
    })
});

κ²°κ³Ό

728x90

λŒ“κΈ€

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

CSS
κ΄‘κ³  쀀비쀑