scrollTop 값에 따른 엘리먼트의 값
시작하며
로직을 조금씩 기록해 두어 향후 있을 개발에 불필요한 시간을 사용하지 않는데 목적이 있다.
엘리먼트가 화면에 표시되는 순간부터 사라질때 까지를 확인 할 수 있는 방법이다.
상황
- 위 이미지의 파란색 화면 부분은 윈도우즈 브라우저이다. 그리고 하단의 분홍색은 스크롤 해야지 볼수 있는 컨텐츠 영역이다.
- 분홍색 컨텐츠가 화면 하단에 나타나기 시작하면서 부터 화면위로 사라질때까지, 혹은 그 반대일 경우를 확인한다.
구현.
function activeView () {
var $ele = $( "#viewElement" ), // 체크할 엘리먼트
$win = $( window ), // 윈도우
$output = $( "#activePercent" ); // 동작 확인을 위한 출력 값 노출 영역(input)
var checker = function(){
var sPoint = $ele.data( "offsetTop" ) - $win.height(), // 시작값.
ePoint = $ele.data( "offsetBottom" ), // 종료값.
// 해당 영역이 화면에 들어와서 나가기까지 몇퍼센트 진행되었는지 값을 산출.
percent = Math.abs(
( ePoint - $win.scrollTop() ) / ( ePoint - sPoint ) * 100
);
if ( sPoint < $win.scrollTop() && ePoint > $win.scrollTop() ) {
$output.val( percent ); // 화면안에 있음.
} else {
$output.val( "out" ); // 화면인에 없음.
}
};
// 엘리먼트에 위치값을 최초에 저장.
$ele.data({
"offsetTop" : $( $ele ).offset().top,
"offsetBottom" : $( $ele ).offset().top + $( $ele ).height()
});
// 윈도우에 스크롤 이벤트 추가.
$win.on( "scroll", checker );
}
// 이미지 로드 등의 이슈로 인해 최초 offsetTop 값을 정확히 저장하지 못할 수 있으므로,
// load 된 이후에 함수 실행.
$( window ).on( "load", function(){
activeView();
} );
- 영역이 안으로 들어왔는지 확인하기 위해, 퍼센트를 구해 input 필드에 노출 시켰다.
- 이곳 에서 확인 할 수 있다.
마치며
항상 만들어 놓고 나면 간단한 공식인데, 막상 시작할때 고민을 많이 하게 된다.
같은 로직을 매번 고민하지 않기를…