ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JS ํฌํŠธํด๋ฆฌ์˜ค ๋งŒ๋“ค๊ธฐ] ์„ ํƒํ•œ ๋ฒ„ํŠผ์— ํ•˜์ด๋ผ์ดํŠธ ์ฃผ๊ธฐ (์ƒ‰์ƒ๋ณ€๊ฒฝ)
    Mini Projects/make Portfolio 2022. 3. 24. 13:26

    2022.03.23

     


    ๐Ÿค”โ“์–ด๋–ป๊ฒŒ ์„ ํƒ๋œ ๋ฒ„ํŠผ์— ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ• ๊นŒ?

    ํ˜„์žฌ ์ƒํƒœ๋Š” work__categories๋ผ๋Š” ํฐ ํด๋ž˜์Šค ์•ˆ์— 3๊ฐœ์˜ category__btn์ด ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค.

      <div class="work__categories">
        <button class="category__btn selected" data-filter="*">All<span class="category__count selected">5</span></button>
        <button class="category__btn" data-filter="js">Javascript<span class="category__count">3</span></button>
        <button class="category__btn" data-filter="react">React<span class="category__count">2</span></button>
      </div>

    category__btn์„ ํด๋ฆญํ–ˆ์„ ๋•Œ, ํด๋ฆญ ๋œ ๋ฒ„ํŠผ์ด selected๋˜๋„๋ก ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค.

    (์ฆ‰, ๋ฒ„ํŠผ์„ ์„ ํƒํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ๋ฒ„ํŠผ์—๋งŒ!! ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด์„œ ์„ ํƒ๋œ ํšจ๊ณผ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค.)

     

    ์ผ๋‹จ, ๊ฐ ๋ฒ„ํŠผ์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ event.target์ด๋ผ๋Š” ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์ด์ „์‹œ๊ฐ„์„ ํ†ตํ•ด ๋ฐฐ์› ๋‹ค.

    ๊ทธ๋ž˜์„œ ์ด ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด์„œ ๊ฐ ๋ฒ„ํŠผ์— ์–ด๋–ป๊ฒŒ selected๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ข‹์„์ง€ ๊ณ ๋ฏผํ–ˆ๋‹ค.


    ๐Ÿ˜ƒโ—์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?

     

    1) ํด๋ฆญ๋œ ๋ฒ„ํŠผ์˜ data-๊ฐ’๊ณผ ๋™์ผํ•œ ๊ฐ’์ด ์žˆ๋Š” ์ƒ์ž์— ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?

    work__categories๋ฅผ ํด๋ฆญํ•ด์„œ event.target.dataset.filter๋ฅผ ํ†ตํ•ด ๊ฐ ๋ฒ„ํŠผ์˜ data-filter๊ฐ’์„ ๊ฐ€์ ธ์™”์œผ๋‹ˆ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์žฌํ™œ์šฉํ•˜๋ฉด ์–ด๋–จ๊นŒ?๋ผ๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

     

    ๊ทธ๋ž˜์„œ, data-filter๊ฐ’์„ ๊ฐ€์ ธ์˜จ ํ•จ์ˆ˜ ์•ˆ์— selected๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด๋ดค๋‹ค.

      setTimeout(() => {
        projects.forEach((project) => {
          if (filter === '*' || filter === project.dataset.filter) {
          	
            //ํ•ด๋‹น ํ•„ํ„ฐ๊ฐ’์„ ์„ ํƒํ•˜๋ฉด ์„ ํƒ๋œ ํ•„ํ„ฐ๊ฐ€ ์žˆ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ๋ฒ„ํŠผ์— selected๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž
            const categoryBtn = document.querySelector('category__btn');
            categoryBtn.classList.add('selected');
            
            project.classList.remove('invisible'); 
          ....
        });

    ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์ ์œผ๋‹ˆ ์•ˆ๋œ๋‹ค. ๋””๋ฒ„๊น…์„ ํ•ด๋ณด๋‹ˆ categoryBtn์˜ ๊ฐ€์žฅ ์ฒ˜์Œ๋ฒ„ํŠผ (ํ™ˆ๋ฒ„ํŠผ)์— selected๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

     

    ๋‚˜๋Š” ์ด๋ ‡๊ฒŒ ์ž‘๋™๋ ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ๋‹ค.

    ์ฝ”๋“œ ์˜ˆ์ƒ๊ฐ’ ์‹ค์ œ๊ฐ’
    categoryBtn.classList.add('selected');
    filter๊ฐ’์ด js์ธ ๋ฒ„ํŠผ ํด๋ž˜์Šค์—
    selected๊ฐ€ ์ถ”๊ฐ€๋จ
    ๊ฐ€์žฅ ์ตœ์ƒ๋‹จ์˜ ๋ฒ„ํŠผ ํด๋ž˜์Šค์—
    selected๊ฐ€ ์ถ”๊ฐ€๋จ
    [์ฐธ๊ณ ] project.classList.remove('invisible');
    project.invisible project.invisible

     

    ๋‚ด๊ฐ€ ์œ„์™€๊ฐ™์ด ์ƒ๊ฐํ–ˆ๋˜ ์ด์œ ๋Š” ๋‚ด๊ฐ€ ์„ ํƒํ•œ ๋ฒ„ํŠผ์˜ filter๊ฐ’๊ณผ project์˜ filter๊ฐ’์ด ๊ฐ™์œผ๋ฉด project์— ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ผ๋Š” ๋ช…๋ น์„ ๊ธฐ์กด์— ๋ดค์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค.

     

    ๊ทธ๋ ‡๋‹ค๋ฉด, ์นดํ…Œ์ฝ”๋ฆฌ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ filter๊ฐ’์ด ์žˆ์œผ๋‹ˆ ๋‚ด๊ฐ€ ์„ ํƒํ•œ ๋ฒ„ํŠผ์˜ filter๊ฐ’๊ณผ project์˜ filter๊ฐ’์ด ๊ฐ™์œผ๋ฉด category__btn์— ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€?๋ผ๊ณ  ์ƒ๊ฐ๋‹ค.

     

    ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ž‘๋™์‹œ์ผœ๋ดค์„ ๋•, ๋‚ด๊ฐ€ ์„ ํƒํ•œ ๋ฒ„ํŠผ์ด ์•„๋‹ˆ๋ผ ๊ฐ€์žฅ ์ตœ์ƒ๋‹จ์— ์žˆ๋Š” ๋ฒ„ํŠผ์— selected๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์ถ”๊ฐ€๋๋‹ค.

    ๊ทธ๋ ‡๋‹ค๋Š” ๋ง์€, ๋‚ด๊ฐ€ ์„ ํƒํ•œ ๋ฒ„ํŠผ์ด ํƒ€์ผ“์ด ๋˜์ง€ ์•Š์•˜๋‹จ ๊ฒƒ์ด๋‹ค.

     

    ์ง€๊ธˆ ์ด ๊ธ€์„ ์ž‘์„ฑํ•˜๋ฉด์„œ ์ฐฌ์ฐฌํžˆ ๋œฏ์–ด๋ณด๋‹ˆ, ๋‹น์—ฐํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

    ์™œ๋‚˜ํ•˜๋ฉด project์˜ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น filter๊ฐ’๊ณผ '์ง์ ‘์ '์œผ๋กœ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์—๋งŒ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    ๊ทธ๋Ÿฐ๋ฐ ๋‚˜๋Š” project์˜ filter๊ฐ’์ด ๋งž์œผ๋ฉด category์—๋„ ์ถ”๊ฐ€ํ•ด์ค˜๋ผ๋Š” '๊ฐ„์ ‘์ '์ธ ๋ช…๋ น์„ ๋‚ด๋ ธ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    ์ปดํ“จํ„ฐ๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํ–‰๋™์„ '์•„์ฃผ ๊ตฌ์ฒด์ ์œผ๋กœ'์ด์•ผ๊ธฐ ํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ช…๋ น์€ ์ „ํ˜€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค.

     

    ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, project๋ž‘ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๋ฉด ๋  ๊ฒƒ ๊ฐ™์•„ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.

    workCategories.addEventListener('click', (event) => {
      //๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ filter๊ฐ’์„ ๊ฐ€์ ธ์˜ด
      const filter = event.target.dataset.filter || event.target.parentNode.dataset.filter;
      if (filter == null) {
        return;
      }
      
      //์นดํ…Œ๊ณ ๋ฆฌ ๋ฒ„ํŠผ์„ ๋ชจ๋‘ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
      const categoryBtns = document.querySelectorAll('.category__btn');
      
      //์นดํ…Œ๊ณ ๋ฆฌ ๋ฒ„ํŠผ์„ ๋ชจ๋‘ ๋Œ๋ฉด์„œ, ๋‚ด๊ฐ€ ์„ ํƒํ•œ ๊ฐ’๊ณผ ์นดํ…Œ๊ณ ๋ฆฌ ๋ฒ„ํŠผ์˜ filter๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด 'selected'ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ 
      //๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ฒ„ํŠผ์„ ์ œ๊ฑฐํ•œ๋‹ค.
      categoryBtns.forEach((category) => {
        filter === category.dataset.filter ? category.classList.add('selected') : category.classList.remove('selected')
      });

    ์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ ์ž‘๋™์ด ๋œ๋‹ค.

     

     

    ํ•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

     

    1. ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋ฐฐ์—ด ๊ฐ’์˜ ์ผ์น˜์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ์‹œ๊ฐ„์ ์œผ๋กœ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค. ์ฆ‰, ์‹œ๊ฐ„ํšจ์œจ์„ฑ์ด ์ข‹์ง€ ์•Š๋‹ค.

    ๋‹จ์ˆœํžˆ ์„ ํƒ๋œ ๊ฐ’์„ ํ•˜์ด๋ผ์ดํŠธํ•˜๋Š”๋ฐ ๋ฐ˜๋ณต๋ฌธ์„ ๋„ฃ์„ ์ •๋„์˜ ์ฝ”๋“œ๋ฅผ ์งœ๋Š”๊ฑด ์ข€ ์˜ค๋ฒ„์ŠคํŽ™์ด๋ž€ ์ƒ๊ฐ์ด ๋“ ๋‹ค.

     

    2. ๊ธฐ์กด์— 'All'์— ์„ ํƒ๋˜์–ด์žˆ๋˜ ํ•˜์ด๋ผ์ดํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ชจ๋“  ๋ฒ„ํŠผ์ด ๋น„ํ™œ์„ฑํ™” ๋˜์–ด์žˆ๋Š” ์ƒํƒœ๋กœ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ, ๋ง‰์ƒ ๊ตฌํ˜„ํ•˜๊ณ  ๋‚˜๋‹ˆ๊นŒ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ 'All'์ด ์„ ํƒ๋˜์–ด์žˆ๊ณ , ๋‹ค๋ฅธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ๋ฒ„ํŠผ์ด ํ™œ์„ฑ๋˜๋„๋ก ๋งŒ๋“œ๋Š”๊ฒŒ ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹จ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

     

    ์œ„ ๋‘๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•œ๋ฒˆ ํ•ด๊ฒฐํ•ด๋ณด์ž.

    

     

    2) ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, ํ•ด๋‹น ๋ฒ„ํŠผ์˜ ๋…ธ๋“œ์ด๋ฆ„์„ ํ™œ์šฉํ•œ๋‹ค.

    workCategories.addEventListener('click', (event) => {
      ...
      //์„ ํƒ๋œ ์ƒํƒœ๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.
      const selected = document.querySelector('.category__btn.selected');
      selected.classList.remove('selected');
      
     });

     

    ๋จผ์ € ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™” ๋˜์–ด์žˆ๋„๋ก ๋งŒ๋“ค์–ด ๋ณด์ž.

     

    ๊ธฐ๋ณธ All๋ฒ„ํŠผ์„ ๋ชจ๋‘ ํ™œ์„ฑํ™” ๋˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ์•„์˜ˆ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ selected ๋์„ ๋•Œ ํด๋ž˜์Šค๋ฅผ ์ ์šฉ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

    selected(์„ ํƒ๋œ ์ƒํƒœ)๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ณ , ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์นดํ…Œ๊ณ ๋ฆฌ ๋ฒ„ํŠผ์˜ selected ํด๋ž˜์Šค๋ฅผ ์—†์•ค๋‹ค.

     

    ์ด์ œ ๋‚ด๊ฐ€ ์„ ํƒํ•œ ๋ฒ„ํŠผ์ด ํ•˜์ด๋ผ์ดํŠธ ๋˜๋„๋ก ๋งŒ๋“ค๊ฑด๋ฐ ์•ž์— 1๋ฒˆ์—์„œ๋Š” ์„ ํƒํ•œ ๋ฒ„ํŠผ์˜ data ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ํ•ด๋‹น data์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ธ์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” ๊ทธ๋ƒฅ event.target์„ ์ด์šฉํ•ด ์„ ํƒํ•œ ๋ฒ„ํŠผ์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋œ๋‹ค. 

     

    ์ด๋ ‡๊ฒŒ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ๋Š”๋ฐ ์™œ? ๋ผ๊ณ  ๋ฌป๋Š”๋‹ค๋ฉด, ๋‚˜๋Š” ๋‚ด๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” filter๊ฐ’์„ ์ด์šฉํ•˜๊ณ  ์‹ถ์—ˆ์„ ๋ฟ..์ด๋ผ๊ณ  ํ•ด๋‘์ž.

     

     

    event.target์„ ์ด์šฉํ•˜๋ฉด ๋‚ด๊ฐ€ ์„ ํƒํ•œ ๋ฒ„ํŠผ์˜ ์š”์†Œ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์—ฌ๊ธฐ์„œ ๋ฐ”๋กœ class๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

     

    workCategories.addEventListener('click', (event) => {
    
      //์„ ํƒ๋œ ์ƒํƒœ๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.
      const selected = document.querySelector('.category__btn.selected');
      selected.classList.remove('selected');
      
      // ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ํ•ด๋‹น ๋ฒ„ํŠผ์— selected ํด๋ž˜์Šค๊ฐ€ ๋“ค์–ด๊ฐ€๋„๋ก ํ•œ๋‹ค.
      const target = event.target.nodeName === 'BUTTON' ? event.target : event.target.parentNode;
      console.log(event.target);
      target.classList.add('selected');
      
     });

    ๊ทธ๋Ÿฐ๋ฐ ์™œ nodeName์ด ๋ฒ„ํŠผ์ธ ํ•ญ๋ชฉ๋งŒ ์„ ํƒํ•˜๋„๋ก ์กฐ๊ฑด๋ฌธ์„ ๋งŒ๋“ค์—ˆ๋ƒํ•˜๋ฉด, ์œ„ ๊ทธ๋ฆผ์—์„œ์™€ ๊ฐ™์ด button ์ƒ์ž ์•ˆ์— span์ƒ์ž๊ฐ€ ๊ฐ™์ด ๋“ค์–ด๊ฐ€ ์žˆ์–ด์„œ span์„ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด ์ž‘๋™์ด ์•ˆ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ƒ์ž๊ฐ€ button์ด ์•„๋‹ˆ๋ฉด (== span์ด๋ฉด) ํ•ด๋‹น ํƒ€๊ฒŸ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋„๋ก ๋งŒ๋“ ๊ฑฐ๋‹ค.

     

     

    ์ง , ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›ํ•˜๋Š” ๋Œ€๋กœ ์ž˜ ์„ ํƒ๋˜๊ณ  ์ž‘๋™๋œ๋‹ค.

    ์—ญ์‹œ, ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋ก ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹จ ์ƒ๊ฐ์ด ํ•œ๋ฒˆ๋” ๋“ค๋ฉด์„œ ๋‚ด๊ฐ€ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋Š”๋ฐ ๋ญ”๊ฐ€ ์ข€ ํ—ท๊ฐˆ๋ฆฌ๊ณ  ์žˆ์—ˆ๊ตฌ๋‚˜๋ฅผ ์•Œ๊ฒŒ ๋๋‹ค.

     


    eunne's github: https://github.com/eunne/Project_Portfolio.git

Designed by Tistory.