$(function() { checkPosition() $(window).load(function() { // 윈도우라면 계산이 느리기 때문에, scroll 이벤트뿐이라면 오른쪽 커럼이 후터에 입을 수 있기 때문에, setInterval에서 상시 재계산. // 스크롤, 리사이즈시에 즉시 포지션 확인을 위해서 이벤트 취득. $(window).on('scroll resize', checkPosition); setInterval(checkPosition, 100); }); function checkPosition() { var main = $('.wrap'); var rightColumn = $('.aside'); var contentsFooter = $('#footer'); // main보다 오른쪽 컬럼이 길면 아무것도 하지 않는다. if (main.height() <= rightColumn.height()) { return false; } // 후터 상부의 좌표와 고정 개시 위치. // 높이나 위치는 JS의 실행 타이밍에 따라 바뀌므로 매번 계산한다. var footerTop = contentsFooter.offset().top; var fixStart = 228 + rightColumn.height(); //rightColumn.offset().top = 228 // 표시 영역 높이 var windowHeight = $(window).innerHeight(); // 화면 스크롤 영역을 취득. (올라간 높이만큼의 값) var windowPos = $(window).scrollTop() + windowHeight; // console.log('fixStart :' + fixStart); // console.log('windowPos :' + windowPos); // var documentHeight = $(document).height(); // 화면 스크롤 영역이 문서의 높이보다 클 경우는 영역을 문서의 높이로. // if (windowPos > documentHeight) { // windowPos = documentHeight; // console.log('화면 스크롤 영역이 문서의 높이보다 커'); // } //고정되었을때 좌측위치값 설정 var rightColumnFixed = rightColumn.addClass('fixed'); var fixedLeft = $('.section.article').offset().left + $('.wrap > .inner > div').width() // 화면이 걸리지 않은 경우. if (windowPos <= fixStart) { rightColumn.removeClass('fixed'); rightColumnFixed.css('left', ''); // 화면이 footer까지 도달하고 있지 않은 경우. } else if (windowPos <= footerTop) { rightColumn.removeClass('fixedEnd'); rightColumn.addClass('fixed'); rightColumnFixed.css('left', fixedLeft); rightColumnFixed.css('bottom', ''); // 화면이 footer에 도달했을 경우. } else if (windowPos >= footerTop) { rightColumnFixed.css('bottom', (windowPos - footerTop)); rightColumnFixed.css('left', fixedLeft); } }; }());