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

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

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

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

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


1. CSS ์†Œ์Šค

.slider__wrap {
    width: 100%;
    height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
}
.slider__img { /* ์ด๋ฏธ์ง€ ๋ณด์ด๋Š” ์˜์—ญ */
    position: relative;
    width: 800px;
    height: 520px;
    overflow: hidden;
}
.slider__inner { /* ์ด๋ฏธ์ง€๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ๋ถ€๋ชจ(์›€์ง์ด๋Š” ๋ถ€๋ถ„) */
    display: flex;
    flex-wrap: wrap;
    width: 4800px;
    height: 520px;
}
.slider { /* ๊ฐœ๋ณ„์ ์ธ ์ด๋ฏธ์ง€ */
    position: relative;
    width: 800px;
    height: 520px;
}
.slider::before{
    position: absolute;
    left: 5px;
    top: 5px;
    background: rgba(0,0,0,0.4);
    color: #fff;
    padding: 5px 10px;
}
.slider:nth-child(1)::before {content: '์ด๋ฏธ์ง€1';}
.slider:nth-child(2)::before {content: '์ด๋ฏธ์ง€2';}
.slider:nth-child(3)::before {content: '์ด๋ฏธ์ง€3';}
.slider:nth-child(4)::before {content: '์ด๋ฏธ์ง€4';}
.slider:nth-child(5)::before {content: '์ด๋ฏธ์ง€5';}
.slider:nth-child(6)::before {content: '์ด๋ฏธ์ง€1';}
.slider:nth-child(1) {z-index: 5;}
.slider:nth-child(2) {z-index: 4;}
.slider:nth-child(3) {z-index: 3;}
.slider:nth-child(4) {z-index: 2;}
.slider:nth-child(5) {z-index: 1;}

@media (max-width: 800px){
    .slider__img {
        width: 400px;
        height: 260px;
    }
}

.slider__btn a {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 50px;
    height: 50px;
    background: rgba(0, 0, 0, 0.4);
    text-align: center;
    line-height: 50px;
    transition: all 0.2s;
    display: block;
    color: #fff;
}
.slider__btn a:hover {
    background: rgb(118, 153, 90);
}
.slider__btn a.prev {
    left: 0;
}
.slider__btn a.next {
    right: 0;
}

๊ตฌ์กฐ๋Š” ์ „์ฒด์— ํ•ด๋‹นํ•˜๋Š” slider__wrap, ์ด๋ฏธ์ง€๊ฐ€ ๋ณด์ด๋Š” ์˜์—ญ์ธ slider__img, ์ „์ฒด ์ด๋ฏธ์ง€๋ฅผ ๊ฐ์‹ธ๋Š” slider__inner, ๊ฐœ๋ณ„์  ์ด๋ฏธ์ง€์ธ slider์˜ ์ˆœ์„œ๋กœ ์žก์•„์ค๋‹ˆ๋‹ค.
์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ๋„ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

2. JAVASCRIPT ์†Œ์Šค

2-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 sliderBtn = document.querySelector(".slider__btn"); // ๋ฒ„ํŠผ
const sliderBtnPrev = sliderBtn.querySelector(".prev"); // ์™ผ์ชฝ
const sliderBtnNext = sliderBtn.querySelector(".next"); // ์˜ค๋ฅธ์ชฝ

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

๊ฐ๊ฐ์— ํ•ด๋‹นํ•˜๋Š” ์„ ํƒ์ž๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด๋ฏธ์ง€, ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜, ์ด๋ฏธ์ง€์˜ ๊ฐ€๋กœ๊ฐ’์€ ๋ณ€ํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— let์œผ๋กœ ์„ ์–ธํ•ด ์ค๋‹ˆ๋‹ค.

2-2) ์ด๋ฏธ์ง€์— transition ํšจ๊ณผ ์ฃผ๊ธฐ

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

์ด๋ฒˆ์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜(num)ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. gotoSlider ํ•จ์ˆ˜๋Š” ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ sliderInner(์›€์ง์ด๋Š” ์˜์—ญ)๊ฐ€ sliderWidth * num๋งŒํผ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. -๋ฅผ ๋ถ™์—ฌ์ค€ ์ด์œ ๋Š” ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2-3) ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ์„ค์ •ํ•˜๊ธฐ

// ์™ผ์ชฝ ๋ฒ„ํŠผ ํด๋ฆญ
sliderBtnPrev.addEventListener("click", () => {
    let prevIndex = (currentIndex + sliderCount -1) % sliderCount;
    gotoSlider(prevIndex);
    // 4 3 2 1 0
});

// ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ ํด๋ฆญ
sliderBtnNext.addEventListener("click", () => {
    let nextIndex = (currentIndex + 1) % sliderCount;
    gotoSlider(nextIndex);
    // 0 1 2 3 4
});

๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ์˜ ์ด๋ฒคํŠธ ํšจ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ์ด๋ฏธ์ง€์—์„œ ์ด์ „ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋‹ค์‹œ ๋งˆ์ง€๋ง‰ ์ด๋ฏธ์ง€๋กœ ์ด๋™ํ•˜๊ณ , ๋งˆ์ง€๋ง‰ ์ด๋ฏธ์ง€์—์„œ ๋‹ค์Œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋‹ค์‹œ ์ฒซ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋กœ ์ด๋™ํ•˜๋„๋ก ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.


๊ฒฐ๊ณผ

728x90

๋Œ“๊ธ€

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

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