이 질문에 대한 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를로드 할 필요가 없다고 생각합니다!