스크롤을 트리거로 요소의 좌표를 특정 구간동안 제어하는 로직을 통해
window.scrollY
,.offset()
등 요소의 좌표를 반환하거나 제어하는 메서드를 심화학습한다.
<body>
<div class="container">
<div class="bg"></div>
<i class="far fa-angry smile"></i>
</div>
</body>
body {
height: 1200px;
display: flex;
align-items: center;
justify-content: center;
}
.container {
width: 500px;
height: 500px;
display: flex;
align-items: center;
}
div {
width: 300px;
height: 300px;
position: absolute;
}
i {
font-size: 200px;
line-height: 300px;
position: relative;
}
.bg {
width: 193px;
height: 200px;
background: yellow;
border-radius: 50%;
position: absolute;
left: 200px;
}
$(function () {
//changing charactors position
//1. 스크롤 트리거
$(window).scroll(function () {
//2. 요소의 offset().top 값 받아서 변수 설정
let ElemTop = $('.smile ').offset().top;
//3. scroll값 / 요소의 top값
// 요소까지 도달하기 까지의 scroll 값의 비율을 0 ~ 1 까지 받아옴 ( 100분율 )
console.log('scroll 값 : ' + window.scrollY);
console.log('요소의 top 값: ' + ElemTop);
let moveTrue = window.scrollY / ElemTop;
console.log(moveTrue);
//4. 받아온 값으로 조건을 걸어 이동시킬 거리에 곱하여 css를 제어한다.
if (moveTrue < 1) {
$('.smile').css({ left: moveTrue * 400 });
}
});
});
scroll() 메서드를 이용해 스크롤을 했을 때 작동시킬 코드를 작성한다.
페이지 가장 위부터 요소까지의 거리를 (top값)을 받아 변수에 넣는다.
(scroll값 / 요소의 top값) 을 통해 요소까지 도달하기 까지의 scroll 값의 비율을 0 ~ 1 까지 받아온다. ( 100분율 )
이 값을 콘솔에 찍어보면 아래와같다.
( 508 / 508 == 1 )
이 코드가 이 로직의 핵심적인 부분이다. 스크롤위치를 요소의 위치로 나누어 요소가 도달하기 까지 사이를 백분율로 만든다.
이 것을 통해 요소를 일정 구간을 일정한 값으로 제어할 수 있게 된다.
moveTrue
는 0 ~ 1 까지의 수가 되는데 만약 정해둔 구간을 지나 1이 넘어가게 되었을 때 이동을 멈추게 하기위해 if (moveTrue < 1)
을 걸어 준다.
그리고 css에서 요소를 이동시킬 거리에 moveTrue
를 곱하여 실제로 이동시킨다.
이동거리는 left : 0
에서 시작해 left : 400
까지 설정되어 정해둔 구간에만 움직일 수 있게된다!