๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
EFFECT

[EFFECT] ๊ฒ€์ƒ‰ ์œ ํ˜•04 : map / find()๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

by _ํ† ๋งคํ†  2022. 9. 29.
728x90

๐Ÿ” ๊ฒ€์ƒ‰ ํšจ๊ณผ : find()๋ฅผ ์ด์šฉํ•˜์—ฌ ์†์„ฑ์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” find๋ฅผ ํ†ตํ•ด ์†์„ฑ์„ ๊ฒ€์ƒ‰ํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ์†์„ฑ ์„ค๋ช…์ด ๋‚˜ํƒ€๋‚˜๋Š” ํšจ๊ณผ๋ฅผ ์‹ค์Šตํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค
+ ์ถ”๊ฐ€๋กœ ์†์„ฑ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ๊ฒฝ์šฐ์—๋„ ํ•ด๋‹น ์†์„ฑ์˜ ์„ค๋ช…์ด ๋‚˜ํƒ€๋‚˜๋„๋ก ์ž‘์—…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! ๐Ÿฅฒ


#1. HTML / CSS ์„ค์ •ํ•˜๊ธฐ

! HTML TIP !
input์˜ ํ…์ŠคํŠธ ํƒ€์ž…์€ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ input์˜ placeholder ์†์„ฑ์€ ์š”์†Œ์•ˆ์— ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž…๋ ฅ ์ „ ๋ฌธ๊ตฌ๋ฅผ ๋ณด์ด๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

โœ๏ธ HTML ์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ
<main id="main">
    <div class="search__wrap">
        <span>find()๋ฅผ ์ด์šฉํ•˜์—ฌ ์†์„ฑ์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์„ค๋ช… ๋ณด์—ฌ์ฃผ๊ธฐ</span>
        <h1>CSS ์†์„ฑ ๊ฒ€์ƒ‰ํ•˜๊ธฐ</h1>
        <div class="search__box">
            <label for="search">๊ฒ€์ƒ‰ํ•˜๊ธฐ</label>
            <input type="text" id="search" placeholder="CSS ์†์„ฑ ๋ฐ ์œ ํ˜•์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!">
        </div>
        <div class="search__desc">
            <div class="desc">์†์„ฑ์„ ๊ฒ€์ƒ‰ํ•˜์‹œ๋ฉด ์„ค๋ช…์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.</div>
        </div>
        <div class="search__info">
            <div>CSS ์ „์ฒด ์†์„ฑ : <span class="num">0</span></div>
        </div>
  
        <div class="search__list">
        </div>
    </div>
</main>

! CSS TIP !
์ด์ „ ๊ฒ€์ƒ‰ ์ดํŽ™ํŠธ์™€ ์Šคํƒ€์ผ์ด ๋™์ผํ•˜๋ฉฐ html ๊ตฌ์กฐ์— ์ถ”๊ฐ€๋œ search__desc ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
background-image: url()์„ ํ†ตํ•ด ์š”์†Œ ์•ˆ์— ์•„์ด์ฝ˜์„ ๋„ฃ์–ด ์ค๋‹ˆ๋‹ค.

โœ๏ธ CSS ์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ
.search__desc {
    border: 2px solid var(--htmlColor);
    padding: 20px 40px 20px 60px;
    margin-bottom: 50px;
    border-radius: 50px;
    display: inline-block;
    background-color: var(--htmlColor);
    color: #fff;
    background-image: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='11' cy='11' r='8' stroke='%23ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M16.5 16.958L21.5 21.958' stroke='%23ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: 22px 17px;
}

#2. JAVASCRIPT : ์Šคํฌ๋ฆฝํŠธ

์ด๋ฒˆ ์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” map() ๋ฉ”์„œ๋“œ์™€ find() ๋ฉ”์„œ๋“œ, ๊ทธ๋ฆฌ๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์—…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์˜ ์Šคํฌ๋ฆฝํŠธ ์ฃผ์„๊ณผ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

