스크롤이 될때마다, 현재 보고있는 스크롤섹션을 지정해주었으면 이제 지정된 스크롤섹션마다의 애니메이션을 적용해주어야 한다.
그러기위해서는 다음과 같은 값이 필요하다.
- 해당 스크롤섹션 내에서 스크롤이 어느 정도 내려갔는 지
- 애니메이션에 필요한 스타일 시작지점과 끝지점
다음과 같이 변수명을 설정해준 뒤, 시작값, 마지막값, 시작지점과 끝지점을 할당해준다.
messageA_translateY_in: [20, 0, { start: 0.15, end: 0.2 }]
위의 변수명을 통하여 다음과 같이 해석할 수 있다.
- translateY로 20%에서 0%로 움직이게되고, 해당 스크롤섹션에서 15%에서 시작해 20%에서 끝이난다.
calcValues라는 함수를 만들어, 특정 css값을 주는 계산을 실행해준다.
function calcValues(values, currentYOffset) {
let rv;
//현재 씬의 스크롤된 비율
const scrollHeight = sceneInfo[currentScene].scrollHeight;
const scrollRatio = currentYOffset / scrollHeight;
if (values.length === 3) {
//start ~ end 사이에 애니메이션 실행
const partScrollStart = values[2].start * scrollHeight;
const partScrollEnd = values[2].end * scrollHeight;
const partScrollHeight = partScrollEnd - partScrollStart;
if (
currentYOffset >= partScrollStart &&
currentYOffset <= partScrollEnd
) {
rv =
((currentYOffset - partScrollStart) / partScrollHeight) *
(values[1] - values[0]) +
values[0];
} else if (currentYOffset < partScrollStart) {
rv = values[0];
} else if (currentYOffset > partScrollEnd) {
rv = values[1];
}
} else {
rv = scrollRatio * (values[1] - values[0]) + values[0];
}
return rv;
}
여기서 추가된 부분은 처음 특정 스크롤구간의 비율을 구하고자 할 때, 시작지점이전과 그 후에는 scrollRatio가 0 또는 1로 유지되기 때문에 시작지점 이전과 그 후 구간의 값을 처리해주는 조건문을 추가해주었다.
조건문은 아래와 같다. 위의 그림을 이해했다면, 아래 코드를 이해할 수 있다.
else if (currentYOffset < partScrollStart) {
rv = values[0];
} else if (currentYOffset > partScrollEnd) {
rv = values[1];
}
위에서 만든 calcValues함수를 통해서, 각 스크롤 구간때의 style값을 할당해주면 된다. 이 함수를 통해서, 스크롤이 실행될 때마다 동적으로 스타일값이 할당되게 된다.
if (scrollRatio <= 0.22) {
// in
objs.messageA.style.opacity = calcValues(
values.messageA_opacity_in,
currentYOffset
);
objs.messageA.style.transform = `translate3d(0, ${calcValues(
values.messageA_translateY_in,
currentYOffset
)}%, 0)`;
}
스크롤이 실행될때마다 위의 함수가 실행되면 우리가 원하는 애니메이션을 스크롤된 비율에 따라 실행시킬 수 있다.
(이것을 애니메이션이라고 해야되나..?)
각 태그들에게 줄 효과와 시작지점 등을 배열로 관리하는 새로운 방법을 배운 것 같다.
또한 css의 애니메이션이 아닌, 이렇게 직접 스크롤비율에 따른 애니메이션을 구현해보면서 JS에 대한 이해도가 훨씬 깊어진 것 같다.
'프로젝트 > 애플 웹사이트 클론' 카테고리의 다른 글
[ 애플 웹사이트 클론 ] 캔버스 드로우 애니메이션 적용하기 1 (0) | 2023.01.21 |
---|---|
[ 애플 웹사이트 클론 ] 비디오에 스크롤 애니메이션 적용하기 (0) | 2023.01.01 |
[ 애플 웹사이트 클론 ] 현재 스크롤 섹션에 따른 아이디값 부여 (0) | 2022.12.31 |
[ 애플 웹사이트 클론 ] 현재 스크롤 섹션 지정하기 (0) | 2022.12.31 |
[ 애플 웹사이트 클론 ] 스크롤 섹션 높이 세팅하기 (0) | 2022.12.24 |