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

[Slide Effect] ์Šฌ๋ผ์ด๋“œ ์ดํŽ™ํŠธ 04 - ์ขŒ์šฐ ์ด๋™ ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ

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

์Šฌ๋ผ์ด๋“œ ์ดํŽ™ํŠธ 04 : ์ขŒ์šฐ ์ด๋™

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ๊ทธ ๋™์•ˆ ๋ฐฐ์› ๋˜ JavaScript๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šฌ๋ผ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด๋“œ๋ฅผ ์—ฐ์†์ ์œผ๋กœ ์ขŒ์šฐ๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


HTML ์†Œ์Šค

slider__wrap > slider__img > slider__inner ์•ˆ์— ์ด๋ฏธ์ง€ 5์žฅ์ด ๋“ค์–ด๊ฐ„ ๊ตฌ์กฐ์ด๋ฉฐ, ๊ทธ ์•„๋ž˜์˜ slider__btn divํƒœ๊ทธ ์•ˆ์— ์ด๋ฏธ์ง€๋ฅผ ์ขŒ์šฐ๋กœ ์Šฌ๋ผ์ด๋“œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด๋‘์—ˆ๋‹ค.

<body class="img08">
    <header id="header">
        <h1>JAVASCRIPT SLIDER EFFECT 04</h1>
        <p>์Šฌ๋ผ์ด๋“œ ์ดํŽ™ํŠธ โ‘ฃ - ์ขŒ๋กœ ์›€์ง์ด๊ธฐ(์—ฐ์†์ ์œผ๋กœ)</p>
        <ul>
            <li><a href="sliderEffect01.html">01</a></li>
            <li><a href="sliderEffect02.html">02</a></li>
            <li><a href="sliderEffect03.html">03</a></li>
            <li class="active"><a href="sliderEffect04.html">04</a></li>
            <li><a href="sliderEffect05.html">05</a></li>
            <li><a href="sliderEffect06.html">06</a></li>
            <li><a href="sliderEffect07.html">07</a></li>
        </ul>
    </header>
    <!-- // header -->

    <main id="main">
        <section id="sliderType01">
            <div class="slider__wrap">
                <div class="slider__img">
                    <div class="slider__inner">
                        <div class="slider"><img src="../assets/img/effect_bg10.jpg" alt="์ด๋ฏธ์ง€1"></div>
                        <div class="slider"><img src="../assets/img/effect_bg01.jpg" alt="์ด๋ฏธ์ง€2"></div>
                        <div class="slider"><img src="../assets/img/effect_bg03.jpg" alt="์ด๋ฏธ์ง€3"></div>
                        <div class="slider"><img src="../assets/img/effect_bg02.jpg" alt="์ด๋ฏธ์ง€4"></div>
                        <div class="slider"><img src="../assets/img/effect_bg04.jpg" alt="์ด๋ฏธ์ง€5"></div>
                    </div>
                </div>
                <div class="slider__btn">
                    <a href="#" class="prev">prev</a>
                    <a href="#" class="next">next</a>
                </div>
            </div>
        </section>
    </main>
    <!-- // main -->

    <footer id="footer"></footer>
    <!-- // footer -->
</body>

CSS ์†Œ์Šค

๊ธฐ์กด์˜ ์Šฌ๋ผ์ด๋“œ ํšจ๊ณผ์—์„œ ์“ฐ๋˜ CSS ์ฝ”๋“œ์— ๋ฒ„ํŠผ์šฉ(slider__btn) ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. ๊ณตํ†ต/์ดˆ๊ธฐํ™” ๋ถ€๋ถ„ CSS๋Š” ํ•˜๋‹จ์˜ CSS ์†Œ์Šค ๋ณด๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํ™•์ธํ•  ๊ฒƒ.

/* slider */
.slider__wrap {
    width: 100%;
    height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
}
.slider__img {  /*์ด๋ฏธ์ง€๊ฐ€ ๋ณด์ด๋Š” ์˜์—ญ*/
    position: relative;
    width: 800px;
    height: 450px;
    overflow: hidden;
}
.slider__inner {    /*์ด๋ฏธ์ง€๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ๋ถ€๋ชจ : ์›€์ง์ด๋Š” ๋ถ€๋ถ„*/
    display: flex;
    flex-wrap: wrap;
    width: 4800px;  /* ์ด ์ด๋ฏธ์ง€ 6๊ฐœ */
    height: 450px;
}
.slider {       /*๊ฐœ๋ณ„์ ์ธ ์ด๋ฏธ์ง€*/
    position: relative;
    width: 800px;
    height: 450px;
}
.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';}

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

/* ์Šฌ๋ผ์ด๋“œ ๋ฒ„ํŠผ */
.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 ease;
    display: block;
    color: #fff;
}
.slider__btn a:hover {
    background: rgba(241,96,86,1);
    border-radius: 50px;
}
.slider__btn a.prev {
    left: 0;
}
.slider__btn a.next {
    right: 0;
}

JS ์†Œ์Šค

๋จผ์ € ์ƒ์ˆ˜์™€ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑ ํ›„ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ €์žฅํ•ด์ค€๋‹ค. ๊ทธ ๋‹ค์Œ ์ด๋ฏธ์ง€๋ฅผ ์›€์ง์ด๋Š” ์˜์—ญ์„ ๋งŒ๋“ค๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์™ผ์ชฝ ๋ฒ„ํŠผ๊ณผ ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ์˜ ๋™์ž‘์„ ์Šคํฌ๋ฆฝํŠธ๋กœ ๋งŒ๋“ ๋‹ค. ์ž์„ธํ•œ ์„ค๋ช…์€ ์ฃผ์„์„ ์ฐธ์กฐํ•  ๊ฒƒ.

// ์ƒ์ˆ˜ยท๋ณ€์ˆ˜ ์ƒ์„ฑ
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 = document.querySelector(".prev");       // ์™ผ์ชฝ ๋ฒ„ํŠผ
const sliderBtnNext = document.querySelector(".next");       // ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ

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

// ์ด๋ฏธ์ง€ ์›€์ง์ด๋Š” ์˜์—ญ
function gotoSlider(num) {
    sliderInner.style.transition = "all 400ms";
    sliderInner.style.transform = "translateX("+ -sliderWidth * num +"px)";
    currentIndex = num;
}
    
// ์™ผ์ชฝ ๋ฒ„ํŠผ ํด๋ฆญํ–ˆ์„ ๋•Œ (์ด์ „ ์ด๋ฏธ์ง€๋กœ)
sliderBtnPrev.addEventListener("click", () => {
    // ํ˜„์žฌ ์ด๋ฏธ์ง€(0+5-1)รท5
    let prevIndex = (currentIndex + (sliderCount - 1)) % sliderCount;
    
    gotoSlider(prevIndex);
    // 0 4 3 2 1
});
// ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ ํด๋ฆญํ–ˆ์„ ๋•Œ (๋‹ค์Œ ์ด๋ฏธ์ง€๋กœ)
sliderBtnNext.addEventListener("click", () => {
    let nextIndex = (currentIndex + 1) % sliderCount;

    gotoSlider(nextIndex);
    //0 1 2 3 4 
});
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


Reference Book

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