- Frederick Philips Brooks
Mythical Man-Month 저자
728x90
반응형
완성된 화면 입니다.
HTML 화면입니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="view-transition" content="same-origin">
<title>06. 슬라이드 이펙트</title>
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/slider.css">
<!-- GSAP -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/gsap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js"></script>
</head>
<body class="img10 bg10 font10">
<header id="header">
<h1>Javascript slider Effect06</h1>
<p>슬라이드 이펙트 - 이미지 슬라이드(버튼,닷메뉴)</p>
<ul>
<li><a href="sliderEffect01.html">1</a></li>
<li><a href="sliderEffect02.html">2</a></li>
<li><a href="sliderEffect03.html">3</a></li>
<li><a href="sliderEffect04.html">4</a></li>
<li><a href="sliderEffect05.html">5</a></li>
<li class="active"><a href="sliderEffect06.html">6</a></li>
</ul>
</header>
<!-- header -->
<main id="main">
<div class="slider_wrap">
<div class="slider_img">
<div class="slider_inner">
<div class="slider s1"><img src="./img/silderEffect01-1-min.jpg" alt="이미지1"></div>
<div class="slider s2"><img src="./img/sliderEffect02-1-min.jpg" alt="이미지2"></div>
<div class="slider s3"><img src="./img/sliderEffect03-1-min.jpg" alt="이미지3"></div>
<div class="slider s4"><img src="./img/sliderEffect04-min.jpg" alt="이미지4"></div>
<div class="slider s5"><img src="./img/sliderEffect05-1-min.jpg" alt="이미지5"></div>
</div>
</div>
</div>
<div class="slider_btn">
<a href="#" class="prev" title="이전이미지"></a>
<a href="#" class="next" title="다음이미지"></a>
</div>
<div class="slider_dot">
<!-- <a href="#" class="active dot">이미지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>
</main>
</body>
css 코드입니다.
/* silder_wrap */
.slider_wrap {
width: 100%;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
.slider_img { /* 이미지가 보이는 영역 */
position: relative;
width: 800px;
height: 520px;
overflow: hidden;
}
.slider_inner { /* 전체 이미지를 감싸고 있는 부모박스 : 움직이는 영역 */
display: flex;
flex-wrap: wrap;
width: 4800px;
height: 520px;
}
.slider { /* 개별적인 이미지 */
position: relative;
width: 800px;
height: 520px;
}
.slider_btn a {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 50px;
height: 50px;
line-height: 50px;
text-align: center;
/* background: rgb(176, 201, 118); */
transition: all 0.3s ease;
}
.slider_btn a:hover {
border-radius: 50%;
/* background-color: rgb(151, 180, 83); */
color: #fff;
scale: 2;
}
.slider_btn a.prev {
left: 0;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'%3E%3Cpath d='M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: center;
}
.slider_btn a.next {
right: 0;
background-image: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'%3E%3Cpath d='M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: center;
}
.slider_dot {
position: absolute;
left: 50%;
bottom: 30px;
transform: translateX(-50%);
}
.slider_dot .dot {
width: 20px;
height: 20px;
background-color: rgba(255, 255, 255,0.3);
display: inline-block;
border-radius: 50%;
text-indent: -9999px;
transition: all 0.3s;
margin:3px;
}
.slider_dot .dot.active {
background-color: #fff
}
JS코드입니다.
// 선택자
const sliderWrap = document.querySelector(".slider_wrap");
const sliderImg = sliderWrap.querySelector(".slider_img");
const sliderInner = sliderWrap.querySelector(".slider_inner")
const slider = sliderWrap.querySelectorAll(".slider");
const sliderDot =document.querySelector(".slider_dot");
const sliderBtn = document.querySelectorAll(".slider_btn a");
let currentIndex = 0; //현재 보이는 이미지
let sliderCount = slider.length; //전체 이미지 갯수
let sliderInterval = 3000; //이미지 변경되는 간격 시간
let sliderWidth = slider[0].offsetWidth; //이미지 가로값
let dotIndex ="";
function init(){
//이미지 갯수만큼 닷 메뉴 생성
slider.forEach(()=>{
dotIndex += "<a href='#' class='dot'>이미지1</a>";
sliderDot.innerHTML = dotIndex;
sliderDot.firstChild.classList.add("active");
});
}
init();
//이미지 이동시키기
function gotoslider(num){
sliderInner.style.transition = "all 400ms";
sliderInner.style.transform = "translateX("+ -sliderWidth * num +"px)";
currentIndex = num
let dotActive = document.querySelectorAll(".slider_dot .dot");
dotActive.forEach((el)=>{
el.classList.remove("active");
});
dotActive[num].classList.add("active");
}
//버튼 클릭 했을때
sliderBtn.forEach((btn, index)=>{
btn.addEventListener("click",()=>{
let prevIndex = (currentIndex+(sliderCount-1)) % sliderCount; //43210
let nextIndex = (currentIndex+1) % sliderCount; //123401234
if(btn.classList.contains("prev")){
gotoslider(prevIndex);
} else {
gotoslider(nextIndex);
}
});
})
function dotclick(num){
let dotActive = document.querySelectorAll(".slider_dot .dot");
dotActive.forEach((el,index)=>{
el.addEventListener("click",()=>{
gotoslider(index);
});
})
}
dotclick();
자바스크립트
- 선언자를 전일아 동일합니다.
- 함수는 init,gotoslider,dotclick으로 작성했습니다.
- 먼저 init 함수는 이미지 갯수만큼 닷 메뉴를 생성한는 함수입니다. slider안에 forEach문을 써서 slider 갯수 만큼 dotindex를 innerHTML 로 표출해주고 있습니다. 첫번째 dot메뉴에다가 active를 붙여 줬습니다.
- 다음 gotoslider 함수입니다. prev 나 next 를 클릭했을떄 그안에 이벤트(이미지이동)를 발생할 함수입니다.
- 먼저 매개변수 num을 설정합니다. 이 매개변수로 값을 할당 받아서 안에 식을 동작하게 할겁니다.
- 먼저 sliderInner에 style을 주었습니다. sliderInner는 이미지의 부모박스입니다. 이걸 토대로 움직이면 슬라이드 효과를 줄수 있습니다.
- style은 trasition 과 transform 입니다. transform 에 trasnlateX 값을 옮겨주면 되니까 넓이가 800 이므로 -800씩 추가적으로 움직이면 화면이 넘어가는 형태로 보여지게 될것입니다. translateX값을 -800에다가 매개변수값을 곱해주면 나오게 처리 했습니다. 그리고 변수에 dot을 담은뒤 next나 prev를 클릭할때 마다 dot에 활성상태가 변하게 처리했습니다.
- 먼저 변수 dotActive를 forEach로 반복을 돌린 후 그안에 active를 다 지웠습니다. 그후 dotActive.clasList.add를 써서 엑티브를 활성화 시켰습니다.
- 다음 함수는 dotClick 입니다. dot을 클릭했을때 화면이 움직이고 dot에 active도 활성화 해야 합니다. 일단 dotActive를 위에서 가져왔습니다. 그후 forEach를 써서 반복을 할겁니다. 그안에 gotoslider(num)값을 넣으면 정상동작이 될겁니다.
- 이제 양옆 버튼을 클릭했을때 입니다.
- sliderBtn에는 a링크 2개가 들어가 있습니다. 바로 next prev 입니다.
- sliderBtn를 forEach로 반복을 돌려서 그안에 prev class가 있으면 아까 만들었던 함수 goslider를 출력합니다.
- 그게 아니면(next) gotoSlider를 출력합니다. 안에 매개변수는 다르게 적용할것입니다.
- 변수 prevIndex 는 4321043210으로 출력이 되게 설정을 했습니다. %는 나머지 값이므로 전에 봤던 코드와 동일합니다.
- 변수 nextIndex 는 1234012340으로 출력이 되게 설정을 했습니다. %는 나머지 값이므로 전에 봤던 코드와 동일합니다.
- 그러면 이제 gotsilder()괄호 안에 원하는 변수를 넣어주면 됩니다.