๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Javascript Effect

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ : ์Šฌ๋ผ์ด๋“œ ํšจ๊ณผ : ๋ฒ„ํŠผ, ๋‹ท๋ฉ”๋‰ด

by ์ฝ”ํŒŒ์นด 2022. 10. 18.
728x90

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šฌ๋ผ์ด๋“œ ํšจ๊ณผ : ๋ฒ„ํŠผ, ๋‹ท๋ฉ”๋‰ด

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋‹ค์–‘ํ•œ ํšจ๊ณผ๋“ค ์ค‘, CSS์˜ ํŠธ๋žœ์ง€์…˜ ์†์„ฑ์„ ํ™œ์šฉํ•œ ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ ํšจ๊ณผ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ์œ ํ˜•์€ ์ด์ „ ๋ฒ„ํŠผ, ๋‹ค์Œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ด์ „ ์ด๋ฏธ์ง€, ๋‹ค์Œ ์ด๋ฏธ์ง€๋กœ ์Šฌ๋ผ์ด๋“œํ•˜๋Š” ์œ ํ˜•์ž…๋‹ˆ๋‹ค.


1. ์„ ํƒ์ž ๋ฐ ๋ณ€์ˆ˜ ๋งŒ๋“ค๊ธฐ

const sliderWrap = document.querySelector(".slider__wrap");
const sliderImg = document.querySelector(".slider__img");  // ๋ณด์—ฌ์ง€๋Š” ์˜์—ญ
const sliderInner = document.querySelector(".slider__inner");  // ์›€์ง์ด๋Š” ์˜์—ญ
const slider = document.querySelectorAll(".slider");  // ๊ฐœ๋ณ„์  ์ด๋ฏธ์ง€
const sliderDot = document.querySelector(".slider__dot");  // dot

let currentIndex = 0;  // ํ˜„์žฌ ์ด๋ฏธ์ง€
let sliderCount = slider.length;  // ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜
let sliderWidth = sliderImg.offsetWidth;  // ์ด๋ฏธ์ง€ ๊ฐ€๋กœ๊ฐ’
let dotIndex = "";

๋จผ์ €, ์„ ํƒ์ž์™€ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

2. dot ๋งŒ๋“ค๊ธฐ

<div class="slider__btn">
    <a href="#" class="prev">prev</a>
    <a href="#" class="next">next</a>
</div>
<div class="slider__dot">
    <!-- <a href="#" class="dot active">์ด๋ฏธ์ง€1</a>
    <a href="#" class="dot">์ด๋ฏธ์ง€2</a>
    <a href="#" class="dot">์ด๋ฏธ์ง€3</a>
    <a href="#" class="dot">์ด๋ฏธ์ง€4</a>
    <a href="#" class="dot">์ด๋ฏธ์ง€5</a> -->
</div>

์ด๋ฒˆ ์ž‘์—…์˜ HTML ์†Œ์Šค ์ค‘ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด๋“œ์˜ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•  dot์„ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์—…ํ•ด์ค„ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

function init(){
    slider.forEach(() => {dotIndex += "<a href='#' class='dot'>์ด๋ฏธ์ง€1</a>"})
    sliderDot.innerHTML = dotIndex;
    sliderDot.firstChild.classList.add("active");
}
init();

init() ํ•จ์ˆ˜ ์•ˆ์—์„œ dot์„ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค. dotIndex๋ผ๋Š” ๋นˆ ๋ฌธ์ž์—ด ์•ˆ์— dot์„ ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜๋งŒํผ ์ถ”๊ฐ€ํ•ด ์ฃผ๊ณ , sliderDot(.slider__dot)์— ์ถœ๋ ฅํ•ด ์ค๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ dot์—๋Š” active ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

3. ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ ๊ตฌํ˜„ํ•˜๊ธฐ

function gotoSlider(num){
    sliderInner.style.transition = "all 400ms";
    sliderInner.style.transform = "translateX("+ -sliderWidth * num +"px)";
    currentIndex = num;

    const dotActive = document.querySelectorAll(".slider__dot .dot");
    dotActive.forEach(el => el.classList.remove("active"));
    dotActive[num].classList.add("active");
}

์ด์ œ, ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ๋ฅผ ๊ตฌํ˜„ํ•  gotoSlider() ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ ์›€์ง์ผ ๋•Œ ์ด๋ฏธ์ง€์˜ ๊ฐ€๋กœ๊ฐ’๋งŒํผ ์›€์ง์ผ ์ˆ˜ ์žˆ๋„๋ก transform ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด ์ค๋‹ˆ๋‹ค.
๋˜, ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ๊ฐ€ ์›€์ง์ผ ๋•Œ๋งˆ๋‹ค ํ•ด๋‹นํ•˜๋Š” ๋ฒˆํ˜ธ์˜ dot์ด ํ™œ์„ฑํ™”๋˜๊ฒŒ๋” ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ €, ๊ฐ๊ฐ์˜ dot์˜ ํด๋ž˜์Šค๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•œ ๋’ค, ํ•ด๋‹น ์ด๋ฏธ์ง€์˜ dot์—๋งŒ active ํด๋ž˜์Šค๊ฐ€ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋„๋ก forEach๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

4. ํด๋ฆญ ์ด๋ฒคํŠธ

document.querySelectorAll(".slider__btn a").forEach((btn, index) => {
    btn.addEventListener("click", () => {
        let prevIndex = (currentIndex + (sliderCount - 1)) % sliderCount;
        let nextIndex = (currentIndex + 1) % sliderCount;

        if(btn.classList.contains("prev")){
            gotoSlider(prevIndex);
        } else {
            gotoSlider(nextIndex);
        }
    })
})

๊ฐ๊ฐ์˜ ์ด๋ฏธ์ง€๋“ค์€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์›€์ง์ด๊ธฐ ๋•Œ๋ฌธ์—, addEventListener๋กœ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ(prevIndex), ๋‹ค์Œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ(nextIndex) ๊ฐ๊ฐ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

document.querySelectorAll(".slider__dot .dot").forEach((dot, index) => {
    dot.addEventListener("click", () => {
        gotoSlider(index);
    })
})

๊ฐ๊ฐ์˜ dot์„ ํด๋ฆญํ–ˆ์„ ๋•Œ์—๋„ ์ด๋ฏธ์ง€๊ฐ€ ์ด๋™ํ•˜๋„๋ก ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ์™„์„ฑ!


๊ฒฐ๊ณผ

728x90

๋Œ“๊ธ€

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿฆ™

CSS
๊ด‘๊ณ  ์ค€๋น„์ค‘