๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
javascript๐Ÿช“/์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ณต๋ถ€

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์Šฌ๋ผ์ด๋“œ ์ธ๋””์ผ€์ดํ„ฐ indicator ๊ตฌํ˜„ํ•˜๊ธฐ (active or forEach)

by hyojinny 2023. 10. 23.

 

์•„๋ž˜์— indecator ์š”์†Œ๋ฅผ ๋„ฃ์–ด ํ•˜๋‚˜ ์„ ํƒ์‹œ ์ƒํƒœ๊ฐ’์ด ๋ฐ”๋€Œ๊ฒŒ ํ•œ๋‹ค. 

์˜ˆ์‹œ๋กœ ๋นจ๊ฐ›๊ฒŒ ์ƒ‰์ด ๋ฐ”๋€Œ๊ฒŒ ์ ์šฉ

 


๊ธฐ๋ณธ html ์ฝ”๋“œ๋ฅผ ์ ์–ด์ค€ํ›„ 

          <ul class="slide_pagination">
            <li></li>
            <li></li>
            <li></li>
          </ul>

scss๋กœ ์ž๋ฆฌ์žก์•„์ฃผ๊ธฐ 

&.active ๋กœ ์ƒ‰์ƒ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ css  ์š”์†Œ์— ์ ‘๊ทผํ•œ๋‹ค 

      .slide_pagination {
        @include flex-row();
        gap: 15px;
        position: absolute;
        left: 50%;
        bottom: 50px;
        transform: translateX(-50%);

        li {
          width: 7px;
          height: 7px;
          border-radius: 50%;
          background-color: #fff;

          &.active {
            background-color: red;
          }
        }
      }

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์š”์†Œ ์„ ํƒ 

 

 

 

//์ธ๋””์ผ€์ดํ„ฐ ์š”์†Œ ์„ ํƒ
const indicatorItems = document.querySelectorAll('.slide_pagination li');
console.log('indicatorItems: ', indicatorItems);

querySelectorAll ๋กœ document ์— ์ ‘๊ทผํ•ด .slide_pagination ์ด๋ฆ„์˜ li ์˜ ํƒœ๊ทธ์— ๋ชจ๋‘ ์ ‘๊ทผํ•œ๋‹ค.

๋ณ€์ˆ˜๋กœ ๋งŒ๋“  indicatoritems ์•ˆ์— li์˜ ๋ฐฐ์—ด 3๊ฐœ ํ™•์ธ


 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐฉ๋ฒ• 1 (active ์ „์ฒด ์ง€์šฐ๊ณ  ํ•œ๊ฐœ๋งŒ ์ ์šฉ)

active ์ƒํƒœ๋ฅผ ๋ชจ๋‘์—๊ฒŒ ์ ์šฉํ•œ ํ›„ ํด๋ฆญ์‹œ ๋‚˜๋จธ์ง€ li ์— ์ ์šฉ๋œ active ์š”์†Œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

 

//forEach๋ฌธ์€ for๋ฌธ๊ณผ ๋‹ฌ๋ฆฌ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋„ ๋ฉˆ์ถ”์ง€์•Š๊ณ  ๋™์ž‘

forEach ๋ฌธ ์•ˆ์— ๋˜ forEach ๋ฌธ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด active ์ƒํƒœ๋ฅผ ์ œ๊ฑฐ ํ•ด์ค€๋‹ค. 

// 1. ์ธ๋””์ผ€์ดํ„ฐ ์„ ํƒ ๋ฐฉ๋ฒ• - active ์ƒํƒœ์ œ๊ฑฐ
indicatorItems.forEach(function (indicator) {
  indicator.addEventListener('click', function () {
    // indicator li ๋“ค์˜ active๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐ
    
    indicatorItems.forEach(function (indicatorRemove) {
      indicatorRemove.classList.remove('active');
    });
    
    // ์„ ํƒ๋œ li๋งŒ active ์ถ”๊ฐ€
    indicator.classList.add('active');
  });
});

 


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐฉ๋ฒ•2 (์ƒํƒœ๊ฐ’์„ ํ•จ์ˆ˜์— ๋‹ด์•„ true.false ์ผ๋•Œ active ์ ์šฉ)

 

