이 질문에 대한 30 개 이상의 답변이 있으며 그중 아무도 내가 사용했던 놀랍도록 간단하고 순수한 JS 솔루션을 사용하지 않습니다. 다른 많은 사람들이 추진하고 있으므로이 문제를 해결하기 위해 jQuery를로드 할 필요가 없습니다.
요소가 뷰포트 내에 있는지 확인하려면 먼저 본체 내의 요소 위치를 결정해야합니다. 한때 생각했던 것처럼 우리는 이것을 재귀 적으로 할 필요가 없습니다. 대신을 사용할 수 있습니다 element.getBoundingClientRect().
pos = elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top;
이 값은 객체의 상단과 본체의 상단 사이의 Y 차이입니다.
그런 다음 요소가 뷰 내에 있는지 확인해야합니다. 대부분의 구현은 전체 요소가 뷰포트 내에 있는지 묻기 때문에 우리가 다룰 것입니다.
우선, 창의 상단 위치는 다음과 같습니다 window.scrollY..
창의 높이를 상단 위치에 추가하여 창의 하단 위치를 얻을 수 있습니다.
var window_bottom_position = window.scrollY + window.innerHeight;
요소의 최상위 위치를 얻는 간단한 함수를 만들 수 있습니다.
function getElementWindowTop(elem){
return elem && typeof elem.getBoundingClientRect === 'function' ? elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top : 0;
}
이 함수는 창 내에서 요소의 최상위 위치를 반환하거나 메서드 0가있는 요소 이외의 요소를 전달 하면 반환 됩니다 .getBoundingClientRect(). 이 방법은 오랫동안 사용되어 왔으므로 브라우저가 지원하지 않는 것에 대해 걱정할 필요가 없습니다.
이제 요소의 최상위 위치는 다음과 같습니다.
var element_top_position = getElementWindowTop(element);
그리고 또는 요소의 하단 위치는 다음과 같습니다.
var element_bottom_position = element_top_position + element.clientHeight;
이제 요소의 하단 위치가 뷰포트의 상단 위치보다 낮은 지 확인하고 요소의 상단 위치가 뷰포트의 하단 위치보다 높은지 확인하여 요소가 뷰포트 내에 있는지 확인할 수 있습니다.
if(element_bottom_position >= window.scrollY
&& element_top_position <= window_bottom_position){
//element is in view
else
//element is not in view
여기에서 in-view요소에 클래스 를 추가하거나 제거하는 논리를 수행 한 다음 나중에 CSS의 전환 효과로 처리 할 수 있습니다.
다른 곳에서는이 솔루션을 찾지 못했다는 사실에 놀랐지 만 이것이 가장 깨끗하고 효과적인 솔루션이며 jQuery를로드 할 필요가 없다고 생각합니다!