ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

JS

์บ๋Ÿฌ์…€(Carousel)

choi95 2021. 7. 10. 23:17

 

์บ๋Ÿฌ์…€(Carousel)์€ ์œ„์™€ ๊ฐ™์ด ์ปจํ…์ธ ๋ฅผ ์Šฌ๋ผ์ด๋“œ ํ˜•ํƒœ๋กœ ์ˆœํšŒํ•˜๋ฉฐ ํ‘œ์‹œํ•˜๋Š” UI๋ฅผ ๋งํ•œ๋‹ค.

 

์ด๋•Œ ๋ฌดํ•œ ๋ฃจํ•‘ ๊ธฐ๋Šฅ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฒ˜์Œ์— ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ์—์„œ ์ด์ „ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ์‹œ ๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ๋กœ ์ด๋™์„ ํ•˜๊ณ 

๋ฐ˜๋Œ€๋กœ ๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ์—์„œ ๋‹ค์Œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ์‹œ ์ฒ˜์Œ ์Šฌ๋ผ์ด๋“œ๋กœ ์ด๋™์„ ํ•ด์•ผ ํ•œ๋‹ค.

 

์ด๋ฅผ ์œ„ํ•ด ๋ณธ๋ž˜ ์ค€๋น„๋œ ์ด 4์žฅ์˜ ์ด๋ฏธ์ง€ ์ด์™ธ์— ์ฒ˜์Œ ๋‚˜์˜ค๋Š” ์ด๋ฏธ์ง€์™€ ๋งˆ์ง€๋ง‰์— ๋‚˜์˜ค๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ฐ๊ฐ ๋ณต์‚ฌํ•˜์—ฌ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์–‘ ๋์— 

์œ„์น˜์‹œํ‚จ๋‹ค.

 

๊ฒฐ๊ณผ์ ์œผ๋กœ ์Šฌ๋ผ์ด๋“œ ์ด๋ฏธ์ง€์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๋งจ ์ฒ˜์Œ ์ด๋ฏธ์ง€๋Š” ๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ ์ด๋ฏธ์ง€์ด๊ณ  ๋งˆ์ง€๋ง‰ ์ด๋ฏธ์ง€๋Š” ์ฒ˜์Œ

์Šฌ๋ผ์ด๋“œ ์ด๋ฏธ์ง€๊ฐ€ ์ ์žฌ๋œ๋‹ค. 

$container.addEventListener('click', e => {
    if(!e.target.classList.contains('carousel-control')) return;
      if(e.target.classList.contains('next')) { //๋‹ค์Œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ
        slides.style.setProperty('--currentSlide', ++currentSceneNum); //ํ˜„์žฌ ์”ฌ์— ๋งž๊ฒŒ ์ด๋™
        slides.style.setProperty('--duration', 500);
        if(currentSceneNum > 5) { //ํ˜„์žฌ ์”ฌ ์ธ๋ฑ์Šค๊ฐ€ ๋งˆ์ง€๋ง‰์ผ ๊ฒฝ์šฐ
          slides.style.setProperty('--currentSlide', 1);
          slides.style.setProperty('--duration', 0);
          currentSceneNum = 1; // ํ˜„์žฌ ์”ฌ ์ธ๋ฑ์Šค๋ฅผ ๋‹ค์‹œ ์ฒ˜์Œ ์”ฌ์— ๋Œ€์‘ํ•˜๋Š” ์ธ๋ฑ์Šค๋กœ ์ดˆ๊ธฐํ™”
        }
      } else { //์ด์ „ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ
        slides.style.setProperty('--currentSlide', (--currentSceneNum));
        slides.style.setProperty('--duration', 500);
        if(currentSceneNum < 0) { //ํ˜„์žฌ ์”ฌ ์ธ๋ฑ์Šค๊ฐ€ ์ฒ˜์Œ์ผ ๊ฒฝ์šฐ
          slides.style.setProperty('--currentSlide', 4); //๋งˆ์ง€๋ง‰ ์”ฌ์— ๋Œ€์‘ํ•˜๋Š” ์ธ๋ฑ์Šค๋กœ ์ดˆ๊ธฐํ™”
          slides.style.setProperty('--duration', 0);
          currentSceneNum = 4;
        }
      }
  })

์ด๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์•ž๋’ค๋กœ ์›€์ง์ด๋Š” ์ƒํ™ฉ์ด ์•„๋‹Œ ๋งจ ์ฒ˜์Œ์ด๋‚˜ ๋งจ ๋งˆ์ง€๋ง‰์—์„œ ์ด๋™ํ•  ๊ฒฝ์šฐ์—๋Š” transition์˜ duration ๊ฐ’์€ 0์œผ๋กœ ์ค˜์•ผ์ง€

์‚ฌ์šฉ์ž ์‹œ์ ์—์„œ๋Š” ์Šฌ๋ผ์ด๋“œ๊ฐ€ ์ด๋™์ด ๋˜์—ˆ๋Š”์ง€ ๊ฐ€์‹œ์ ์œผ๋กœ ์ธ์ง€ ๋ชปํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

transitionend Event

๋ฌดํ•œ ๋ฃจํ•‘ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ Click ์ด๋ฒคํŠธ ๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ๋  ์กฐ๊ฑด ์—ฐ์‚ฐ๋“ค์ด ๋„ˆ๋ฌด ๋งŽ์•„์ ธ์„œ ์ฝ”๋“œ์˜ ํšจ์œจ์„ฑ๋„ ๋ถ€์กฑํ•˜๊ณ  ๊ฐ€๋…์„ฑ๋„ ๋–จ์–ด์กŒ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋Œ€์‹ ์— transitionend ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค.

transitionend๋Š” ์ „ํ™˜ ์ƒํƒœ๋ฅผ ์ „ํ™˜ ์™„๋ฃŒ๋กœ, ๊ธฐ๋ณธ ๋˜๋Š” ๋น„ ์ „ํ™˜ ์ƒํƒœ๋กœ ์™„์ „ํžˆ ๋˜๋Œ์•„ ๊ฐ„๋‹ค - ์ด๋ฒคํŠธ๊ฐ€ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 
$container.ontransitionend = () => {
    isMoving = false;

    // currentSlide === 0, ์ฆ‰ ์„ ๋‘์— ์ถ”๊ฐ€ํ•œ ํด๋ก  ์Šฌ๋ผ์ด๋“œ๋ฉด currentSlide += images.length๋กœ image์˜ ๋งˆ์ง€๋ง‰(images.length)์œผ๋กœ ์ด๋™
    // currentSlide === images.length + 1, ์ฆ‰ ๋งˆ์ž๋ง‰์— ์ถ”๊ฐ€ํ•œ ํด๋ก  ์Šฌ๋ผ์ด๋“œ๋ฉด currentSlide -= images.length๋กœ image์˜ ์„ ๋‘(1)๋กœ ์ด๋™
    // ํด๋ก  ์Šฌ๋ผ์ด๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด currentSlide += 0์œผ๋กœ ์ด๋™ํ•˜์ง€ ์–บ๋Š”๋‹ค.
    const delta = currentSlide === 0 ? 1 : currentSlide === images.length + 1 ? -1 : 0;

    // ํด๋ก  ์Šฌ๋ผ์ด๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด(delta === 0) ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    if (!delta) return;

    currentSlide += images.length * delta;
    move(currentSlide);
  };
};
๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
๊ธ€ ๋ณด๊ด€ํ•จ