active ์ƒํƒœ add or remove 

// 2. ์ธ๋””์ผ€์ดํ„ฐ ์„ ํƒ ๋ฐฉ๋ฒ• -  (์„ ํ˜ธ)
let beforeSelected;

//์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ if ์กฐ๊ฑด์„ ๊ฑธ์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.
indicatorItems.forEach(function (indicator) {
  indicator.addEventListener('click', function () {
    //ํด๋ž˜์Šค ์ถ”๊ฐ€ ์ „ ์–ธ๋””ํŒŒ์ธ
    console.log('before beforeSelected: ', beforeSelected);

    // ๋˜ ์„ ํƒ์ด ๋˜๋ฉด ํด๋ฆญ ํ™œ์„ฑํ™” ์ „์œผ๋กœ ๋Œ๋ฆฌ๊ธฐ
    // true ์ด๋ฉด (๊ฐ’์ด ์žˆ์œผ๋ฉด) ์ฝ”๋“œ์‹คํ–‰
    if (beforeSelected) {
      beforeSelected.classList.remove('active');
      console.log('ifbeforeSelected: ', beforeSelected);
    }

    //ํด๋ฆญ์ด ๋œ๋‹ค๋ฉด li ์— ์—‘ํ‹ฐ๋ธŒ์š”์†Œ ์ถ”๊ฐ€
    indicator.classList.add('active');

    //์„ ํƒ์ „ ์ƒํƒœ ๋ณ€์ˆ˜์— liํด๋ฆญ์‹œ ์š”์†Œ๋ณ€ํ™” ๋‹ด๊ธฐ๋ฉด true
    beforeSelected = indicator;
    console.log('after beforeSelected: ', beforeSelected);
  });
});

ํ•จ์ˆ˜ beforeSelected ๋ฅผ ์„ ์–ธํ•ด ์ค€ํ›„,  ์„ ํƒ๋˜๊ธฐ ์ „ ๊ฐ’์„ ๋„ฃ๊ณ  

forEach ์•ˆ์—์„œ ์žฌ์„ ํƒ์ด ๋˜์–ด ๊ฐ’์ด ์žˆ๋Š” (์ฆ‰ true )๊ฐ€ ๋˜์–ด์žˆ์„๋•Œ active ๋ฅผ remove ์‹œ์ผœ ๋ฐฑ์ง€์ƒํƒœ๊ฐ’์œผ๋กœ ๋Œ๋ ค์ค€๋‹ค. 

 


์ฒ˜์Œ li ๋ฅผ ํด๋ฆญํ–ˆ์„๋•Œ 

beforeSelected ๋Š” undefined ์ง€๋งŒ 

 

๋‹ค๋ฅธ li ๋ฅผ ํด๋ฆญํ•œ๋‹ค๋ฉด ์ด๋ฏธ ๋‹ค๋ฅธ li ๊ฐ€ ์„ ํƒ๋˜์–ด ๊ฐ’์ด ๋“ค์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— 

beforeSelected ๊ฐ€ true ๋กœ li ๊ฐ€ ์„ ํƒ์ด ๋˜์–ด์žˆ๋‹ค๊ณ  ๋‚˜์˜จ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ๋‹ค๋ฅธ active ๋ฅผ ์ง€์›Œ์ฃผ๊ณ  ๋‹ค์‹œ ๋ถ€์—ฌํ•œ๋‹ค

 

 

 

 

๋‹ค์Œ์œผ๋กœ ์ธ๋””์ผ€์ดํ„ฐ ์š”์†Œ ์„ ํƒ์‹œ ์Šฌ๋ผ์ด๋“œ ๋„˜์–ด ๊ฐ€๊ฒŒ ๋งŒ๋“ค๊ธฐ 

๋Œ“๊ธ€