ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JS ํฌํŠธํด๋ฆฌ์˜ค ๋งŒ๋“ค๊ธฐ] ์„ ํƒํ•œ ํ•ญ๋ชฉ๋งŒ ํ•„ํ„ฐ๋งํ•˜๊ธฐ (์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ ์ ์šฉ)
    Mini Projects/make Portfolio 2022. 3. 22. 07:46

    2022.03.22


    ๐Ÿค”โ“ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹นํ•˜๋Š” ์ •๋ณด๊ฐ€ ํ•„ํ„ฐ๋ง ๋˜์–ด ์กฐํšŒ๋œ๋‹ค.

    ์˜ค๋Š˜๋ถ€ํ„ฐ๋Š” JS๋ฅผ ์ž…ํ˜€ ์กฐ๊ธˆ ๋” ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ๋งŒ๋“œ๋ ค ํ•œ๋‹ค.


    ๐Ÿ˜ƒโ—์ด๋ ‡๊ฒŒ ํ•ด๋ณด์ž

     

    1) ๊ฐ ํ•„ํ„ฐ๋ฒ„ํŠผ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

    (1) data- ๋ฅผ ์ด์šฉํ•˜์ž

    <div class="section__container">
      <div class="work__categories">
        <button class="category__btn active" data-filter="*">All<span class="category__count active">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>
      <div class="work__projects">
        <!-- href: git url -->
        <a href="#" class="project" target="blank" data-filter="js">
        ...
      </section>

    ๋ฒ„ํŠผ์— ํ•ด๋‹นํ•˜๋Š” work__catergories์˜ ๊ฐ ๋ฒ„ํŠผ ํด๋ž˜์Šค์— data-filter๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•„ํ„ฐ๋ง๋˜๋Š” ์ •๋ณด์ธ work__projects์˜ ๊ฐ ํ”„๋กœ์ ํŠธ์—๋„ data-filter๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

    ๋ฒ„ํŠผ๊ณผ ๊ฐ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•œ data-filter์˜ ๊ฐ’์ด ๊ฐ™์€ ํ•ญ๋ชฉ๋ผ๋ฆฌ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•„ํ„ฐ๋ง๋˜์–ด ๋‚˜์˜ค๋„๋ก ๋งŒ๋“ค๊ฑฐ๋‹ค.

    //project filtering
    const workCategories = document.querySelector('.work__categories');
    const workProjects = document.querySelector('.work__projects');
    const projects = document.querySelectorAll('.project');
    
    workCategories.addEventListener('click', (event) => {
      const filter = event.target.dataset.filter
      console.log(filter);
    })

    console.log๋กœ ํ™•์ธํ•ด๋ณด๋ฉด event.target ์œผ๋กœ ์•ž์—์„œ ์„ค์ •ํ•œ data-filter์˜ ๊ฐ’์„ ์ž˜ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    ํ•˜์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚˜๋Š” ๋™๊ทธ๋ผ๋ฏธ ์•ˆ์— ๋“ค์–ด๊ฐ„ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด undefined๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    ์•„๋งˆ๋„ ๋ฒ„ํŠผ ์•ˆ์— spanํ˜•ํƒœ๋กœ ์ •์˜๋˜์–ด์„œ ํ•ด๋‹น ๋ฒ„ํŠผ์—๋Š” ๊ฐ’์ด ์ ์šฉ์ด ์•ˆ๋œ ๋“ฏ ํ•˜๋‹ค. (event๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” target์„ ํŠน์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹๋…ธ๋“œ๊นŒ์ง€๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์ ์šฉ์ด ์•ˆ๋˜๋Š”๊ฑธ๊นŒ?)

    (2) ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€๋ณด์ž

    ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ์—์„œ ํ™•์ธํ•ด๋ณด์ž

    ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ํฌ๋กฌ ๊ฐœ๋ฐœ์ž๋ชจ๋“œ์— ๋“ค์–ด๊ฐ€์„œ undefined๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ถ€๋ถ„์— breakpoint๋ฅผ ๊ฑธ์–ด๋‘๊ณ  local ๋“ฑ์—์„œ ์–ด๋–ค ํ•ญ๋ชฉ๋“ค์ด ์ ์šฉ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณธ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ํ˜„์žฌ event.target์ด ๋ฐœ์ƒํ•œ ๋ฒ„ํŠผ(category__count.active)์˜ ๋ถ€๋ชจ๋…ธ๋“œ(button.category__btn.active)์— ์•ž์—์„œ filter๋ฅผ ์„ค์ •ํ•ด๋†“์•˜๋˜ ํด๋ž˜์Šค๊ฐ€ ๋“ค์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ์—๋Š” ๋ถ€๋ชจ๋…ธ๋“œ๋กœ ์˜ฌ๋ผ๊ฐ€์„œ data๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ค์ •ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

    workCategories.addEventListener('click', (event) => {
      const filter = event.target.dataset.filter || event.target.parentNode.dataset.filter
      console.log(filter);
    })

    undefined๋Š” ์กฐ๊ฑด๋ฌธ์—์„œ false๊ฐ’์„ ๊ฐ€์ง€๋‹ˆ 'or'์˜ ํ˜•ํƒœ๋กœ ๋ฌธ๋ฒ•์„ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋‹ˆ ์ž˜ ๋‚˜์˜จ๋‹ค.


    2) ํ•„ํ„ฐ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋งŒ ์กฐํšŒ๋˜๋„๋ก ๋งŒ๋“ ๋‹ค.

    (1) ํ•„ํ„ฐ๋ฒ„ํŠผ๊ฐ’๊ณผ ๋น„๊ตํ•  ํ”„๋กœ์ ํŠธ์˜ ๊ฐ’์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด forEach๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ฑด์„ ์ˆœํšŒํ•œ๋‹ค.

    //project filtering
    
    //๋ชจ๋“  ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐ์—ด๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด queryselectorall์„ ์‚ฌ์šฉํ–ˆ๋‹ค.
    const projects = document.querySelectorAll('.project');
    
    workCategories.addEventListener('click', (event) => {
      const filter = event.target.dataset.filter || event.target.parentNode.dataset.filter;
    
      if (filter == null) {
        return;
      }
      projects.forEach((project) => {
        console.log(project);
      });
    });

    foreach๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๋ฅผ ์กฐํšŒํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด target์œผ๋กœ ์ง€์ •ํ•œ ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด, ๋ชจ๋“  ์กฐ๊ฑด๋“ค์„ ์กฐํšŒํ•ด์„œ ์ผ์น˜ํ•˜๋Š” ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
    ๊ทธ๋Ÿฌ๋Ÿฌ๋ฉด ์ˆœํšŒ๋ฅผ ํ•ด์•ผํ•˜๋Š”๋ฐ for๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋‚˜ forEach๋ผ๋Š” ๋” ๊ฐ„๋‹จํ•œ ์กฐ๊ฑด๋ฌธ์ด ์žˆ์œผ๋‹ˆ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค.
    ์ถœ๋ ฅํ•ด๋ณด๋‹ˆ ์ž˜ ๋‚˜์˜จ๋‹ค.

    ...
    if (filter == null) {
        return;
      }
      projects.forEach((project) => {
        console.log(project.dataset.filter);
        project.dataset.filter == 'js' ? console.log('true') : console.log('false');
      });

    ๋ฐ˜๋ณต๋ฌธ๋“ค ๋Œ๋ฉฐ ๋‚˜์˜ค๋Š” ๊ฐ’๊ณผ, ํ•ด๋‹น ๋ฒ„ํŠผ์— ์„ค์ •๋˜ ์žˆ๋Š” ๊ฐ’์ด ๋™์ผํ•˜๋ฉด true๊ฐ€ ๋‚˜์™€์•ผ ํ•˜๋‹ˆ, ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณธ๋‹ค.
    ๊ทธ๋ƒฅ project๋งŒ ์ ์œผ๋ฉด ์œ„์™€๊ฐ™์ด project์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค๋ฅผ ํŠน์ •ํ•ด์ค˜์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.
    ๊ทธ๋ž˜์„œ dataset.filter๋ผ๊ณ  ๊ตฌ์ฒด์ ์œผ๋กœ ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค.

    ์—ฌ๊ธฐ์„œ ๋“œ๋Š” ์˜๋ฌธ์€, ๋น„๊ต๋Œ€์ƒ์ด ๋˜๋Š” '์ƒ์ˆ˜๊ฐ’(์œ„์—์„œ๋Š” 'js')'์ด ๊ณ ์ •์ธ๋ฐ, ๋งŒ์•ฝ ๊ทธ ๋น„๊ต๋Œ€์ƒ์ด ๋” ๋งŽ์•„์ง€๋ฉด ์ค‘์ฒฉ for๋ฌธ์„ ์จ์•ผํ•˜๋Š”๊ฑธ๊นŒ?


    ์•„๋‹ˆ๋‹ค.
    ๋‚ด๊ฐ€ ๋ญ˜ ์ž˜๋ชป์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

    (1)์—์„œ ๊ตฌํ–ˆ๋˜ ๊ฒƒ์ด ํ•„ํ„ฐ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋‚˜์˜ค๋Š” '์ƒ์ˆ˜๊ฐ’'์ด๊ณ 
    (2)์—์„œ๋Š” ์กฐํšŒ๋Œ€์ƒ์ด ๋˜๋Š” ํ”„๋กœ์ ํŠธ๋“ค์„ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋Œ๋ฉด์„œ (1)์—์„œ์˜ ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋„๋ก ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

    [js]
    
    workCategories.addEventListener('click', (event) => {
    
      //ํ•„ํ„ฐ์˜ ์ƒ์ˆ˜๊ฐ’ ๊ตฌํ•˜๊ธฐ
      const filter = event.target.dataset.filter || event.target.parentNode.dataset.filter;
      
      //ํ•„ํ„ฐ๋ฒ„ํŠผ์˜ ๋‹ค๋ฅธ ๊ณณ์„ ๋ˆŒ๋ €์„ ๋•Œ undefiend๊ฐ€ ๋‚˜์˜ค๋ฏ€๋กœ ํ•ด๋‹น ํด๋ฆญ์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์—†์• ์ค€๋‹ค.
      if (filter == null) {
        return;
      }
      
      //๊ฐ ํ”„๋กœ์ ํŠธ์˜ ๊ฐ’์„ ์กฐํšŒํ•˜๊ธฐ
      projects.forEach((project) => {
    
    	// ํ•„ํ„ฐ๊ฐ’์ด *์ด๊ฑฐ๋‚˜, ํ”„๋กœ์ ํŠธ ๊ฐ’๊ณผ ๋™์ผํ•˜๋‹ค๋ฉด ํ•ญ๋ชฉ์ด ๋ชจ๋‘๋‹ค ๋ณด์ด๋„๋ก ๋งŒ๋“ค์ž
        if (filter === '*' || filter === project.dataset.filter) {
          project.classList.remove('invisible')
        } else {
          project.classList.add('invisible')
        }
      });
    });
    [css]
    
    .project.invisible {
      display: none;
    }


    ํ•„ํ„ฐ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, ํ•„ํ„ฐ๋ฒ„ํŠผ๊ฐ’์ด *์ด๊ฑฐ๋‚˜ ํ•ด๋‹น ๊ฐ’๊ณผ ํ”„๋กœ์ ํŠธ๋“ค์˜ ๊ฐ’์„ ๋น„๊ตํ•ด์„œ ์ผ์น˜ํ•˜๋ฉด ๋ณด์ด๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
    ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๋“ค์ด '๋ณด์—ฌ์ง„'์ƒํƒœ์ด๋‹ˆ, ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ๋“ค์—๋งŒ invisible ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด์„œ ์•ˆ๋ณด์ด๋„๋ก ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

    3) ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ค˜ ๋ณด์ž

    ๊ฐ ํ”„๋กœ์ ํŠธ ํ•ญ๋ชฉ์ด ํ•„ํ„ฐ๋ง ๋  ๋•Œ, ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ค˜๋ณด๋„๋ก ํ•˜์ž.

    [js]
    
    workCategories.addEventListener('click', (event) => {
    ...
      //์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๊ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ์ƒ์ž์—๋‹ค๊ฐ€ ์คŒ
      workProjects.classList.add('anime-out');
    ...
    });

    ๊ฐ ํ”„๋กœ์ ํŠธ์— ์ฃผ๋ฉด ๋˜๋‚˜ ํ–ˆ๋Š”๋ฐ, ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ์ƒ์ž์—๋‹ค๊ฐ€ ์ฃผ๋ฉด ํ•œ๋ฒˆ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ผ์–ด๋‚จ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ์ƒ์ž์—๋‹ค๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฃผ๋„๋ก ํ•œ๋‹ค.

    [css]
    
    .work__projects {
      display: flex;
      flex-wrap: wrap;
      justify-content: center;
      padding: var(--padding-20);
      opacity: 1;
    
      transition: all var(--animation-duration) ease-out;
    }
    
    .work__projects.anime-out {
      opacity: 0;
      transform: scale(0.96, 0.96) translateY(40px);
    }

    transition์ด ์ผ์–ด๋‚˜๋Š” ๊ฑด ๋ฉ”์ธ ํด๋ž˜์Šค(.work__projects)์— ์ •์˜ํ•ด์•ผ ํ•ด๋‹น ๋ฐ•์Šค์— ์ƒˆ๋กœ์šด ํด๋ž˜์Šค(.anime-out)๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉฐ ๋ณ€ํ™˜๋  ๋•Œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.

    ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์‚ฌ๋ผ์ง€๋ฉด์„œ ์ƒ์ž๊ฐ€ ์•„๋ž˜๋กœ ์ž‘์•„์ง€๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.

    (1) ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ–ˆ๋”๋‹ˆ ์ƒ์ž๊ฐ€ ์‚ฌ๋ผ์ ธ๋ฒ„๋ ธ๋‹ค?

    ๊ทธ๋Ÿฐ๋ฐ ์œ„ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•ด๋ณด๋ฉด ์ƒ์ž๊ฐ€ ์‚ฌ๋ผ์ง„์ƒํƒœ๋กœ ๊ณ„์† ์กด์žฌํ•œ๋‹ค.
    ์™œ๋ƒํ•˜๋ฉด opacity๊ฐ€ 0์ธ ์ƒํƒœ๋กœ ๊ณ„์† ์ ์šฉ๋˜์–ด์žˆ๋Š” ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    ๊ทธ๋ž˜์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ฐœ์ƒํ•˜๊ณ  ์ผ์ •์‹œ๊ฐ„ ๋’ค์— ํ•ด๋‹น ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ข…๋ฃŒํ•ด์ฃผ๋Š” ๋ช…๋ น์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

    (2) setTimeout()

    workCategories.addEventListener('click', (event) => {
    ...
      setTimeout(() => {
        workProjects.classList.remove('anime-out');
      }, 300);
    ...
    });

    300ms ํ›„์— workprojects ์•ˆ์˜ anime-outํด๋ž˜์Šค๋ฅผ ์ œ๊ฑฐํ•ด์ค˜.๋ผ๋Š” ๋ช…๋ น์ด๋‹ค.
    ์ด๋ ‡๊ฒŒ ์ ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ๋œ ํ›„์— ๋‹ค์‹œ ์ƒ์ž๋“ค์ด ๋ณด์ด๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    ํ•˜์ง€๋งŒ, ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ณด๋ฉด ์ด๋ฏธ 'ํ•„ํ„ฐ๋ง์ด ๋œ ํ›„์— ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ'๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์˜๋ฏธ๊ฐ€ ์žˆ์œผ๋ ค๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ ๋˜๋ฉด์„œ ํ•„ํ„ฐ๋ง์ด ๋˜์–ด์•ผ ํ•˜๊ธฐ์— ๋ฐฉ๋ฒ•์„ ๋‹ค์‹œ ๋ฐ”๊ฟ”๋ณธ๋‹ค.
    (์ฆ‰, ์ง€๊ธˆ์€ ํ•„ํ„ฐ๋ง์ด ๋˜๊ณ  -> ์•„๋ž˜๋กœ ์‚ฌ๋ผ์ง€๋ฉด์„œ ๋‹ค์‹œ ์˜ฌ๋ผ์˜ค๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ๋˜์–ด์žˆ์ง€๋งŒ
    ์•„๋ž˜๋กœ ์‚ฌ๋ผ์ง€๋ฉด์„œ ๋‹ค์‹œ ์˜ฌ๋ผ์˜ฌ ๋•Œ -> ํ•„ํ„ฐ๋ง์ด ๋˜๋„๋ก ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ฐ”๊พธ๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.)

    ํ˜„์žฌ ์ด๋Ÿฐ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋ฅผ ์‚ดํŽด๋ณด์ž.
    ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด
    1. ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ๋œ๋‹ค.
    2. ์„ ํƒํ•œ ํ•ญ๋ชฉ์ด ํ•„ํ„ฐ๋ง์ด ๋œ๋‹ค.
    3. ์• ๋‹ˆ๋ฉ”์ด์…˜์„ 300ms ํ›„์— ์ œ๊ฑฐํ•œ๋‹ค.

    ํ˜„์žฌ js๋Š” deferํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋„๋ก ์„ค์ •ํ–ˆ๊ธฐ๋•Œ๋ฌธ์—, ๋ชจ๋“  ์š”์†Œ๋“ค์ด ๋™๊ธฐ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ์—…๋ฐ์ดํŠธ ๋œ๋‹ค.
    ์ฆ‰, 1,2,3๋ฒˆ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ํ•  ์ค€๋น„๋ฅผ ๋™์‹œ์— ํ•œ ํ›„์—, ๋Œ€๊ธฐ๋ฅผ ํ–ˆ๋‹ค๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ •๋ณด๋ฅผ ์ฝ์–ด์˜ค๋Š” ์ผ์ด ๋ชจ๋‘ ๋๋‚˜๋ฉด ๊ทธ ๋•Œ ์‹คํ–‰๋œ๋‹ค.
    ๋‹จ์ง€ 1,2๋ฒˆ์€ ๋™์‹œ์— ์‹คํ–‰๋˜๊ณ  3๋ฒˆ์€ 300msํ›„์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

    ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— 1๋ฒˆ์ด ๋จผ์ € ์ ์šฉ๋˜๊ณ  2,3๋ฒˆ์ด ๋‚˜์ค‘์— ์‹คํ–‰๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 2๋ฒˆ๊ณผ 3๋ฒˆ์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์ฃผ๋ฉด ๋œ๋‹ค.
    (1๋ฒˆ์ด ๋จผ์ € ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” '์•„๋ž˜๋กœ ์‚ฌ๋ผ์ง€๋Š” ํšจ๊ณผ'๋ฅผ ์ ์šฉ ํ•œ ํ›„์— -> 'ํ•ด๋‹น ํšจ๊ณผ๋ฅผ ์—†์• ๋ฉด์„œ ํ•„ํ„ฐ๋ง ํ•ญ๋ชฉ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ'์ด๋‹ค.)

    ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ 3๋ฒˆ settimeout ํ•จ์ˆ˜ ์•ˆ์— 2๋ฒˆ ์ฝ”๋“œ๋ธ”๋Ÿญ์„ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

    workCategories.addEventListener('click', (event) => {
      ...
      
      //์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๊ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ์ƒ์ž์—๋‹ค๊ฐ€ ์คŒ
      workProjects.classList.add('anime-out');
    
      setTimeout(() => {
      
      	//ํ”„๋กœ์ ํŠธ ํ•„ํ„ฐ๋ง ์ฝ”๋“œ๋ฅผ settimeoutํ•จ์ˆ˜ ์•ˆ์— ๋„ฃ์—ˆ๋‹ค.
        projects.forEach((project) => {
    
          if (filter === '*' || filter === project.dataset.filter) {
            project.classList.remove('invisible')
          } else {
            project.classList.add('invisible')
          }
          
        workProjects.classList.remove('anime-out');
        });
        
      }, 300);
    });


    ๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ์ƒ์ž๊ฐ€ ์•„๋ž˜๋กœ ์‚ฌ๋ผ์ง€๊ณ  '์˜ฌ๋ผ์˜ค๋ฉด์„œ ํ•„ํ„ฐ๋ง ๋˜๋Š”' ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ํƒ„์ƒํ•œ๋‹ค.

    ์˜ค๋Š˜์€ ๋ญ”๊ฐ€ js์˜ ๋™๊ธฐ์ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณธ ๊ฒƒ ๊ฐ™์•„์„œ ์ดํ•ด๊ฐ€ ๋” ์ž˜ ๋œ ๊ฒƒ ๊ฐ™๋‹ค.
    ์ ์  ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋“ค์ด ๋‚˜์™€์„œ ์žฌ๋ฐŒ๋‹ค.


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

Designed by Tistory.