๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Effect/Slide Effect

[Slide Effect] ์Šฌ๋ผ์ด๋“œ ์ดํŽ™ํŠธ 03 - ์ขŒ๋กœ ์›€์ง์ด๊ธฐ(์—ฐ์†์ ์œผ๋กœ)

by ์ฝ”๋”ฉ๊ณต์ฑ… 2022. 9. 1.
๋ฐ˜์‘ํ˜•

์Šฌ๋ผ์ด๋“œ ์ดํŽ™ํŠธ 03

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ๊ทธ ๋™์•ˆ ๋ฐฐ์› ๋˜ JavaScript๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šฌ๋ผ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 2์ดˆ๋งˆ๋‹ค ๋‹ค์Œ ์‚ฌ์ง„์œผ๋กœ ์Šฌ๋ผ์ด๋“œ ๋˜๋Š” ํšจ๊ณผ์ด๋ฉฐ, JS ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. HTML, CSS ์ฝ”๋“œ๋Š” ์›๋ณธ ์†Œ์Šค ๋ณด๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํ™•์ธํ•ด์ฃผ์„ธ์š”.

์ž, ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”?


01. ๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜(const/let) ์„ ์–ธํ•˜๊ธฐ

ํ•„์š”ํ•œ ๋งŒํผ์˜ ๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•ด์ฃผ๋„๋ก ํ•œ๋‹ค.

const sliderWrap = document.querySelector(".slider__wrap");
const sliderImg = document.querySelector(".slider__img");       // ๋ณด์—ฌ์ง€๋Š” ์˜์—ญ
const sliderInner = document.querySelector(".slider__inner");   // ์›€์ง์ด๋Š” ์˜์—ญ
const slider = document.querySelectorAll(".slider");            // ๊ฐ๊ฐ์˜ ์ด๋ฏธ์ง€
    
let currentIndex = 0;                                               // ํ˜„์žฌ ๋ณด์ด๋Š” ์ด๋ฏธ์ง€
let sliderCount = slider.length;                                    // ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜
let sliderWidth = sliderImg.offsetWidth;                            // ์ด๋ฏธ์ง€ ๊ฐ€๋กœ๊ฐ’
let sliderClone = sliderInner.firstElementChild.cloneNode(true);    // ์ฒซ๋ฒˆ์งธ ์ด๋ฏธ์ง€ ๋ณต์‚ฌ
sliderInner.appendChild(sliderClone);                               // ์ฒซ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋งˆ์ง€๋ง‰์— ๋„ฃ์–ด์คŒ

02. ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ ์ฃผ๊ธฐ

์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด CSS์—์„œ ์ฃผ๋˜ ๋ฐฉ์‹๊ณผ ํก์‚ฌํ•˜๊ฒŒ transition, transform ๋“ฑ์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

const sliderWrap = document.querySelector(".slider__wrap");
const sliderImg = document.querySelector(".slider__img");       // ๋ณด์—ฌ์ง€๋Š” ์˜์—ญ
const sliderInner = document.querySelector(".slider__inner");   // ์›€์ง์ด๋Š” ์˜์—ญ
const slider = document.querySelectorAll(".slider");            // ๊ฐ๊ฐ์˜ ์ด๋ฏธ์ง€
    
let currentIndex = 0;                                               // ํ˜„์žฌ ๋ณด์ด๋Š” ์ด๋ฏธ์ง€
let sliderCount = slider.length;                                    // ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜
let sliderWidth = sliderImg.offsetWidth;                            // ์ด๋ฏธ์ง€ ๊ฐ€๋กœ๊ฐ’
let sliderClone = sliderInner.firstElementChild.cloneNode(true);    // ์ฒซ๋ฒˆ์งธ ์ด๋ฏธ์ง€ ๋ณต์‚ฌ
sliderInner.appendChild(sliderClone);                               // ์ฒซ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋งˆ์ง€๋ง‰์— ๋„ฃ์–ด์คŒ
    
function sliderEffect() {
    currentIndex++;
    sliderInner.style.transition = "all 0.6s";  // ๋ถ€๋“œ๋Ÿฌ์šด ์›€์ง์ž„
    sliderInner.style.transform = "translateX(-"+ sliderWidth * currentIndex +"px)";    // ์ด๋ฏธ์ง€ width๊ฐ’(800px) * ์ด๋ฏธ์ง€ ๋ฒˆํ˜ธ
    
    // sliderInner.style.transform = "translateX(-800px)";      800*1
    // sliderInner.style.transform = "translateX(-1600px)";     800*2
    // sliderInner.style.transform = "translateX(-2400px)";     800*3
    // sliderInner.style.transform = "translateX(-3200px)";     800*4
    // sliderInner.style.transform = "translateX(-4000px)";     800*5
    // sliderInner.style.transform = "translateX(-4800px)";     800*6

03. ๋งˆ๋ฌด๋ฆฌ ์ž‘์—…

๋งˆ์ง€๋ง‰ ์‚ฌ์ง„์—์„œ ๋‹ค์‹œ ์ฒซ๋ฒˆ์งธ ์‚ฌ์ง„์œผ๋กœ ๋Œ์•„์˜ฌ ๋•Œ ๋ถ€์ž์—ฐ์Šค๋Ÿฌ์šด ๋™์ž‘์„ ์•„๋ž˜ ์˜ˆ์‹œ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ ๋‹ค.

     // ๋งˆ์ง€๋ง‰ ์‚ฌ์ง„์— ์œ„์น˜ํ–ˆ์„ ๋•Œ
    // ํ˜„์žฌ ์ด๋ฏธ์ง€ ๋ฒˆํ˜ธ == ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™์•„์งˆ ๋•Œ (๋งˆ์ง€๋ง‰์„ ์˜๋ฏธํ•จ)
    if(currentIndex == sliderCount) {
        setTimeout(() => {
            sliderInner.style.transition = "0s";
            sliderInner.style.transform = "translateX(0px)";
        }, 700);    // setTimeout์œผ๋กœ ๋งˆ์ง€๋ง‰์—์„œ ์ฒซ๋ฒˆ์งธ๋กœ ๋Œ์•„์˜ฌ ๋•Œ์˜ ์›€์ง์ž„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ•จ
    
        currentIndex = 0;   // ๋งˆ์ง€๋ง‰ ์‚ฌ์ง„ ์™”์„ ๋•Œ ์ดˆ๊ธฐํ™”์‹œํ‚ด
    }
}    
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


Reference Book

JavaScript
HTML
CSS
๊ด‘๊ณ  ์ค€๋น„์ค‘์ž…๋‹ˆ๋‹ค.