๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
EFFECT

[EFFECT] ์ด๋ฏธ์ง€ : ์Šฌ๋ผ์ด๋“œ ์œ ํ˜•01

by _ํ† ๋งคํ†  2022. 8. 30.
728x90

์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ : ํŠธ๋ Œ์ง€์…˜ ํšจ๊ณผ ์ฃผ๊ธฐ

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” 2์ดˆ ์ง€๋‚  ๋•Œ๋งˆ๋‹ค ์ด๋ฏธ์ง€๊ฐ€ ๋ฐ”๋€Œ๋Š” ์Šฌ๋ผ์ด๋“œ ํ˜•์‹์˜ ํŽ˜์ด์ง€๋ฅผ ์ž‘์—…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.๐Ÿ˜€


#1. HTML / CSS ์„ค์ •ํ•˜๊ธฐ

! HTML TIP !
๊ฐ ์ด๋ฏธ์ง€๋งˆ๋‹ค css์„ค์ •์„ ์ฃผ๊ธฐ ์œ„ํ•ด ๋”ฐ๋กœ ๋ถ€๋ชจ๋ฅผ 2๋ฒˆ ๊ฐ์‹ธ์„œ ๋ฌถ์–ด์ค๋‹ˆ๋‹ค.

โœ๏ธ HTML ์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ
<section id="sliderType01">
    <div class="slider__wrap">
        <div class="slider__img">
            <div class="slider">
                <img src="../assets/img/city_bg01.jpg" alt="์ด๋ฏธ์ง€1">
            </div>
            <div class="slider">
                <img src="../assets/img/city_bg02.jpg" alt="์ด๋ฏธ์ง€2">
            </div>
            <div class="slider">
                <img src="../assets/img/city_bg03.jpg" alt="์ด๋ฏธ์ง€3">
            </div>
            <div class="slider">
                <img src="../assets/img/city_bg04.jpg" alt="์ด๋ฏธ์ง€4">
            </div>
            <div class="slider">
                <img src="../assets/img/city_bg05.jpg" alt="์ด๋ฏธ์ง€5">
            </div>
        </div>
    </div>
</section>

! CSS TIP !
์ด๋ฏธ์ง€๊ฐ€ ๊ฒน์ณ์žˆ๊ธฐ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰ ์ด๋ฏธ์ง€๋งŒ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— :nth-child()๊ณผ z-index๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.
* z-index() : ๋ ˆ์ด์–ด์ฒ˜๋Ÿผ ๊ฐ ์ˆœ์„œ๋ฅผ ์ •ํ•ด์ค๋‹ˆ๋‹ค.

โœ๏ธ CSS ์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ
/* slider */
.slider__wrap {
    width: 100%;
    height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
}
.slider__img {
    position: relative; /* ์•ฑ์†”๋ฃจํŠธ ๊ธฐ์ค€์  */
    width: 700px;
    height: 400px;
}
.slider {
    position: absolute;
    left: 0;
    top: 0;
}

.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(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: 250px;
    }
}

#2. JAVASCRIPT : ์Šคํฌ๋ฆฝํŠธ ์งœ๊ธฐ

setInterval()์„ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์™„์„ฑํ•ด๋ณด์ž!
์•„๋ž˜์˜ ์ฝ”๋“œ ์† ์ฃผ์„๊ณผ ํ•จ๊ป˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ดํ•ดํ•ด๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค:)

๐Ÿ’ก ์ „์ฒด ์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ
const sliderWrap = document.querySelector(".slider__wrap");
const sliderImg = sliderWrap.querySelector(".slider__img"); //๋ถ€๋ชจ ์š”์†Œ์—์„œ ์ฐพ๋Š” ๊ฒƒ์ด ๋” ์ •ํ™•
const slider = sliderWrap.querySelectorAll(".slider");

let currentIndex = 0;               //ํ˜„์žฌ ๋ณด์ด๋Š” ์ด๋ฏธ์ง€
let sliderCount = slider.length;    //์ด๋ฏธ์ง€ ์ด ๊ฐฏ์ˆ˜

