์ด๋ฏธ์ง ์ฌ๋ผ์ด๋ : ๋ฒํผ์ ํตํด ์ฌ๋ผ์ด๋ ์์ง์ด๊ธฐ (์ผ์ชฝ ์ค๋ฅธ์ชฝ ๋ชจ๋ ๋์)
์ด๋ฒ ์๊ฐ์๋ ์๋์ผ๋ก ๋์ด๊ฐ์ง ์๊ณ ๋ฒํผ์ ํด๋ฆญํ์ ๋ ํด๋น ์์๋ก ์ด๋ฏธ์ง๊ฐ ๋์ด๊ฐ๋๋ก ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค! ๐ฅน
#1. HTML / CSS ์ค์ ํ๊ธฐ
! HTML TIP !
๊ฐ ์ด๋ฏธ์ง๋ง๋ค css์ค์ ์ ์ฃผ๊ธฐ ์ํด ๋ฐ๋ก ๋ถ๋ชจ๋ฅผ 2๋ฒ ๊ฐ์ธ์ ๋ฌถ์ด์ค๋๋ค.
๊ตฌ์กฐ๋ ์ง๋ ์๊ฐ๊ณผ ๋๊ฐ์ผ๋ slider__img ๋ฐ์ ํ์ ์์ผ๋ก ๋ฒํผ ์์ญ์ ์ ์ธํด์ฃผ์์ต๋๋ค!
โ๏ธ HTML ์คํฌ๋ฆฝํธ ๋ณด๊ธฐ
<section id="sliderType04">
<div class="slider__wrap">
<div class="slider__img">
<div class="slider__inner">
<div class="slider" role="group" aria-label="1/5">
<img src="../assets/img/Mountian_bg01.jpg" alt="์ด๋ฏธ์ง6">
</div>
<div class="slider" role="group" aria-label="2/5">
<img src="../assets/img/Mountian_bg02.jpg" alt="์ด๋ฏธ์ง7">
</div>
<div class="slider" role="group" aria-label="3/5">
<img src="../assets/img/Mountian_bg03.jpg" alt="์ด๋ฏธ์ง8">
</div>
<div class="slider" role="group" aria-label="4/5">
<img src="../assets/img/Mountian_bg04.jpg" alt="์ด๋ฏธ์ง9">
</div>
<div class="slider" role="group" aria-label="5/5">
<img src="../assets/img/Mountian_bg05.jpg" alt="์ด๋ฏธ์ง10">
</div>
</div>
</div>
<div class="slider__btn">
<a href="#" class="prev" role="button" aria-label="์ผ์ชฝ ์ด๋ฏธ์ง">prev</a>
<a href="#" class="next" role="button" aria-label="์ค๋ฅธ์ชฝ ์ด๋ฏธ์ง">next</a>
</div>
</div>
</section>
! CSS TIP !
1. ์ด๋ฏธ์ง๋ฅผ ๊ฐ๋ก๋ก ์ฐ๊ฒฐํ๊ธฐ ์ํด ํฌ์ง์
์ relative๋ก ์ค์ ํ๊ณ ์์ญ์์ ๋ฒ์ด๋๋ ์ด๋ฏธ์ง๋ฅผ ์๋ณด์ด๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด overflow: hidden์ ์ค์ ํด์ค๋๋ค.
2. ์ด๋ฏธ์ง๊ฐ ์ฐ์์ ์ผ๋ก ์์ง์ผ ์ ์๋๋ก ์ฒซ๋ฒ์งธ ์ด๋ฏธ์ง๋ฅผ 6๋ฒ์งธ์ ์ถ๊ฐ๋ก ๋ฃ์ต๋๋ค. (์ ๋๋ฉ์ด์
์ค์ ์ ์คํฌ๋ฆฝํธ ํํธ์์!!)
3. ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ฏธ์ง๊ฐ 6์ฅ์ด๊ธฐ ๋๋ฌธ์ inner์ ๊ฐ๋ก ํฌ๊ธฐ๋ฅผ +ํ์ฌ 4800px๋ก ์ค์ ํฉ๋๋ค.
4. ์ง๋ ์๊ฐ๊ณผ ๋๊ฐ์ง๋ง ๋ฒํผ ์์ญ์ ์คํ์ผ๋ง ์์ ๋กญ๊ฒ ์ค์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
โ๏ธ 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; /* ์ด ์ฌ์ฏ๊ฐ์ ์ด๋ฏธ์ง */
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: '์ด๋ฏธ์ง6';}
.slider:nth-child(2)::before {content: '์ด๋ฏธ์ง7';}
.slider:nth-child(3)::before {content: '์ด๋ฏธ์ง8';}
.slider:nth-child(4)::before {content: '์ด๋ฏธ์ง9';}
.slider:nth-child(5)::before {content: '์ด๋ฏธ์ง10';}
.slider:nth-child(6)::before {content: '์ด๋ฏธ์ง6';}
@media(max-width : 800px){
.slider__img {
width: 400px;
height: 250px;
}
.slider {
width: 400px;
height: 250px;
}
}
.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 {
border-radius: 50px;
background: rgba(38, 52, 103, 0.4);
}
.slider__btn a.prev {
left: 0;
}
.slider__btn a.next {
right: 0;
}
#2. JAVASCRIPT : ์คํฌ๋ฆฝํธ ์ง๊ธฐ
์ด๋ฒ ์ฌ๋ผ์ด๋ ์ ํ์์ ํฌ์ธํธ๋ ๋งค๊ฐ๋ณ์ ์ ๋๋ค. ๋งค๊ฐ๋ณ์๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ํจ๊ป ์์๋ณด๊ฒ ์ต๋๋ค!
๐ก ์ ์ฒด ์คํฌ๋ฆฝํธ ๋ณด๊ธฐ
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; //ํ์ฌ ๋ณด์ด๋ ์ด๋ฏธ์ง : ๋งํฌ์
์์๋๋ก 0๋ฒ๋ถํฐ 4๋ฒ
let sliderCount = slider.length; //์ด๋ฏธ์ง ๊ฐฏ์
let sliderWidth = sliderImg.offsetWidth; //์ด๋ฏธ์ง ๊ฐ๋ก๊ฐ
//์ด๋ฏธ์ง ์์ง์ด๋ ์์ญ
//gotoSlider ํจ์์ num๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ๊ณ sliderInner ์ ํ์์ ์๋๋ฉ์ด์
์์ฑ์ ๋ถ์ฌํ๋ค.
//translateX X์ถ์ผ๋ก -sliderWidth * num ๋งํผ ์์ญ์ ์ด๋ํ๋๋ก ํ๋ค. : ์ฌ๊ธฐ์ -๋ฅผ ๋ถ์ ์ด์ ๋ ์ผ์ชฝ์ผ๋ก ์์ง์ด๊ฒ ํ๊ธฐ ์ํจ!
//์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐ๋ ๊ฐ? : ์ด๋ฏธ์ง์ ์์๋ฅผ ๋ฐ๊พธ๊ธฐ ์ํจ. (์๋์ ์ด๋ฒคํธ ๋ฆฌ์ค๋์์ ์ธ๋ฑ์ค ๊ฐ์ ์ถ์ถ)
function gotoSlider(num){
sliderInner.style.transition = "all 400ms";
sliderInner.style.transform = "translateX("+ -sliderWidth * num +"px)";
currentIndex = num; // ๋ณด์ด๋ ์ด๋ฏธ์ง๊ฐ ๋ฐ๋๋๋ก ์ค์
}
//์์ชฝ ๋ฒํผ ํด๋ฆญ
//43210
//sliderCount(์ด๋ฏธ์ง ๊ฐฏ์ : 6๊ฐ) + currentIndex(ํ์ฌ ์ด๋ฏธ์ง์ ์์ : 4) -1 == 9
// 9 % 5 == ๋๋จธ์ง ๊ฐ์ 4์ด๋ฏ๋ก 4๋ถํฐ ์์๋๋ก ๋์๊ฐ๋ค.
sliderBtnPrev.addEventListener("click", () => {
let prevIndex = (sliderCount + currentIndex -1) % sliderCount; //0๋ฒ์ด ๋์์ ๋ 5%5 ==0์ด ๋๋ฏ๋ก ๊ณ์ ํด์ ๋ฐ๋ณตํ๋ ๊ฒ.
gotoSlider(prevIndex);
});
//์ค๋ฅธ์ชฝ ๋ฒํผ ํด๋ฆญ
//01234
sliderBtnNext.addEventListener("click", () => {
let nextIndex = (currentIndex +1) % sliderCount; //5 % 5์ ๋๋จธ์ง ๊ฐ์ด 0์ด๊ธฐ ๋๋ฌธ์ ๋ค์ 0๋ฒ์งธ ์์๋ก ๋์ด๊ฐ๋ ๊ฒ.
gotoSlider(nextIndex);
});
โ๏ธ ์คํฌ๋ฆฝํธ ๋ณด๊ธฐ : ์๋ฐ์คํฌ๋ฆฝํธ
! JAVASCRIPT TIP !
1. ์คํฌ๋ฆฝํธ์ ํ์ํ ์ ํ์๋ฅผ ์ค์ ํด์ฃผ๊ณ ํ์ฌ ๋ณด์ด๋ ์ด๋ฏธ์ง์๊ฒ 0์ ๋ถ์ฌํ์ฌ ์ฒซ ์์๊ฐ ๋๊ฒ ํฉ๋๋ค.
2. ๋ค์ ์ด๋ฏธ์ง๊ฐ ๋ณด์ด๋๋ก ํ๊ธฐ ์ํด ์ด๋ฏธ์ง ์ด ๊ฐฏ์ / ์ด๋ฏธ์ง์ ๊ฐ๋ก๊ฐ์ ๋ณ์์ ์ ์ฅํ์ฌ ์ด๋ฏธ์ง ๊ฐ๋ก * ๋ณด์ฌ์ผํ ์ด๋ฏธ์ง๊ฐ ๋๋๋ก ํฉ๋๋ค.
3. ๊ฐ ๋ฒํผ์๊ฒ ์ด๋ฒคํธ๋ฆฌ์ค๋๋ฅผ ํตํด ์์๋๋ก ๋๋ ๋ฐ๋ ์์๋ก ์ด๋๋๋๋ก ์์ ์์ฑํด์ค๋๋ค.
#3. ๊ฒฐ๊ณผ ๋ณด๊ธฐ ๐
'EFFECT' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[EFFECT] ๋ง์ฐ์ค ํจ๊ณผ 03 : ์กฐ๋ช ํจ๊ณผ (2) | 2022.09.23 |
---|---|
[EFFECT] ํ๋ด๋ ์ค ํจ๊ณผ05 : ์ด์ง๊ฐ ํจ๊ณผ (4) | 2022.09.21 |
[EFFECT] ๋ง์ฐ์ค ํจ๊ณผ 02 : ์ปค์ ๋ฐ๋ผ๋ค๋๊ธฐ (2) | 2022.09.19 |
[EFFECT] ํ๋ด๋ ์ค ํจ๊ณผ 04 : ๋ํ๋ด๊ธฐ ํจ๊ณผ (2) | 2022.09.19 |
[EFFECT] ํ๋ด๋ ์ค ํจ๊ณผ 03 : top๋ฒํผ ๊ตฌํ๊ณผ ๋ฉ๋ด ์จ๊น ํจ๊ณผ (4) | 2022.09.14 |
๋๊ธ