버튼을 클릭하면 명언이 나와요
-이름이 나와요
최종 완성본
이번 슬라이드도 API 없이 코드로 작성합니다.
이번거는 위로 이동하는 슬라이드 입니다.
(1번과 2번을 활용해서 만들어보기 미션이었네요)
HTML+CSS코드
<style>
/* slider__wrap */
.slider__wrap {
width: 100%;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
/* 이미지가 보이는 영역 */
.slider__img {
position: relative;
width: 800px;
height: 520px;
overflow: hidden;
}
/* 전체 이미지를 감싸고 있는 부모 : 움직이는 영역 */
.slider__inner {
/* display: flex;
flex-wrap: wrap; */
width: 4000px;
height: 520px;
}
/* 개별적인 이미지 */
.slider {
position: relative;
width: 800px;
height: 520px;
}
#header li a {
line- height: 27px;
}
</style>
</head>
<body class="img02 bg02 font05">
<header id="header">
< h1>Javascript Slider Effect02</h1>
< p>슬라이드 이팩트 : 위로 움직이기</p>
<ul>
<li><a href="sliderEffect01.html">1</a></li>
<li><a href="sliderEffect02.html">2</a></li>
<li class="active"><a href="sliderEffect03.html">3</a></li>
<li><a href="sliderEffect04html">4</a></li>
<li><a href="sliderEffect05.html">5</a></li>
</ul>
</header>
<!-- //header -->
<main id="main">
<div class="slider__wrap">
<div class="slider__img">
<div class="slider__inner">
<div class="slider"><img src="./img/slider_bg07b.jpg" alt="이미지1"></div>
<div class="slider"><img src="./img/slider_bg08b.jpg" alt="이미지2"></div>
<div class="slider"><img src="./img/slider_bg03b.jpg" alt="이미지3"></div>
<div class="slider"><img src="./img/slider_bg04b.jpg" alt="이미지4"></div>
<div class="slider"><img src="./img/slider_bg06b.jpg" alt="이미지5"></div>
</div>
</div>
</div>
</main>
<!-- //main -->
<footer id="footer">
<a href="mailto:skadldldl123@gmail.com">mailto:skadldldl123@gmail.com</a>
</footer>
<!-- //footer -->
</body>
코드 설명
(이번것은 2번을 활용하여서 HTML내용이 슬라이드 2번과 똑같습니다.)
1.div태그인 slider__wrap은 전체 내용물을 이동 시켜줍니다.
(이번것도 align-items는 먹히지 않아서 height값을 부여해서 가운데로 이동하였습니다.)
2.div태그인 slider__img는 이제 보여줄 width만큼만 주고 overflow로 잘라줍니다.
(주렁 주렁 달고온 것들을 눈에 안보여주게 하고. 그것들을 translateX로 width값만큼 이동을 시켜주면 됩니다.)
3.div태그인 slider__inner는 .slider의 모든 width값을 합한만큼 줍니다.
(display:flex를 주면 좌->우로 주렁 주렁 달고 옵니다. + flex-wrap 필수)
4.div태그인 slider는 각각 width를 줍니다.
JAVASCRIPT코드
<script>
// javascript
// 트랜지션 설정
// sliderInner.style.transition = "all 0.6s";
// setInterval(() => {
// currentIndex = (currentIndex+1) % sliderCount;
// sliderInner.style.transform = "translateY(" + (-520 * currentIndex) + "px)";
// // sliderInner[index].style.transform = translateX("-800px"); //-800 * 1
// // sliderInner[index].style.transform = translateX("-1600px"); //-800 * 2
// // sliderInner[index].style.transform = translateX("-2400px"); //-800 * 3
// // sliderInner[index].style.transform = translateX("-3200px"); //-800 * 4
// // sliderInner[index].style.transform = translateX("-0px"); //-800 * 0
// }, 500);
</script>
<!-- GSAP -->
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/gsap.min.js"></script>
<script>
setInterval(() => {
currentIndex = (currentIndex + 1) % sliderCount;
gsap.to(sliderInner, {
y: -520 * currentIndex,
duration: 1,
ease: "elastic.out"
});
}, 500);
</script> -->
<!-- jQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js"></script>
<script>
setInterval(() => {
// currentIndex = (currentIndex + 1) % document.querySelector(".slider").length;
currentIndex = (currentIndex + 1) % $(".slider").length;
// jquery는 translate을 지원하지 않음
$(".slider__inner").css("position", "relative");
$(".slider__inner").animate( {top: -520 * currentIndex}, 1000, "easeOutElastic");
}, 1000);
</script>
코드 설명
1.
// 선택자
const sliderWrap = document.querySelector(".slider__wrap");
const sliderImg = sliderWrap.querySelector(".slider__img"); //보여지는 영역
const sliderInner = sliderWrap.querySelector(".slider__inner"); //움직이는 영역
const slider = sliderWrap.querySelectorAll(".slider"); //개별 영역
querySelector로 클래스, 아이디, 태그를 찾습니다.
2.
let currentIndex = 0; //현재 보이는 이미지
let sliderCount = slider.length; //이미지 갯수
let sliderInterval = 3000; //이미지 간격 시간
- currentIndex는 이제 현재 보여줄 이미지로 opacity로 숨겨주고 난 다음에 데이터를 저장시켜서 이동하는 효과를 줄 예정입니다.
- sliderCount는 div태그인 .slider 이미지의 전체 갯수인비다.
- sliderInterval은 setInterval를 동작시킬때의 시간입니다.(3초)
3.JAVASCRIPT로 활용하기
<script>
// javascript
// 트랜지션 설정
sliderInner.style.transition = "all 0.6s";
setInterval(() => {
currentIndex = (currentIndex+1) % sliderCount;
sliderInner.style.transform = "translateY(" + (-520 * currentIndex) + "px)";
}, 500);
</script>
이번꺼는 위로 이동을 해야합니다.
그래서 div태그인 .slider__inner가 갖고있는 display: flex를 주석처리해서 사용을 못하게 합니다.
그리고 슬라이드 2번에서의 translatY로 수정만 하면 끝납니다.~
4.GSAP 활용하기
<!-- GSAP -->
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/gsap.min.js"></script>
<script>
setInterval(() => {
currentIndex = (currentIndex + 1) % sliderCount;
gsap.to(sliderInner, {
y: -520 * currentIndex,
duration: 1,
ease: "elastic.out"
});
}, 500);
</script> -->
(이것도 간단합니다. 슬라이드 2번에서 썻던 코드 x를 y로 바꿔주면 끝입니다.)
- div태그인 .slider__inner가 갖고있는 display: flex를 주석처리해서 사용을 못하게 합니다.
- 3번의 코드를 그대로 사용하고. 전체 크기를 담고 있는 div태그인 sliderInner를 가져옵니다.
- 그리고 translateY로 -520 * currentIndex(1,2,3,4,5)를 곱해주면 됩니다.
- gsap에서 translatY는 y입니다.
5. Jquery 활용하기
<!-- jQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js"></script>
<script>
setInterval(() => {
// currentIndex = (currentIndex + 1) % document.querySelector(".slider").length;
currentIndex = (currentIndex + 1) % $(".slider").length;
// jquery는 translate을 지원하지 않음
$(".slider__inner").css("position", "relative");
$(".slider__inner").animate( {top: -520 * currentIndex}, 1000, "easeOutElastic");
}, 1000);
</script>
음..이것도 슬라이드 2번에서 사용했던 코드를 그냥 top으로 바꿔주면 되네요
