์ฌ๋ผ์ด๋ ์ดํํธ 05 : ์ด๋ฏธ์ง ์ฌ๋ผ์ด๋(๋ฒํผ, ๋ท๋ฉ๋ด)
์ด๋ฒ ์๊ฐ์๋ ๊ทธ ๋์ ๋ฐฐ์ ๋ JavaScript๋ฅผ ์ด์ฉํ์ฌ ์ฌ๋ผ์ด๋ ์ดํํธ๋ฅผ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ง๋๋ฒ ์ฌ๋ผ์ด๋04์์ ๋ฃ์๋ ์ฐ์์ ์ผ๋ก ์ข์ฐ๋ก ์์ง์ผ ์ ์๊ฒ ํ๋ ๋ฒํผ์์ ๋ท๋ฉ๋ด(Dot Menu)๋ฅผ ์ถ๊ฐ์์ผ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
HTML ์์ค
slider__wrap > slider__img > slider__inner ์์ ์ด๋ฏธ์ง 5์ฅ์ด ๋ค์ด๊ฐ ๊ตฌ์กฐ์ด๋ฉฐ, ๊ทธ ์๋์ slider__btn divํ๊ทธ ์์ ์ด๋ฏธ์ง๋ฅผ ์ข์ฐ๋ก ์ฌ๋ผ์ด๋ ํ ์ ์๋ ๋ฒํผ์ ๋ง๋ค์ด๋์๋ค. ๋ง์ง๋ง slider__dot์ ๊ฒฝ์ฐ ์์ a ํ๊ทธ๋ค์ JS๋ก ์ถ๋ ฅ์ํค๊ธฐ ์ํด ์ฃผ์ ์ฒ๋ฆฌํ๋ค.
<body class="img08">
<header id="header">
<h1>JAVASCRIPT SLIDER EFFECT 05</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><a href="sliderEffect04.html">04</a></li>
<li class="active"><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 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>
</div>
</section>
</main>
<!-- // main -->
<footer id="footer"></footer>
<!-- // footer -->
</body>
CSS ์์ค
๊ธฐ์กด์ ์ฌ๋ผ์ด๋ ํจ๊ณผ์์ ์ฐ๋ CSS ์ฝ๋์ ๋ท ๋ฒํผ(slider__dot) ์ฝ๋๋ฅผ ์ถ๊ฐํ์๋ค. ๊ณตํต/์ด๊ธฐํ ๋ถ๋ถ 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;
}
.slider__dot {
position: absolute;
left: 50%;
transform: translateX(-50%);
bottom: 20px;
}
.slider__dot .dot {
width: 20px;
height: 20px;
background: rgba(0,0,0,0.4);
display: inline-block;
border-radius: 50%;
text-indent: -9999px;
transition: all 0.3s;
margin: 2px;
}
.slider__dot .dot.active {
background: rgba(255,255,255,0.9);
}
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 sliderDot = document.querySelector(".slider__dot"); // ์ฌ๋ผ์ด๋ ๋ท
let currentIndex = 0; // ํ์ฌ ์ด๋ฏธ์ง
let sliderCount = slider.length; // ์ด๋ฏธ์ง ๊ฐ์
let sliderWidth = sliderImg.offsetWidth; // ์ด๋ฏธ์ง ๊ฐ๋ก๊ฐ
let dotIndex = "";
function init(){
slider.forEach(() => dotIndex += "์ด๋ฏธ์ง1");
sliderDot.innerHTML = dotIndex;
// ์ฒซ ๋ฒ์งธ ๋ท ๋ฒํผํํ
ํ์ฑํ ํ์
sliderDot.firstElementChild.classList.add("active");
}
init();
// ์ด๋ฏธ์ง ์ด๋
function gotoSlider(num){
sliderInner.style.transition = "all 400ms";
sliderInner.style.transform = "translateX("+ -sliderWidth * num +"px)";
currentIndex = num;
// ๋๋ฒ์งธ ์ด๋ฏธ์ง ==> ๋๋ฒ์งธ ๋ท ํด๋์ค ์ถ๊ฐ
// 1. ๋ท ๋ฉ๋ด ํด๋์ค ๋ชจ๋ ์ญ์
// 2. ํด๋น ์ด๋ฏธ์ง ํด๋น ๋ท ๋ฉ๋ด ํด๋์ค ์ถ๊ฐ
let dotActive = document.querySelectorAll(".slider__dot .dot");
dotActive.forEach(el => el.classList.remove("active"));
dotActive[num].classList.add("active");
}
// ๋ฒํผ ํด๋ฆญํ์ ๋
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);
}
});
})
// ๋ท ๋ฒํผ ํด๋ฆญํ์ ๋
document.querySelectorAll(".slider__dot .dot").forEach((dot, index) => {
dot.addEventListener("click", () => {
gotoSlider(index);
});
});
๋๊ธ