์ฌ๋ผ์ด๋ ์ดํํธ 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
});
๋๊ธ