! JAVASCRIPT TIP !
1. ๋ณ€์ˆ˜๋ช….map((element, index) => {}) : ๋ณ€์ˆ˜์˜ ์ธ๋ฑ์Šค ๊ฐ’(์ž๋ฆฟ๊ฐ’)์„ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. ๋ณดํ†ต ๋ณ€์ˆ˜๊ฐ€ ๋ฐฐ์—ด๋กœ ์ €์žฅ๋˜์–ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
2. ๋ณ€์ˆ˜๋ช….find((element) => element ์กฐ๊ฑด์‹) : ๋ณ€์ˆ˜์—์„œ ํ•ด๋‹น ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
2. return : ๊ฒฐ๊ณผ๊ฐ’ ์ถœ๋ ฅ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ข…๋ฃŒ์˜ ์˜๋ฏธ๋กœ๋„ ์“ฐ์ž…๋‹ˆ๋‹ค.

//01 ๋ฐ์ดํ„ฐ ๊ฐ์ฒดํ™” ์‹œํ‚ค๊ธฐ
const cssProperty = [
    { name: "accent-color", desc: "ํŠน์ • ์š”์†Œ์— ์ƒ‰์ƒ์„ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค." },
    { name: "align-content", desc: "์ฝ˜ํ…์ธ  ์•„์ดํ…œ์˜ ์ƒํ•˜๊ด€๊ณ„ ์ •๋ ฌ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { name: "align-items", desc: "์ฝ˜ํ…์ธ  ์•„์ดํ…œ์˜ ๋‚ด๋ถ€ ์ƒํ•˜๊ด€๊ณ„ ์ •๋ ฌ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { name: "align-self", desc: "๊ฐœ๋ณ„์ ์ธ ์ฝ˜ํ…์ธ  ์•„์ดํ…œ์˜ ์ •๋ ฌ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { name: "all", desc: "์š”์†Œ์˜ ์†์„ฑ์„ ์ดˆ๊ธฐํ™” ๋˜๋Š” ์ƒ์†์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { name: "animation", desc: "์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๊ด€๋ จ๋œ ์†์„ฑ์„ ์ผ๊ด„์ ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { name: "animation-delay", desc: "์• ๋‹ˆ๋ฉ”์ด์…˜ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    { name: "animation-direction", desc: "์• ๋‹ˆ๋ฉ”์ด์…˜ ์›€์ง์ž„ ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
    .
    .
    .
    { name: "z-index", desc: "์š”์†Œ๋“ค์˜ ์ˆ˜์ง ์œ„์น˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค." },
];
const searchList = document.querySelector(".search__list");
const searchNum = document.querySelector(".search__info .num");
const searchBox = document.querySelector(".search__box input");
const searchDesc = document.querySelector(".search__desc");

//02 ์ถœ๋ ฅํ•˜๊ธฐ : ๋ฐฐ์—ด map()๋ฉ”์„œ๋“œ
//map์„ ํ†ตํ•ด ์„ ํƒ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์ €์žฅํ•˜์—ฌ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
//element๋Š” cssProperty์˜ ๊ฐ์ฒด, index๋Š” ๋ฐฐ์—ด์—์„œ์˜ ์ž๋ฆฟ๊ฐ’!
cssProperty.map((element, index) => {
    // searchNum.innerText = index + 1;
    searchNum.innerText = cssProperty.length + "๊ฐœ";
    // searchList.innerHTML += `<span>${element.name} : ${element.desc}</span>`;
    //name์ด๋ผ๋Š” key์˜ ๊ฐ’์„ searchList์— ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
    searchList.innerHTML += `<span>${element.name}</span>`;
});

//03 ์ž…๋ ฅํ•˜๊ธฐ
//searchWord(๋ณ€์ˆ˜)์— ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’์„ ์ €์žฅํ•œ ๋’ค ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ findPropertyํ•จ์ˆ˜์— ๊ฐ’์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
searchBox.addEventListener("keyup", () => {
    const searchWord = searchBox.value;
    // console.log(searchWord);
    findProperty(searchWord);
});
//ํ•จ์ˆ˜ ๋ฐ–์— ์œ„์น˜ํ–ˆ์œผ๋ฏ€๋กœ ์ง€์—ญ ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌ์‹œํ‚ค๊ฑฐ๋‚˜ ์ „์—ญ๋ณ€์ˆ˜๋กœ ๋ฐ”๊ฟ”์ฃผ๊ธฐ. ํ˜„์žฌ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์‚ฌ์šฉ!

//04 ์†์„ฑ์ฐพ๊ธฐ
//์œ„์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ searchWord๋ฅผ ํ•จ์ˆ˜์˜ searchWord2 ๋ณ€์ˆ˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
function findProperty(searchWord2){
    //find๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ๋„ค์ž„๊ฐ’๊ณผ searchWord(์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ฐ’)์ด ๊ฐ™์€ ๊ฒฝ์šฐ tagetData์— ์ €์žฅํ•œ ๋’ค ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ desc๊ฐ’์„ ์ฐพ์•„์„œ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
    //(data = element(cssProperty์˜ ๋ฐ์ดํ„ฐ๊ฐ’))
    const tagetData = cssProperty.find((data) => data.name === searchWord2); 

    //๋งŒ์•ฝ ์ž…๋ ฅ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ(null)์—๋Š” textContent๋ฅผ ํ†ตํ•ด ์ง€์ •๋ฌธ๊ตฌ๊ฐ€ ๋œจ๋„๋กํ•ฉ๋‹ˆ๋‹ค.
    if(tagetData == null){
        searchDesc.textContent = "ํ•ด๋‹น ์†์„ฑ์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๊ฒ€์ƒ‰ํ•ด์ฃผ์„ธ์š”!";
        //์•„๋ž˜์˜ textcontent๊ฐ€ ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋˜๋ฏ€๋กœ ๊ฐ’์ด ์—†๋Š”๋ฐ๋„ ๊ณ„์† ์ฐพ์œผ๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒƒ! ๋•Œ๋ฌธ์— ๋ฆฌํ„ด์„ ์จ์„œ ์ข…๋ฃŒ๋ฅผ ์‹œ์ผœ์ฃผ๋ฉด ๋ฒ„๊ทธ๋ฅผ ๊ณ ์น  ์ˆ˜ ์žˆ๋‹ค.
        return; //๋ฆฌํ„ด์€ ๊ฒฐ๊ณผ๊ฐ’ ์ถœ๋ ฅ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ข…๋ฃŒ์˜ ์˜๋ฏธ๋กœ๋„ ์“ฐ์ธ๋‹ค.
    }
    searchDesc.textContent = tagetData.desc;
};

//05 ํด๋ฆญํ–ˆ์„ ๋•Œ ์†์„ฑ ๋ณด์ด๊ธฐ(๋ฐ˜๋ณต๋ฌธ์€ ์„œ์น˜ 03๋ฒˆ ์ฐธ๊ณ )
//๋จผ์ € ๋ฒ„ํŠผ์„ ๋ชจ๋‘ ์„ ํƒํ•ด์ค€ ๋’ค forEach๋ฌธ์„ ํ†ตํ•ด ์š”์†Œ๋ฅผ ํด๋ฆญํ–ˆ์„ ์‹œ ํด๋ฆญํ•œ ์š”์†Œ๋ฅผ searchBtn์— ์ €์žฅ.
//๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜์—๊ฒŒ searchBtn๊ฐ’ ์ „๋‹ฌ
const search = document.querySelectorAll(".search__list span");
search.forEach((el) => {
    el.addEventListener("click", ()=> {
        const searchBtn = el.innerText;

        findProperty(searchBtn);
    });
});

#3. ๊ฒฐ๊ณผ

728x90

๋Œ“๊ธ€


Lucky Charms Rainbow
js
html
css