setInterval(() => {

    let nextIndex = (currentIndex + 1) % sliderCount; //๋‹ค์Œ ์ด๋ฏธ์ง€
    //0,1,2,3,4,5,6,7,8,9........... : ๋‚˜๋ˆ—์…ˆ์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ฒ˜์Œ ์ด๋ฏธ์ง€๋กœ ๋Œ์•„๊ฐ€์ง€ ์•Š๋Š”๋‹ค.
    //%์˜ ๊ฒฝ์šฐ : 1,2,3,4,0,1,2,3,4,0....... : sliderCount์˜ ๊ฐ’์ด 5์ด๋ฏ€๋กœ 5๋ฒˆ์งธ ์ด๋ฏธ์ง€์—์„œ ๋‹ค์‹œ ์ฒซ๋ฒˆ์งธ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

    //currentIndex๊ฐ€ 0์ผ ๋•Œ slider[nextIndex]๋Š” +1 ๋ผ์„œ 1 
    //slider[currentIndex]๊ฐ€ 1์ผ ๋• slider[nextIndex]๋Š” +1 ๋ผ์„œ 2 ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ˜๋ณต๋จ. ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ์“ธ ํ•„์š” ์—†๋‹ค!
    slider[currentIndex].style.opacity = "0"; //์ฒซ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์•ˆ๋ณด์ด๊ฒŒ
    slider[nextIndex].style.opacity = "1"; //๋‘๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์ด๊ฒŒ

    currentIndex = nextIndex;
    
    //์œ„์˜ ์‹๋Œ€๋กœ ์ž‘์—…ํ•˜๊ฒŒ ๋˜๋ฉด ์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ์ฒ˜๋Ÿผ ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ์„ค์ • ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
    // slider[0].style.opacity = "0"; //์ฒซ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์•ˆ๋ณด์ด๊ฒŒ
    // slider[1].style.opacity = "1"; //๋‘๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์ด๊ฒŒ

    // slider[1].style.opacity = "0"; //๋‘๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์•ˆ๋ณด์ด๊ฒŒ
    // slider[2].style.opacity = "1"; //์„ธ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์ด๊ฒŒ

    // slider[2].style.opacity = "0"; //์„ธ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์•ˆ๋ณด์ด๊ฒŒ
    // slider[3].style.opacity = "1"; //๋„ค๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์ด๊ฒŒ

    // slider[3].style.opacity = "0"; //๋„ค๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์•ˆ๋ณด์ด๊ฒŒ
    // slider[4].style.opacity = "1"; //๋‹ค์„ฏ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์ด๊ฒŒ

    // slider[4].style.opacity = "0"; //๋‹ค์„ฏ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์•ˆ๋ณด์ด๊ฒŒ
    // slider[0].style.opacity = "1"; //์ฒซ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์ด๊ฒŒ

},2000) //2์ดˆ๋งˆ๋‹ค ๋ฐ”๋€œ

โœ๏ธ ์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ : ์„ ํƒ์ž

๋จผ์ € ์Šคํฌ๋ฆฝํŠธ์— ํ•„์š”ํ•œ ์„ ํƒ์ž๋ฅผ ์„ค์ •ํ•ด์ฃผ์–ด์„œ ์ŠคํŠธ๋ฆฝํŠธ๋ฅผ ์งค ์ค€๋น„๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

const sliderWrap = document.querySelector(".slider__wrap");
const sliderImg = sliderWrap.querySelector(".slider__img"); //๋ถ€๋ชจ ์š”์†Œ์—์„œ ์ฐพ๋Š” ๊ฒƒ์ด ๋” ์ •ํ™•
const slider = sliderWrap.querySelectorAll(".slider");

๊ทธ ๋‹ค์Œ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ๋ณด์ด๊ฒŒ ํ•  ์ด๋ฏธ์ง€์˜ ์ธ๋ฑ์Šค, ์ด๋ฏธ์ง€์˜ ์ด ๊ฐฏ์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
๋ณ€์ˆ˜๋กœ ์ •ํ•ด ๋‘์—ˆ๋˜ ์ด๋ฏธ์ง€์˜ ์ด ๊ฐฏ์ˆ˜๋ฅผ ํ˜„์žฌ์˜ ์ธ๋ฑ์Šค์— ๋‚˜๋ˆ„์–ด์„œ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๋ฉด 0,1,2,3,4,0,1,2,3,4...๋กœ ๊ณ„์† ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋กœ css์Šคํƒ€์ผ ์ค‘ ์˜คํŒŒ์‹œํ‹ฐ๋กœ ํˆฌ๋ช…๋„๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ด๋ฏธ์ง€ ์ธ๋ฑ์Šค๊ฐ€ ๋ฐ”๋€” ๋•Œ ์ง€๋‚œ ์ธ๋ฑ์Šค๋“ค์€ ํˆฌ๋ช…๋„๋ฅผ 0์œผ๋กœ ํ•˜์—ฌ ์•ˆ๋ณด์ด๊ฒŒ ํ•˜๊ณ  ๋‹ค์Œ ์ด๋ฏธ์ง€ ์ธ๋ฑ์Šค๊ฐ€ 1๋กœ ๋˜๊ฒŒ ํ•˜์—ฌ ๋ณด์ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ ์ด๋ฏธ์ง€ ์ธ๋ฑ์Šค์—๊ฒŒ ๋‹ค์Œ ์ธ๋ฑ์Šค๊ฐ€ ๋Œ€์ž…ํ•˜๋Š” ์‹์„ ์ž‘์„ฑํ•˜์—ฌ 0๋ถ€ํ„ฐ 4๊นŒ์ง€ ๋ฐ˜๋ณต๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
2000์€ 2์ดˆ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ 2์ดˆ๋งˆ๋‹ค ์ด๋ฏธ์ง€์˜ ์ธ๋ฑ์Šค๊ฐ€ 1์”ฉ ์˜ฌ๋ผ ๋‹ค์Œ ์ด๋ฏธ์ง€๊ฐ€ ๋ณด์ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

let currentIndex = 0; //ํ˜„์žฌ ๋ณด์ด๋Š” ์ด๋ฏธ์ง€
let sliderCount = slider.length; //์ด ์ด๋ฏธ์ง€ ๊ฐฏ์ˆ˜

setInterval(() => {

    let nextIndex = (currentIndex + 1) % sliderCount; //๋‹ค์Œ ์ด๋ฏธ์ง€
 
    slider[currentIndex].style.opacity = "0"; //์ฒซ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์•ˆ๋ณด์ด๊ฒŒ
    slider[nextIndex].style.opacity = "1"; //๋‘๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์ด๊ฒŒ

    currentIndex = nextIndex;
},2000);

#4. ๊ฒฐ๊ณผ ๋ณด๊ธฐ

728x90

๋Œ“๊ธ€


Lucky Charms Rainbow
js
html
css