본문 바로가기
Javascript응용_Effect

Search Effect 01

by 코딩대원 2022. 8. 17.

Search Effect01

이번 시간에는 오늘 배운 indexOf()를 활용하여 만든 검색 프로그램에 대해 알아보겠습니다.
키워드를 입력하면 그와 관련된 태그들과 함께 설명이 나옵니다.


01. HTML

search__list에 있는 li에 data-name을 주어 검색으로 찾을 수 있게 해줍니다.

코드 보기
{
    <main id="main">
        <div class="search__wrap">
            <span>indexOf()를 이용하여 검색하기</span>
            <h1>HTML 태그 검색하기</h1>

            <div class="search__box">
                <label for="search">검색하기</label>
                <input type="text" id="search" placeholder="HTML 태그를 입력해주세요!">
            </div>
            <div class="search__list">
                <div class="html">
                    <ul>
                        <li data-name="a"><strong>a</strong> : a 태그는 다른 페이지 이동을 설정합니다.</li>
                        <li data-name="abbr"><strong>abbr</strong> : abbr 태그는 줄임말이나 머리글자를 표현하는데 사용합니다.</li>
                        <li data-name="acronym"><strong>acronym</strong> : acronym 태그는 줄임말이나 머리글자를 표현하는데 사용합니다.</li>
                        <li data-name="address"><strong>address</strong> : address 태그는 웹 페이지의 연락처 정보를 설정합니다</li>
                        <li data-name="applet"><strong>applet</strong> : applet 태그는 애플랫 요소를 설정합니다. 현재는 사용하지 않습니다.</li>
                        <li data-name="area"><strong>area</strong> : area 태그는 이미지 맵의 영역을 정의합니다. </li>
                        <li data-name="article"><strong>article</strong> : article 태그는 사이트의 독립적인 컨텐츠 섹션을 설정합니다.</li>
                        <li data-name="aside"><strong>aside</strong> : aside 태그는 주요 콘텐츠의 보조적 컨텐츠 섹션을 설정합니다.</li>
                        <li data-name="audio"><strong>audio</strong> : audio 태그는 오디오 파일을 설정합니다.</li>
                        <li data-name="b"><strong>b</strong> : b 태그는 다른 텍스트와 구별 할 때 설정합니다.</li>
                        <li data-name="base"><strong>base</strong> : base 태그는 모든 문서의 기본이 되는 URL을 설정합니다.</li>
                        <li data-name="basefont"><strong>basefont</strong> : basefont 태그는 문서의 기본 폰트, 사이즈, 종류를 설정합니다.</li>
                        <li data-name="bdi"><strong>bdi</strong> : bdi 태그는 텍스트의 출력 방향 영역을 설정합니다.</li>
                        <li data-name="bdo"><strong>bdo</strong> : bdo 태그는 텍스트의 방향을 설정합니다.</li>
                        <li data-name="big"><strong>big</strong> : big 태그는 텍스트의 크기를 크게 설정합니다.</li>
                        <li data-name="blockquote"><strong>blockquote</strong> : 태그는 긴 문장의 인용문을 설정합니다.</li>
                    </ul>
                </div>
            </div>
        </div>
    </main>
}

02. CSS

HTML로 짜놓은 틀에 CSS를 입힙니다.

코드 보기
{
    :root {
        --htmlColor : #223547;
        --cssColor : #472222;
        --javscriptColor : #224736;
    }
    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        font-family: 'NexonLv1Gothic';
        color: #223547;
    }
    *, *:before, *:after {
        box-sizing:border-box;
    }
    a {
        color: #223547;
        text-decoration: none;
    }
    li {
        list-style: none;
    }
    
    /* header */
    #header {
        display: flex;
        justify-content: space-between;
    }
    #header h1 {
        margin: 10px;
        font-family: 'Tmon';
        font-size: 40px;
    }
    #header nav {
        margin: 10px;
    }
    #header nav li {
        position: relative;
        display: inline;
    
    }
    #header nav li a {
        width: 30px;
        height: 30px;
        border: 1px solid var(--htmlColor);
        border-radius: 50%;
        display: inline-block;
        text-align: center;
        line-height: 30px;
        font-family: 'NexonLv1Gothic';
    }
    #header nav li.active a {
        background-color: #223547;
        color: #fff;
    }
    #header nav li .sub {
        position: absolute;
        left: 0;
        top: 35px;
        width: 400px;
    }
    #header nav li .sub a {
        width: auto;
        background-color: transparent;
        color: #223547;
        border: 0;
        text-align: left;
        line-height: 1.2;
    }
    #header nav li .sub li.active a {
        text-decoration: underline;
    } 
    /* main */
    #main {
        margin: 50px 10px;
    }
    .search__wrap {
        max-width: 1400px;
        margin: 0 auto;
        border: 3px solid #223547;
        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: #223547;
        font-size: 6vw;
        margin-bottom: 10px;
    }
    .search__box {
        margin-bottom: 40px;
    }
    .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 #223547;
        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;
    }
    @media (max-width: 600px){
        .search__wrap {
            padding: 20px;
        }
        .search__wrap > span {
            font-size: 16px;
            margin-bottom: 10px;
        }
        .search__wrap > h1 {
            font-size: 44px;
        }
        .search__box input {
            font-size: 16px;
            padding: 12px 30px;
        }
    }
    /* footer */
    #footer {
        text-align: center;
    }
    #footer a {
        color: #000;
        font-family: 'NexonLv1Gothic';
        padding-bottom: 50px;
    }
    #footer a:hover {
        text-decoration: underline;
    }

03. JAVASCRIPT

querySelector를 통해 선택자를 지정합니다.
addEventListener에 keyup 이벤트를 넣어 키를 누르고 뗐을 때 event를 발생시킵니다.
forEach문을 돌려 search__list의 모든 el을 순환합니다.
마지막으로 if문안에 indexOf 메서드를 넣어주어 맞는 값(키워드를 포함한 값)은 0을 반환하여 hide를 지워주고 나머지는 추가한 hide를 남겨줍니다.
결과적으로 indpxOf로 0을 반환한 값이 출력됩니다.

{
    //선택자
    const searchBox = document.querySelector(".search__box input");         //검색 영역
    const searchList = document.querySelectorAll(".search__list ul li");    //목록 리스트

    searchBox.addEventListener("keyup", () => { //키 누르고 땠을 때 event 발생
        const searchWord = searchBox.value;     //사용자가 입력한 키워드

        searchList.forEach(el => {
            const cssName = el.dataset.name;    //forEach문을 이용하여 search__list의 el 순환
            
            if(cssName.indexOf(searchWord)){    //searchWord(사용자 입력값)이 맞을 경우 indexOf가 0을 반환합니다.
                el.classList.add("hide");       
            } else {                            //0 은 false로
                el.classList.remove("hide");    //indexOf()값이 0(false)이되는 값만 hide를 지워줍니다.
            }
        });
    });
}

'Javascript응용_Effect' 카테고리의 다른 글

문제 05  (1) 2022.08.18
Search Effect 02  (2) 2022.08.17
문제 04  (9) 2022.08.08
문제 03  (9) 2022.08.06
문제 02  (6) 2022.08.04

댓글


HTML
CSS

JAVASCRIPT

자세히 보기