무한 스크롤을 구현할 때, 추가 데이터를 불러오는 시점은, 마지막 컨텐츠가 끝나는 시점이어야 할 것 입니다.
무한 스크롤을 구현하면서,
문서 총 높이에서 현재 뷰 높이를 뺀 값과, 스크롤된 높이를 비교하여, 문서의 마지막을 판단했습니다.
사용한 코드 :
const {scrollHeight,clientHeight,scrollTop} = document.documentElement;
const degree = scrollTop / (scrollHeight-clientHeight);
if ( degree == 1 ) { ... }
혹은
const {scrollHeight,clientHeight,scrollTop} = document.documentElement;
if ( clientHeight + scrollTop === scrollHeight ) { ... }
무한 스크롤의 장점이 극대화 되는 모바일 환경은 PC보다 페이지 확대 축소의 사용이 빈번합니다.
하지만, 페이지 확대 축소에 따라, 문서의 끝에 도달했음에도,
clientHeight + scrollTop
와 scrollHeight
가 일치하지 않는 문제가 발생했습니다.
때문에, 다양한 사이즈와, 스크롤에 관련된 값들을 정리할 필요가 있다고 느꼈습니다.
client~
element.clinetHeight
와 element.clientWidth
는
패딩을 포함한 사이즈를 가져옵니다.
보더, 스크롤바를 제외한 실제 내부 컨텐츠가 차지하는 크기를 알 수 있습니다.
offset~
element.offsetHeight
와 element.offsetWidth
는
패딩,보더,스크롤바를 포함한 사이즈를 가져옵니다.
엘리먼트가 화면에서 차지하는 크기를 알 수 있습니다.
element.scrollHeight
와 element.scrollWidth
는scrollTop
element.scrollTop
을 통해, 가장 위에서 부터 얼마나 스크롤 되었나 알 수 있습니다.
전체 문서 맨 위에서 현재 View까지의 거리이기 때문에, 아래 사진의 스크롤 된 높이와 같습니다.
scrollLeft
element.scrollLeft
는 가장 왼쪽에서 얼마나 스크롤 되었나 알 수 있습니다.
이제, 확대 축소에 의해 정확한 값이 나오지 않았던 이유를 알아봅니다.
확대, 축소를 하게되면 앞서 살펴 본 사이즈가 변하게 됩니다.
확대를 하면, 크게 보이는 대신 볼 수 있는 영역이 줄어들어
clientHeight
와 스크롤 단위가 줄어들게 됩니다.
똑같이 스크롤 하더라도, 더 작은 부분을 확인하기 때문에 스크롤의 단위가 작아집니다
때문에, 끝까지 스크롤을 했을 때의 소수점 수준의 오차가 발생하였습니다.
하지만, scrollTop + clientHeight
가 scrollHeight
보다
큰 경우만 발생하여, 다음과 같이 조건을 수정하였습니다.
if ( scrollTop + clientHeight >= scrollHeight ) {...}