์๋ฐ์คํฌ๋ฆฝํธ ์ฌ๋ผ์ด๋ ํจ๊ณผ : ๋ฒํผ, ๋ท๋ฉ๋ด
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ค์ํ ํจ๊ณผ๋ค ์ค, 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์ ํด๋ฆญํ์ ๋์๋ ์ด๋ฏธ์ง๊ฐ ์ด๋ํ๋๋ก ๋ง๋ค์ด ์ค๋๋ค. ์์ฑ!
๊ฒฐ๊ณผ
'Javascript Effect' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ์คํฌ๋ฆฝํธ : ๊ฒ์ ํจ๊ณผ : ๋ฉ๋ชจ๋ฆฌ ๊ฒ์ (3) | 2022.10.29 |
---|---|
์๋ฐ์คํฌ๋ฆฝํธ : ๊ฒ์ ํจ๊ณผ : ๊ฒ์ ๊ฒ์ (1) | 2022.10.24 |
์๋ฐ์คํฌ๋ฆฝํธ : ๊ฒ์ ํจ๊ณผ : ๋ฎค์ง ํ๋ ์ด์ด (1) | 2022.10.18 |
์๋ฐ์คํฌ๋ฆฝํธ : ๊ฒ์ ํจ๊ณผ : sort(), reverse() (0) | 2022.10.18 |
์๋ฐ์คํฌ๋ฆฝํธ ํจ๋ด๋์ค ํจ๊ณผ : ๋ฆฌ๋น ํจ๊ณผ (4) | 2022.10.09 |
๋๊ธ